Зворотне поширення в нейромережах
Нейромережа навчається, раз за разом запитуючи: «які ваги, якщо їх трохи змінити, зменшили б похибку?» Зворотне поширення — це ефективний алгоритм, що відповідає на це запитання одночасно для кожної ваги, використовуючи не більш ніж ланцюгове правило диференціювання.
1. Прямий прохід
Нейромережа — це композиція функцій. Кожен шар обчислює лінійне перетворення, за яким іде нелінійність:
Прямий прохід пропускає вхід x крізь усі L шарів, щоб отримати вихід ŷ = a^(L). Поки що жодного «навчання» — це лише обчислення функції.
Обчислюємо всі активації від входу до виходу. Зберігаємо проміжні значення (потрібні для зворотного поширення).
Поширюємо сигнал похибки від виходу назад до входу. Обчислюємо градієнт втрат за кожною вагою.
2. Функції втрат
Втрати L(ŷ, y) вимірюють, наскільки прогноз хибний. Вони мають бути диференційовними, щоб ми могли обчислювати градієнти.
- Середньоквадратична похибка (регресія): L = (1/N) Σ (ŷ_i − y_i)². Градієнт: ∂L/∂ŷ = 2(ŷ − y)/N.
- Бінарна перехресна ентропія (класифікація): L = −[y·log(ŷ) + (1−y)·log(1−ŷ)]. Градієнт за виходом сигмоїди: ∂L/∂ŷ = ŷ − y (елегантно).
- Категорійна перехресна ентропія (багатокласова): L = −Σ_c y_c · log(ŷ_c). У поєднанні з softmax: ∂L/∂z_c = ŷ_c − y_c.
3. Ланцюгове правило
Якщо f і g — диференційовні функції та h(x) = f(g(x)), то:
Нейромережа — це композиція багатьох функцій. Втрати залежать від кінцевого виходу, який залежить від вагів останнього шару, які залежать від активацій попереднього шару — і так аж до входу. Ланцюгове правило дозволяє обчислити ∂L/∂w для будь-якої ваги w, перемножуючи локальні градієнти вздовж шляху.
4. Зворотне поширення
Означимо «дельта»-сигнал похибки δ^(l) = ∂L/∂z^(l). Алгоритм зворотного поширення обчислює ці дельти від виходу до входу:
Це повний алгоритм. У коді сучасні фреймворки обчислюють це за допомогою обчислювального графа, де кожна операція реєструє свою зворотну функцію. «Зворотний прохід» обходить граф у зворотному топологічному порядку.
5. Градієнтний спуск
Щойно градієнти відомі, ваги оновлюються, щоб зменшити втрати:
Варіанти усувають обмеження SGD:
- Імпульс (Momentum): накопичує історію градієнтів (експоненційне ковзне середнє). Згладжує коливання: v = βv − α∇L, потім W += v.
- RMSProp: ділить на поточний RMSE градієнтів — більші градієнти отримують менші кроки. Допомагає з параметрами різного масштабу.
- Adam (найпопулярніший): поєднує імпульс (перший момент) + RMSProp (другий момент). Самоналаштовується для кожного параметра. Типово: β₁=0.9, β₂=0.999, ε=1e-8.
Мінібатчевий градієнтний спуск: замість одного зразка (стохастичний) чи всіх зразків (пакетний) використовуйте батчі по 32–256. Це дає вдалий компроміс між шумом і обчисленнями — достатньо шумно, щоб уникати локальних мінімумів, і достатньо ефективно для паралелізму на GPU.
6. Функції активації та зникнення градієнтів
Вибір σ визначає, як градієнти проходять крізь багато шарів.
- Сигмоїда σ(x) = 1/(1+e^−x): вихід ∈ (0,1), градієнт ≤ 0.25. Після 10 шарів градієнти становлять (0.25)¹⁰ ≈ 10⁻⁶ — проблема зникнення градієнта.
- Tanh: центрована в 0 (краще за сигмоїду), але максимальний градієнт 1 — усе одно зникає в глибоких мережах.
- ReLU max(0,x): градієнт точно дорівнює 1 для x>0 і 0 для x<0. Дешева, ненасичувана — розв'язала проблему зникнення градієнта для глибоких мереж. Вибір за замовчуванням.
- Leaky ReLU: невеликий нахил (0.01x) для x<0, що усуває проблему «вмирання ReLU», коли нейрони назавжди видають 0.
- GELU x·Φ(x): гладке наближення ReLU, використовується в трансформерах (BERT, GPT).
7. Автоматичне диференціювання
Сучасні фреймворки (PyTorch, JAX, TensorFlow) реалізують автоматичне диференціювання у зворотному режимі — узагальнення зворотного поширення на довільні обчислювальні графи.
Кожна операція над тензором записує зворотну функцію у стрічку/граф. Під час зворотного проходу рушій обходить цей граф і накопичує градієнти за ланцюговим правилом, цілком автоматично. Ви пишете прямі обчислення; градієнти отримуєте безкоштовно.
Автодиференціювання у прямому режимі (де ви поширюєте дотичну, а не градієнт) ефективне, коли розмірність входу << розмірності виходу. Зворотний режим ефективний, коли розмірність виходу << входу (тобто обчислення градієнта скалярних втрат за мільйонами вагів). Навчання нейромереж завжди використовує зворотний режим.