Como calcular o termo delta de uma camada convolucional, dados os termos e pesos delta da camada convolucional anterior?

10

Estou tentando treinar uma rede neural artificial com duas camadas convolucionais (c1, c2) e duas camadas ocultas (c1, c2). Estou usando a abordagem de retropropagação padrão. No retrocesso, calculo o termo de erro de uma camada (delta) com base no erro da camada anterior, nos pesos da camada anterior e no gradiente da ativação em relação à função de ativação da camada atual. Mais especificamente, o delta da camada l se parece com isso:

delta(l) = (w(l+1)' * delta(l+1)) * grad_f_a(l)

Eu sou capaz de calcular o gradiente de c2, que se conecta a uma camada regular. Apenas multiplico os pesos de h1 pelo delta. Em seguida, reformulo essa matriz na forma de saída de c2, multiplico-a pelo gradiente da função de ativação e pronto.

Agora eu tenho o termo delta de c2 - que é uma matriz 4D de tamanho (featureMapSize, featureMapSize, filterNum, patternNum). Além disso, tenho os pesos de c2, que são uma matriz 3D de tamanho (filterSize, filterSize, filterNum).

Com esses dois termos e com o gradiente de ativação de c1, quero calcular o delta de c1.

Longa história curta:

Dado o termo delta de uma camada convolucional anterior e os pesos dessa camada, como computo o termo delta de uma camada convolucional?

cdwoelk
fonte

Respostas:

6

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 - 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 iyeu-1 1Neu-1 1mWWEuxeu

xEueu=uma=0 0m-1 1Wumayuma+Eueu-1 1
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 porE /y l i . Agora, queremos descobrir a dependência do erro em um dos pesos nas camadas anteriores: EyEueu=f(xEueu)fEE/yEueu onde temos a soma de toda expressão em quewaocorre, que sãoN-m. Note também que nós sabemos o último termo surge do fato de quex l i
EWuma=uma=0 0N-mExEueuxEueuWuma=uma=0 0N-mEWumayEu+umaeu-1 1

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: ExEueuWuma=yEu+umaeu-1 1
onde novamente o primeiro termo é o erro na camada anteriorefda função de ativação não linear.
ExEueu=EyEueuyEueuxEueu=EyEueuxEueuf(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:

δumaeu-1 1=EyEueu-1 1=uma=0 0m-1 1ExEu-umaeuxEu-umaeuyEueu-1 1=uma=0 0m-1 1ExEu-umaeuWumafeuEupped
xEueuyEueu-1 1feuEuppedT

Portanto, você pode apenas calcular o erro na próxima camada (agora em notação vetorial):

δeu=(Weu)Tδeu+1 1f(xeu)

δeu=vocêpsumampeue((Weu)Tδeu+1 1)f(xeu)
vocêpsumampeue

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

LeoW.
fonte