Спуск градієнта не зовсім працює так, як ви запропонували, але може виникнути подібна проблема.
Ми не обчислюємо середній збиток від партії, ми обчислюємо середні градієнти функції втрат. Градієнти є похідною втрати по відношенню до ваги, а в нейронній мережі градієнт на одну вагу залежить від входів цього конкретного прикладу, і це також залежить від багатьох інших ваг у моделі.
Якщо ваша модель має 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
Як я написав це у своєму прикладі, я усереднював кожен градієнт на зразок:∂L∂wj=1k∑ki=1∂Li∂wj
Код підручника, з яким ви пов’язані в коментарях, використовує Tensorflow для мінімізації середньої втрати.
Tensorflow прагне звести до мінімуму1k∑ki=1Li
Щоб мінімізувати це, він обчислює градієнти середньої втрати щодо кожної ваги та використовує градієнт-спуск для оновлення ваг:
∂L∂wj=∂∂wj1k∑ki=1Li
Диференціація може бути внесена всередину суми, так що вона така сама, як вираз із підходу в моєму прикладі.
∂∂wj1k∑ki=1Li=1k∑ki=1∂Li∂wj