зворотне розповсюдження в CNN


16

У мене є наступні CNN:

мережевий простір

  1. Почну з вхідного зображення розміром 5х5
  2. Тоді я застосовую згортку за допомогою ядра 2x2 і stride = 1, що створює карту характеристик розміром 4x4.
  3. Тоді я застосовую 2х2 макс-пулінг з кроком = 2, що зменшує мапу функції до розміру 2х2.
  4. Тоді я застосовую логістичну сигмоїду.
  5. Потім один повністю з’єднаний шар з 2 нейронами.
  6. І вихідний шар.

Для простоти, припустимо, що я вже завершив пропуск вперед і обчислив δH1 = 0,25 і δH2 = -0,15

Тож після повного переходу вперед і частково завершеного проходу назад моя мережа виглядає так:

мережа після прямого проходу

Тоді я обчислюю дельти для нелінійного шару (логістичної сигмоїди):

δ11=(0.25∗0.61+−0.15∗0.02)∗0.58∗(1−0.58)=0.0364182δ12=(0.25∗0.82+−0.15∗−0.50)∗0.57∗(1−0.57)=0.068628δ21=(0.25∗0.96+−0.15∗0.23)∗0.65∗(1−0.65)=0.04675125δ22=(0.25∗−1.00+−0.15∗0.17)∗0.55∗(1−0.55)=−0.06818625

Потім я розповсюджую дельти на шар 4x4 і встановлюю всі значення, відфільтровані за допомогою максимального об'єднання до 0, а карта градієнта виглядає так:

введіть тут опис зображення

Як оновити ваги ядра звідти? І якщо в моїй мережі був ще один згортковий шар до 5x5, то які значення я повинен використовувати для оновлення ваг ядра? І в цілому, чи правильний мій розрахунок?


Поясніть, будь ласка, що вас бентежить. Ви вже знаєте, як зробити похідну від максимуму (усе дорівнює нулю, за винятком того, де значення є максимальним). Отже, забудемо макс-пул. Ваша проблема у згортанні? Кожен патч згортки матиме свої похідні, це повільний обчислювальний процес.
— Рікардо Крус

Найкраще джерело - це книга з глибокого навчання - правда, не просто читати :). Перше згортання - це те саме, що розділити зображення в патчах, а потім застосувати звичайну нейронну мережу, де кожен піксель підключений до кількості "фільтрів", які мають вагу.
— Рікардо Крус

1
По суті, ваше питання, як регулюється вага ядра за допомогою зворотного розповсюдження?
— JahKnows

@JahKnows ..і як обчислюються градієнти для згорткового шару, враховуючи приклад, про який йдеться.
— koryakinp

Чи є функція активації, пов’язана з вашими згортковими шарами?
— JahKnows

Відповіді:


10

У згортці застосовується принцип розподілу ваги, який суттєво ускладнить математику, але спробуємо пройти через бур’яни. Більшу частину своїх пояснень я черпаю з цього джерела .


Вперед пропуск

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

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

k1k2k1=k2=2x0,0=0.25mn

Зворотне поширення

Припустимо, що ви використовуєте середню квадратичну помилку (MSE), визначену як

E=12∑p(tp−yp)2

ми хочемо визначити

∂E∂wm′,n′lm′n′w0,01=−0.13HK

(H−k1+1)(W−k2+1)

44w0,01=−0.13x0,01=0.25

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2∂E∂xi,jl∂xi,jl∂wm′,n′l

Це повторюється по всьому вихідному простору, визначає помилку, яку вносить результат, а потім визначає коефіцієнт внеску ваги ядра стосовно цього виводу.

Назвемо внесок у помилку з дельти вихідного простору для простоти та відслідковуємо помилку, що розповсюджується,

∂E∂xi,jl=δi,jl

Внесок від ваг

Згодження визначається як

xi,jl=∑m∑nwm,nloi+m,j+nl−1+bi,jl

таким чином,

∂xi,jl∂wm′,n′l=∂∂wm′,n′l(∑m∑nwm,nloi+m,j+nl−1+bi,jl)

m=m′n=n′

∂xi,jl∂wm′,n′l=oi+m′,j+n′l−1

Потім повернемося до нашого помилки

∂E∂wm′,n′l=∑i=0H−k1∑j=0W−k2δi,jloi+m′,j+n′l−1

Стохастичний градієнтний спуск

w(t+1)=w(t)−η∂E∂wm′,n′l

Порахуємо деякі з них

import numpy as np
from scipy import signal
o = np.array([(0.51, 0.9, 0.88, 0.84, 0.05), 
              (0.4, 0.62, 0.22, 0.59, 0.1), 
              (0.11, 0.2, 0.74, 0.33, 0.14), 
              (0.47, 0.01, 0.85, 0.7, 0.09),
              (0.76, 0.19, 0.72, 0.17, 0.57)])
d = np.array([(0, 0, 0.0686, 0), 
              (0, 0.0364, 0, 0), 
              (0, 0.0467, 0, 0), 
              (0, 0, 0, -0.0681)])

gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')

масив ([[0,044606, 0,094061], [0,011262, 0,068288]])

∂E∂w


Будь ласка, дайте мені знати, чи є помилки у виведенні.


Оновлення: виправлений код


∂E∂wm′,n′l

1
gradient = signal.convolve2d(np.rot90(np.rot90(d)), o, 'valid')
— Sun Bee

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