Як я обчислюю дельта-термін згорткового шару, враховуючи дельта-умови і ваги попереднього згорткового шару?


10

Я намагаюся тренувати штучну нейронну мережу з двома звивистими шарами (c1, c2) та двома прихованими шарами (c1, c2). Я використовую стандартний підхід для розмноження. У зворотному проході я обчислюю термін помилки шару (дельта) на основі похибки попереднього шару, ваги попереднього шару та градієнта активації щодо функції активації поточного шару. Більш конкретно, дельта шару 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.

Довга історія:

З огляду на дельта-член попереднього згорткового шару та ваги цього шару, як я обчислюю дельта-термін згорткового шару?

Відповіді:


6

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

Тут будемо вважати, що довжини є входами -го перегною. шар, - розмір ядра ваг що позначає кожну вагу а вихід - . Отже, ми можемо записати (відзначимо підсумок від нуля): де і функція активації (наприклад, сигмоїдальна). Маючи це під рукою, тепер ми можемо розглянути деяку функцію помилки та функцію помилки на згортковому шарі (той, який був у попередньому шарі), що задаєтьсяyl1Nl1mwwixl

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

waNmxilwa=yi+al1
Exil=Eyilyilxil=Eyilxilf(xil)
де знову перший член - помилка в попередньому шарі і нелінійна функція активації.f

Маючи всі необхідні сутності, тепер ми можемо обчислити помилку та ефективно її поширити на дорогоцінний шар: Зверніть увагу, що останній крок може зрозуміти легко, коли -s wrt -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/supervision/ConvolutionalNeuralNetwork/ http://andrew.gibiansky.com/blog/machine-learning/convolutional-neural-networks/

і для реалізації C ++ (без необхідності встановлення): https://github.com/nyanp/tiny-cnn#supported-networks

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.