CNN - Como funciona a retropropagação com compartilhamento de peso exatamente?

8

Considere uma Rede Neural Convolucional (CNN) para classificação de imagens. Para detectar recursos locais, o compartilhamento de peso é usado entre unidades na mesma camada convolucional. Nessa rede, os pesos do kernel são atualizados através do algoritmo de retropropagação.

Uma atualização para o peso do kernel hj na camada l seria o seguinte:

hjl=hjlηδRδhjl=hjlηδRδxjLδxjLδxjL1...δxjlδhjl

Como os pesos do kernel podem ser atualizados e ainda serem os mesmos (= compartilhados)?

Eu tenho 2 explicações possíveis:

  1. Os pesos da mesma camada, que são inicializados com o mesmo valor, permanecerão os mesmos (independentemente da entrada). Isso implicaria que a expressãoδRδhjl é o mesmo para todos esses pesos h1l para hJl. Isso não faz sentido, já quexjlé diferente para diferentes j's. Ou estou faltando alguma coisa aqui?

  2. Existe um truque, por exemplo, após a atualização da propagação de retorno, os pesos compartilhados são definidos para sua média.

EDIT A confusão que tive foi que não considerava que se um peso fosse compartilhado, seu parâmetrohjlaparece várias vezes na função de perda. Ao diferenciar porhjl, vários termos (considerando as entradas correspondentes) "sobreviverão". Portanto, as atualizações serão as mesmas.

Andi R
fonte

Respostas:

7

Eu acho que você está entendendo mal o que significa "compartilhamento de peso" aqui. Uma camada convolucional é geralmente composta de muitos "filtros", que geralmente são 2x2 ou 3x3. Esses filtros são aplicados em uma "janela deslizante" em toda a entrada da camada. O "compartilhamento de peso" está usando pesos fixos para esse filtro em toda a entrada. Isso não significa que todos os filtros são equivalentes.

Para ser concreto, vamos imaginar um filtro 2x2 F caminhando uma entrada 3x3 Xcom preenchimento, para que o filtro seja aplicado 4 vezes. Vamos denotar o filtro desenroladoβ.

X=[x11x12x13x21x22x23x31x32x33]

F=[w11w12w21w22]

β=[w11,w12,w21,w22]

FX=[β[x11,x12,x21,x22]β[x12,x13,x22,x23]β[x21,x22,x31,x32]β[x22,x23,x32,x33]]

"Compartilhamento de peso" significa que, quando aplicamos esse filtro 2x2 em nossa entrada 3x3, reutilizamos os mesmos quatro pesos dados pelo filtro em toda a entrada. A alternativa seria cada aplicativo de filtro com seu próprio conjunto de entradas (que seria realmente um filtro separado para cada região da imagem), fornecendo um total de 16 pesos ou uma camada densa com 4 nós, com 36 pesos.

Compartilhar pesos dessa maneira reduz significativamente o número de pesos que precisamos aprender, facilitando o aprendizado de arquiteturas muito profundas e, além disso, permite aprender recursos que são independentes da região em que a entrada está sendo considerada.

EDIT: Para motivar ainda mais, aqui está uma animação de um filtro 3x3 aplicado a uma entrada 5x5

insira a descrição da imagem aqui

David Marx
fonte
11
Obrigado, agora posso resumir uma questão mais simples: os pesos são representados por βaprendeu via propagação traseira?
precisa
Sim! Eles com certeza são.
David Marx
11
Como pode βser aprendido e ser o mesmo (ou seja, compartilhado) em toda a entrada? Como o algoritmo de retropropagação também considera a entrada, para 2 entradas diferentes, oβdeve ser atualizado de maneira diferente.
precisa
11
As derivadas parciais na atualização de peso são calculadas em relação aos pesos (β), não a entrada. Realmente não é diferente do backprop em um MLP.
David Marx
Concordo com David aqui: você confunde a entrada com pesos convoluções são operações simples em que um kernel é aplicado em uma imagem de entrada, como mostrado acima, e usando backprop, os pesos do kernel são atualizados de modo a minimizar a função de perda. sua ativação * taxa de variação da ativação em relação à soma ponderada da entrada * taxa de variação da soma ponderada de entradas taxa de variação dos pesos (pesos do kernel aqui).
Khwaja wisal
6

Não tenho certeza se você pode alterar as respostas aceitas, mas como a única resposta para sua pergunta sobre propagação traseira é sobre propagação direta, decidi tentar.

Essencialmente, você trata o delta do peso (δRδhjl) da mesma forma que faria com um delta de peso para um neurônio linear, mas treine-o uma vez para cada vez que sobrepor seu filtro (kernel) na entrada, tudo em uma única passagem de backprop. O resultado é a soma dos deltas para todas as superposições do seu filtro. Eu acho que na sua notação, isso seriaδRδhjl=i=1nxil1δRδxjl+1 Onde xl1 é uma entrada que foi multiplicada por hjl para uma de suas sobreposições durante a propagação direta e xl+1 é a saída que resultou dessa sobreposição.

Entre os dois resultados do backprop por meio de uma camada convolucional (deltas de parâmetros e deltas de entrada), parece que você está mais interessado em deltas de parâmetros ou, mais especificamente, nos deltas da matriz de peso (δRδhjl) Por uma questão de exaustividade, examinarei os dois, com o seguinte como nossa camada de exemplo:

Se você tiver um conjunto de entradas 1D [1,2,3]e um filtro [0.3,0.5] aplicada com passo 1, sem preenchimento, com desvio zero e sem função de ativação, a ativação do seu filtro teria a aparência de [10.3+20.5,20.3+30.5]=[1.3,2.1]. Quando você volta a essa camada em seu passe de backprop, digamos que os deltas de ativação usados ​​para seus cálculos sejam[0.1,0.2].

Deltas de peso:

Quando você apareceu no passe para frente, armazenou em cache suas entradas [1,2,3], vamos chamá-lo de A_prev, pois provavelmente é a ativação da sua camada anterior. Para cada sobreposição em potencial do seu filtro (nesse caso, você só pode sobrepor na entrada em dois locais [ 1,2 , 3] e [1, 2,3 ]), pegue essa fatia da entrada A_slice, multiplique cada elemento pela saída associada delta dZ e adicione-o ao seu peso delta dW para esta passagem. Neste exemplo, você adicionaria[10.1,20.1] dW para a primeira sobreposição e adicione [20.2,30.2]para a segunda sobreposição. No total, seu dW para essa camada convolucional neste passe de backprop é[0.3,0.4].

Deltas de viés:

O mesmo que para deltas de peso, mas apenas adicione seu delta de saída sem multiplicar pela matriz de entrada.

Deltas de entrada:

Reconstrua a forma da entrada para essa camada, chame-a de dA_prev, inicialize com zeros e percorra as configurações nas quais você sobrepôs o filtro na entrada. Para cada sobreposição, multiplique sua matriz de ponderação pelo delta de saída associado a essa sobreposição e adicione-a à fatia de dA_prev associada a essa sobreposição. Ou seja, a sobreposição 1 adicionará[0.30.1,0.50.1]=[0.03,0.05] para dA_prev resultando em [0.03,0.05,0], a sobreposição 2 adicionará [0.30.2,0.50.2]=[0.06,0.1], resultando em [0.03,0.01,0.1] para dA_prev.

Esta é uma fonte muito boa se você quiser ler a mesma resposta em termos diferentes: Link

longbowrocks
fonte
Obrigado, isso realmente responde à pergunta original ...
Yan rei Yin