Поширення градієнта через пропускні з'єднання ResNet


22

Мені цікаво, як градієнти розповсюджуються назад через нейронну мережу за допомогою модулів ResNet / пропускають з'єднання. Я бачив кілька запитань щодо ResNet (наприклад, нейромережа зі зв’язками пропускового шару ), але це запитує конкретно про зворотне поширення градієнтів під час тренування.

Основна архітектура тут:

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

Я читаю цю статтю « Вивчення залишкових мереж для розпізнавання зображень» , а в Розділі 2 вони розповідають про те, як одна з цілей ResNet - дозволити коротший / чіткіший шлях градієнта до розповсюдження назад до базового шару.

Чи може хтось пояснити, як градієнт протікає через такий тип мережі? Я не зовсім розумію, як операція додавання та відсутність параметризованого шару після додавання дозволяє краще розповсюджувати градієнт. Чи має щось спільне з тим, як градієнт не змінюється при проходженні через оператор додавання і якимось чином перерозподіляється без множення?

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


Просто ідіотське запитання: Чому ми передаємо х як пропускне з'єднання, а не обчислюємо зворотну (F (x)), щоб отримати х у кінці. Чи це причина складності обчислень?
Yash Kumar Atri

Я не зрозумів the gradient doesn't need to flow through the weight layers, чи можете ви це пояснити?
ану

Відповіді:


13

Add надсилає градієнт назад однаково на обидва входи. Ви можете переконатись у цьому, запустивши в тенсорфлоу таке:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    x1_tf = tf.Variable(1.5, name='x1')
    x2_tf = tf.Variable(3.5, name='x2')
    out_tf = x1_tf + x2_tf

    grads_tf = tf.gradients(ys=[out_tf], xs=[x1_tf, x2_tf])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        fd = {
            out_tf: 10.0
        }
        print(sess.run(grads_tf, feed_dict=fd))

Вихід:

[1.0, 1.0]

Отже, градієнт буде таким:

  • повертається до попередніх шарів у незмінному вигляді через з'єднання пропущеного шару, а також
  • передається до блоку з вагами та використовується для оновлення цих ваг

Редагувати: виникає питання: "що таке операція в точці, коли з'єднання шосе та блок нейронної сітки знову з'єднуються разом, внизу рисунка 2?"

Там відповідь: вони підсумовуються. Ви можете побачити це з формули рисунка 2:

вихідЖ(х)+х

Це говорить про те, що:

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

Редагувати 2:

Переписування трохи іншими словами:

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

Залишкові блоки дійсно змінюють градієнти, що течуть назад, але немає функцій «розчавлення» або «активації», через які градієнти протікають. Функції 'розчавлення' / 'активація' є причиною проблеми градієнта, що вибухає / зникає, тому, видаляючи їх із самої шини, ми значно зменшуємо цю проблему.

Редагування 3: Особисто я уявляю собі відновлювач у голові як наступну схему. Його топологічно ідентично малюнку 2, але чіткіше видно, можливо, як шина просто протікає через мережу, тоді як залишкові блоки просто натискають на неї значення та додають / видаляють невеликий вектор проти шини:

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


1
якщо градієнт також передається через вагові блоки (як і в звичайних мережах), то звідки вигода від відновлення? Звичайно, це дозволяє градієнту переходити безпосередньо до базового входу, але як це пропонує продуктивність, коли інший шлях все ще тренується як звичайний?
Саймон

3
Розумію. Таким чином, один градієнт стрибає прямо назад до x, інший поширюється через ваги назад до x. вони підсумовуються, коли вони досягають х через те, що х розділилося на 2 шляхи? якщо так, то градієнт все ще не змінюється, коли він рухається назад через ці шари?
Саймон

1
Градієнти протікають всю дорогу вниз, без змін. Однак кожен блок вносить власні зміни градієнта в стек після застосування оновлень ваги та генерування власного набору градієнтів. Кожен блок має і вхід, і вихід, і градієнти будуть витікати з входу, назад у градієнт "шосе".
Х'ю Перкінс

1
@RonakAgrawal додав редагування, що показує суму оператоїна з рисунка 2, і пояснюючи це
Х'ю Перкінс

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