Сначала я получаю ошибку для сверточного слоя ниже для простоты для одномерного массива (ввода), который затем может быть легко перенесен в многомерный:
Здесь мы предполагаем, что длины являются входами го свода. layer, - это размер ядра весов обозначающий каждый вес через а результат равен .
Следовательно, мы можем написать (обратите внимание на суммирование с нуля):
где и функция активации (например, сигмоидальная). Имея это в виду, мы можем теперь рассмотреть некоторую функцию ошибки и функцию ошибки на сверточном слое (тот, что был в вашем предыдущем слое), заданный как Н л - 1 м ш ш Iyl−1Nl−1mwwixl
xli=∑a=0m−1wayl−1a+i
yli=f(xli)fE∂E/∂yli, Теперь мы хотим выяснить зависимость ошибки в одном из весов на предыдущем слое (-ях):
где мы имеем сумму по всему выражению, в котором встречается , то есть . Также обратите внимание, что мы знаем, что последнее слагаемое вытекает из того факта, что который вы можете видеть из первого уравнения.
Для вычисления градиента нам нужно знать первое слагаемое, которое можно вычислить следующим образом:
∂E∂wa=∑a=0N−m∂E∂xli∂xli∂wa=∑a=0N−m∂E∂wayl−1i+a
waN−m∂xli∂wa=yl−1i+a∂E∂xli=∂E∂yli∂yli∂xli=∂E∂yli∂∂xlif(xli)
где снова первый член - ошибка в предыдущем слое и - нелинейная функция активации.
f
Имея все необходимые сущности, мы теперь можем рассчитать ошибку и эффективно распространить ее обратно на драгоценный слой:
Обратите внимание, что последний шаг может быть понятным, когда записываете -s относительно -s. относится к транспонированному весу maxtrix ( ).
δl−1a=∂E∂yl−1i=∑a=0m−1∂E∂xli−a∂xli−a∂yl−1i=∑a=0m−1∂E∂xli−awflippeda
xliyl−1iflippedT
Поэтому вы можете просто вычислить ошибку в следующем слое (теперь в векторной записи):
δl=(wl)Tδl+1f′(xl)
который становится для сверточного и подвыборочного слоя:
где Операция распространяет ошибку через слой максимального пула.
δl=upsample((wl)Tδl+1)f′(xl)
upsample
Пожалуйста, не стесняйтесь добавлять или исправлять меня!
Для ссылок смотрите:
http://ufldl.stanford.edu/tutorial/supervised/ConvolutionalNeuralNetwork/
http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/
и для реализации C ++ (без необходимости установки):
https://github.com/nyanp/tiny-cnn#supported-networks