Как рассчитать дельта-член сверточного слоя, учитывая дельта-члены и веса предыдущего сверточного слоя?

10

Я пытаюсь обучить искусственную нейронную сеть с двумя сверточными слоями (с1, с2) и двумя скрытыми слоями (с1, с2). Я использую стандартный подход обратного распространения. При обратном проходе я вычисляю член ошибки слоя (дельта) на основе ошибки предыдущего слоя, весов предыдущего слоя и градиента активации относительно функции активации текущего слоя. Более конкретно, дельта слоя l выглядит следующим образом:

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

Я могу рассчитать градиент c2, который соединяется в обычный слой. Я просто умножаю вес h1 на его дельту. Затем я преобразовываю эту матрицу в форму вывода c2, умножаю ее на градиент функции активации и готово.

Теперь у меня есть дельта-член c2 - который представляет собой матрицу 4D размера (featureMapSize, featureMapSize, filterNum, patternNum). Кроме того, у меня есть веса c2, которые представляют собой трехмерную матрицу размера (filterSize, filterSize, filterNum).

С этими двумя членами и градиентом активации c1 я хочу вычислить дельту c1.

Короче говоря:

Учитывая дельта-член предыдущего сверточного слоя и вес этого слоя, как мне вычислить дельта-член сверточного слоя?

cdwoelk
источник

Ответы:

6

Сначала я получаю ошибку для сверточного слоя ниже для простоты для одномерного массива (ввода), который затем может быть легко перенесен в многомерный:

Здесь мы предполагаем, что длины являются входами го свода. layer, - это размер ядра весов обозначающий каждый вес через а результат равен . Следовательно, мы можем написать (обратите внимание на суммирование с нуля): где и функция активации (например, сигмоидальная). Имея это в виду, мы можем теперь рассмотреть некоторую функцию ошибки и функцию ошибки на сверточном слое (тот, что был в вашем предыдущем слое), заданный как Н л - 1 м ш ш Iyl1Nl1mwwixl

xil=a=0m1waya+il1
yil=f(xil)fEE/yil, Теперь мы хотим выяснить зависимость ошибки в одном из весов на предыдущем слое (-ях): где мы имеем сумму по всему выражению, в котором встречается , то есть . Также обратите внимание, что мы знаем, что последнее слагаемое вытекает из того факта, что который вы можете видеть из первого уравнения. Для вычисления градиента нам нужно знать первое слагаемое, которое можно вычислить следующим образом:
Ewa=a=0NmExilxilwa=a=0NmEwayi+al1

waNmxilwa=yi+al1
Exil=Eyilyilxil=Eyilxilf(xil)
где снова первый член - ошибка в предыдущем слое и - нелинейная функция активации.f

Имея все необходимые сущности, мы теперь можем рассчитать ошибку и эффективно распространить ее обратно на драгоценный слой: Обратите внимание, что последний шаг может быть понятным, когда записываете -s относительно -s. относится к транспонированному весу maxtrix ( ).

δal1=Eyil1=a=0m1Exialxialyil1=a=0m1Exialwaflipped
xilyil1flippedT

Поэтому вы можете просто вычислить ошибку в следующем слое (теперь в векторной записи):

δ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

Leow.
источник