Оптимизаторы и backpropagation
Урок про то, как сеть обновляет веса: градиентный спуск, backpropagation, SGD и Adam.
Оптимизатор — это алгоритм, который по градиенту loss корректирует веса сети, шаг за шагом уменьшая ошибку.
Loss говорит «насколько плохо», градиент — «в какую сторону лучше», а оптимизатор делает сам шаг. Без него модель не училась бы. Разберём механику и два главных оптимизатора.
Градиентный спуск
Базовая идея: вес меняем против направления градиента, умноженного на скорость обучения (learning rate). Сэмулируем спуск к минимуму функции f(x)=(x-3)^2 — код запускается:
# минимизируем f(x) = (x-3)^2, минимум в x=3
x = 0.0
lr = 0.1
for step in range(20):
grad = 2 * (x - 3) # производная f
x = x - lr * grad # шаг против градиента
print("x после 20 шагов:", round(x, 4))Вывод:
x после 20 шагов: 2.9654
Параметр x сполз почти к 3 — именно так оптимизатор сползает к весам с минимальным loss.
Backpropagation
В сети из многих слоёв градиент по каждому весу считают методом обратного распространения ошибки (backprop): ошибка с выхода «протекает» назад по слоям через цепное правило производной. TF делает это автоматически — вам не нужно выводить формулы вручную.
forward: вход -> слой1 -> слой2 -> выход -> loss
backward: вход <- grad1 <- grad2 <- grad_выход <- loss
(градиенты текут назад через слои)SGD против Adam
| Оптимизатор | Идея | Когда |
| SGD | простой шаг против градиента | базовый, требует тонкой настройки lr |
| SGD + momentum | учитывает инерцию прошлых шагов | устойчивее, быстрее |
| Adam | адаптивный lr для каждого веса | хороший выбор по умолчанию |
В Keras (требует TF):
from tensorflow.keras import optimizers
model.compile(optimizer=optimizers.Adam(learning_rate=0.001), loss="mse")
# или просто строкой:
model.compile(optimizer="adam", loss="mse")Как работает под капотом
Adam хранит для каждого веса два «средних»: момент градиента (как импульс) и момент его квадрата (масштаб). Деля шаг на масштаб, он автоматически делает большие шаги там, где градиенты малы, и маленькие — где велики. Поэтому Adam обычно сходится быстрее SGD «из коробки» и менее чувствителен к выбору learning rate.
Частые ошибки
- Слишком большой learning rate. Шаги «перепрыгивают» минимум, loss скачет или уходит в бесконечность (NaN).
- Слишком маленький lr. Обучение ползёт мучительно медленно.
- Считать, что Adam всегда лучше. Для некоторых задач хорошо настроенный SGD+momentum обобщает лучше.
Итог
- Оптимизатор обновляет веса по градиенту loss; learning rate задаёт размер шага.
- Backpropagation автоматически считает градиенты, проводя ошибку назад через слои.
- SGD — простой; Adam — адаптивный и хороший выбор по умолчанию.
- Слишком большой lr ломает обучение (NaN), слишком малый — замедляет.