Primeiro, deduzo o erro de uma camada convolucional abaixo para simplificar uma matriz unidimensional (entrada) que pode ser facilmente transferida para uma multidimensional:
Assumimos aqui que de comprimento N são as entradas da l - 1ª convés. layer, m é o tamanho do núcleo de pesos w, denotando cada peso por w ie a saída é x l .
Portanto, podemos escrever (observe a soma do zero): x l i = m - 1 ∑ a = 0 w a y l - 1 a + i
onde y l iyl - 1Nl - 1mWWEuxeu
xeuEu= ∑a = 0m - 1Wumayl - 1a + i
e
f a função de activação (por exemplo sigmoidal). Com isso em mãos, podemos considerar agora a função de erro
E e a função de erro na camada convolucional (a da camada anterior) fornecida por
∂ E / ∂ y l i . Agora, queremos descobrir a dependência do erro em um dos pesos nas camadas anteriores:
∂ EyeuEu= f( xeuEu)fE∂E/ ∂yeuEu
onde temos a soma de toda expressão em que
waocorre, que são
N-m. Note também que nós sabemos o último termo surge do fato de que
∂x l i∂E∂Wuma= ∑a = 0N- m∂E∂xeuEu∂xeuEu∂Wuma= ∑a = 0N- m∂E∂Wumayeu- 1i + a
WumaN- m qual você pode ver a partir da primeira equação.
Para calcular o gradiente, precisamos conhecer o primeiro termo, que pode ser calculado por:
∂E∂xeuEu∂Wuma= yl - 1i + a
onde novamente o primeiro termo é o erro na camada anterior
efda função de ativação não linear.
∂E∂xeuEu= ∂E∂yeuEu∂yeuEu∂xeuEu= ∂E∂yeuEu∂∂xeuEuf( xeuEu)
f
Tendo todas as entidades necessárias, agora podemos calcular o erro e propagá-lo de volta com eficiência para a camada preciosa:
δl - 1uma= ∂E∂yl - 1Eu= ∑a = 0m - 1∂E∂xeueu - um∂xeueu - um∂yl - 1Eu= ∑a = 0m - 1∂E∂xeueu - umWfl i p p e duma
xeuEuyl - 1Eufl i p p e dT
Portanto, você pode apenas calcular o erro na próxima camada (agora em notação vetorial):
δeu= ( weu)Tδl + 1f′( xeu)
δeu= u p s a m p l e ( ( weu)Tδl + 1) f′( xeu)
u p s a m p l e
Por favor, sinta-se livre para adicionar ou me corrigir!
Para referências, consulte:
http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/
http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/
e para uma implementação C ++ (sem necessidade de instalação):
https://github.com/nyanp/tiny-cnn#supported-networks