Como a retropropagação funciona em uma rede neural siamesa?

13

Estudei a arquitetura da rede neural siamesa introduzida por Yann LeCun e seus colegas em 1994 para o reconhecimento de assinaturas ( “Verificação de assinatura usando uma rede neural siamese com atraso de tempo” .pdf , NIPS 1994)

Entendi a idéia geral dessa arquitetura, mas realmente não consigo entender como a retropropagação funciona nesse caso. Não consigo entender quais são os valores-alvo da rede neural, que permitirão que a retropropagação defina adequadamente os pesos de cada neurônio.

Imagem da “Rede Siamesa Probabilística para Representações de Aprendizagem” de Chen Liu (Universidade de Toronto 2013).

Nesta arquitetura, o algoritmo calcula a semelhança de cosseno entre as representações finais das duas redes neurais. O artigo afirma: "A saída desejada é para um pequeno ângulo entre as saídas das duas sub-redes (f1 e f2) quando são apresentadas assinaturas genuínas. e um grande ângulo se uma das assinaturas for uma falsificação ".

Eu realmente não consigo entender como eles poderiam usar uma função binária (semelhança de cosseno entre dois vetores) como alvo para executar a retropropagação.

Como a retropropagação é calculada nas redes neurais siamesas?

DavideChicco.it
fonte
não consigo baixar o documento .... você tem outra fonte ou caixa de depósito?
Brethlosze 30/05
1
Arquivo do NIPS: papers.nips.cc/paper/…
Yannis Assael

Respostas:

11

Ambas as redes compartilham arquiteturas semelhantes e, porém, são limitadas a ter os mesmos pesos que a publicação descreve na seção 4 [1].

Seu objetivo é aprender recursos que minimizem a semelhança de cosseno entre seus vetores de saída quando as assinaturas são genuínas e maximizem quando forjadas (esse também é o objetivo do backprop, mas a função de perda real não é apresentada).

cos(A,B)=ABABA,B

Você não deve alterar a camada de saída, ela consiste em neurônios treinados com valores lineares e é uma abstração de nível superior da sua entrada. Toda a rede deve ser treinada em conjunto. Ambas as saídas e são passadas por uma função que gera sua semelhança de cosseno ( se forem semelhantes e se não forem). Dado isso, e que temos dois conjuntos de tuplas de entrada , um exemplo da função de perda possível mais simples com a qual você poderia treinar poderia ser:O1O2cos(O1,O2)10XForged,XGenuine

L=(xA,xB)XForgedcos(xA,xB)(xC,xD)XGenuinecos(xC,xD)

Depois de treinar sua rede, basta inserir as duas assinaturas e obter as duas saídas, passar para a função e verificar sua similaridade.cos(O1,O2)

Finalmente, para manter os pesos de rede idênticos, existem várias maneiras de fazer isso (e elas também são usadas em redes neurais recorrentes); Uma abordagem comum é calcular a média dos gradientes das duas redes antes de executar a etapa de atualização do Gradient Descent.

[1] http://papers.nips.cc/paper/769-signature-verification-using-a-siamese-time-delay-neural-network.pdf

Yannis Assael
fonte
Sei que o objetivo é minimizar a semelhança do cosseno, mas não consigo entender o que devo inserir na camada de saída da minha rede neural. Quando crio a rede neural, coloquei os alvos na última camada de saída. Se eles são valores, tudo bem. Mas se o destino é uma função, onde encontro os valores a serem preenchidos? Obrigado
DavideChicco.it
Eu atualizei minha resposta. Sua camada de saída será apenas outra camada normal que ela gera para a função de similaridade de cosseno. As duas redes conectadas à função de similaridade de cosseno devem ser treinadas juntas contra um critério de perda. Por fim, sugeri a perda mais simples que você poderia ter nesse caso.
Yannis Assael
1
Obrigado. Acho que percebi meu problema: é a implementação dessa arquitetura de rede neural no Torch7. Aqui, antes do treinamento e do teste, durante a construção da rede neural, preciso especificar muitas coisas, incluindo os valores do conjunto de dados de entrada e os valores da camada de destino de saída . No passado, lidei com problemas supervisionados que sempre tinham valores fixos da camada de destino de saída (por exemplo, rótulos verdadeiros / falsos ou valores no intervalo [0, 1]). Mas desta vez é diferente: a camada de saída é uma função que depende de dois valores que serão computados durante o treinamento. Isso está correto?
DavideChicco.it
Exatamente desta vez você tem valores lineares na camada de saída não binários (portanto, é apenas a saída do neurônio). Além disso, você não possui valores de destino de saída diretos nesse caso, mas possui uma função de perda para otimizar. Finalmente, a camada de saída é a saída de neurônios (o número de unidades é definido pela arquitetura do modelo e é referenciado no artigo). Os neurônios, dependendo da função de ativação escolhida (tanh, sigmóide, etc), têm ativações lineares e não binárias [-1,1] ou [0,1], respectivamente. noutputnoutput
Yannis Assael
Obrigado @iassael. Você tem alguma idéia de como implementar isso no Torch7?
DavideChicco.it