Як спуск міні-партії градієнта оновлює ваги для кожного прикладу в партії?


12

Якщо ми обробляємо, наприклад, 10 прикладів у партії, я розумію, що ми можемо підсумовувати втрати за кожним прикладом, але як працює зворотне розмноження щодо оновлення ваг для кожного прикладу?

Наприклад:

  • Приклад 1 -> втрата = 2
  • Приклад 2 -> втрата = -2

Це призводить до середньої втрати 0 (E = 0), тож як це оновити кожну вагу і збільшитись? Чи просто через рандомізацію партій рано чи пізно ми «сподіваємось» сходимось? Також це не тільки обчислює градієнт для першого набору ваг для останнього обробленого прикладу?

Відповіді:


15

Спуск градієнта не зовсім працює так, як ви запропонували, але може виникнути подібна проблема.

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

Якщо ваша модель має 5 ваг, а у вас міні-партія розміром 2, то ви можете отримати це:

Приклад 1. Втрата = 2,gradients=(1.5,2.0,1.1,0.4,0.9)

Приклад 2. Втрата = 3,gradients=(1.2,2.3,1.1,0.8,0.7)

Середнє значення градієнтів у цій міні-партії розраховується, вони(1.35,0.15,0,0.2,0.8)

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

редагувати у відповідь на коментарі:

У моєму прикладі обчислюється середнє значення градієнтів. Для міні-партії розміром де ми обчислюємо втрати для кожного прикладу, ми маємо на меті отримати середній градієнт втрат щодо ваги .kLiwj

Як я написав це у своєму прикладі, я усереднював кожен градієнт на зразок:Lwj=1ki=1kLiwj

Код підручника, з яким ви пов’язані в коментарях, використовує Tensorflow для мінімізації середньої втрати.

Tensorflow прагне звести до мінімуму1ki=1kLi

Щоб мінімізувати це, він обчислює градієнти середньої втрати щодо кожної ваги та використовує градієнт-спуск для оновлення ваг:

Lwj=wj1ki=1kLi

Диференціація може бути внесена всередину суми, так що вона така сама, як вираз із підходу в моєму прикладі.

wj1ki=1kLi=1ki=1kLiwj


Готча. Ви все ще хочете, щоб середній збиток перевищив правильний batch_size? Я не впевнений, чи знайомий ви з tensorflow, але я намагався узгодити своє розуміння з цим навчальним посібником: tensorflow.org/get_started/mnist/beginners Ви можете бачити, що втрати усереднюються за пакетною (зменшити код коду). Я припускаю, що tensorflow зберігає внутрішні підрахунки / середні показники ваг?
обчислені вуглецем

1
@ так, ви маєте рацію. Так, ви праві, вони оцінюють збитки так, що, коли Tensorflow обчислює градієнти середньої втрати, він ефективно обчислює середнє значення градієнтів для кожної втрати. Я відредагую свою відповідь, щоб показати математику для цього.
Х'ю

Цікаво. Дякуємо за роз’яснення. Тож просто копати трохи глибше, чи розраховуються градієнти ваги на приклад під час проходу вперед та зберігаються чи вони обчислюються під час процесу оптимізації в тензорфлоу? Я припускаю, що я просто пропускаю "де" ці градієнти в тенсорфлоу? Я бачу перехід вперед і втрати, тому tensorflow робить ці градієнтні розрахунки / усереднення під капотом для мене?
обчислені вуглецем

1
@carboncomputed Це привабливість Tensorflow, він використовує символічну математику і може робити диференціацію під кришкою
Х'ю

Дякую за акуратну відповідь. Тим НЕ менше, я не зміг зрозуміти , як TF знає , як підтримати поширюється з середньою втратою , як показано в цьому прикладі , code line 170?
грішник

-1

Причина використовувати міні-партії полягає в тому, щоб мати хороший тренувальний приклад, таким чином, щоб можливий шум від нього зменшувався шляхом усереднення їх ефектів, але також це не повна партія, яка для багатьох наборів даних може зажадати величезної кількості пам'яті. Важливим фактом є те, що помилка, яку ви оцінюєте, - це завжди відстаньміж вашим прогнозованим результатом і реальним результатом: це означає, що він не може бути негативним, тому ви не можете мати, як ви сказали, помилки 2 і -2, які скасовуються, але вони замість цього стануть помилкою 4 Потім ви оцінюєте градієнт похибки по відношенню до всіх ваг, щоб ви могли обчислити, яка зміна ваг дозволила б зменшити її найбільше. Після цього ви зробите «крок» у цьому напрямку, виходячи з величини альфа-курсу навчання. (Це основні поняття, я не буду деталізувати питання про зворотне розповсюдження для глибокої NN) Після запуску цього тренінгу на вашому наборі даних протягом певної кількості епох, ви можете сподіватися, що ваша мережа зблизиться, якщо ваш крок навчання не надто великий для змусити його розходитися. Ви все ще можете досягти місцевого мінімуму, цього можна уникнути, по-різному ініціалізуючи ваги, використовуючи диференціальні оптимізатори та намагаючись регулювати.


Додамо лише: ми використовуємо міні-партії в основному для обчислювальної ефективності. Ми маємо компроміс між точністю спуску та частотою оновлення ваг. Дані повинні бути надзвичайно великими, щоб не вміститись у пам'ять.
Łukasz Grad

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

Ні, на загальній похибці партії є лише один градієнт, який є вектором похідних. Це означає, що ми оновлюємо колись ваги на основі градієнта, тобто напряму оновлення, що робить помилку на цій міні-партії зменшенням найбільше. Градієнт складається з часткових похідних, тобто похідної pf - міні-похибки партії щодо кожної ваги: ​​це говорить нам про те, чи повинна кожна вага стає меншою чи більшою і на скільки. Усі ваги отримують одне оновлення для партії, щоб зменшити помилку на цій міні-партії, що не залежить від інших міні-пакетів.
данте
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.