Backpropagation

Backpropagation — базовый алгоритм обучения нейросетей: при ошибке предсказания он вычисляет, как менять каждый из миллиардов весов, чтобы уменьшить ошибку. Делает это через правило цепочки, прогоняя градиент от выхода назад ко входу.

Суть

Цикл из четырёх шагов:

  1. Forward pass — прогон входа через сеть, получение предсказания.
  2. Loss — измерение ошибки (например, cross-entropy).
  3. Backward pass — вычисление градиентов через правило цепочки.
  4. Update — w_new = w_old − learning_rate × gradient.

Зачем это нужно

Это механизм, которым LLM вообще «учится»: те же принципы, что в крошечной сети, просто масштаб — сотни слоёв и миллиарды весов. На нём держатся все этапы из LLM Training Stages.

Как работает

  • Правило цепочки: ∂loss/∂w = ∂loss/∂y · ∂y/∂h · … · ∂x/∂w — градиент «течёт» от выхода назад через все слои.
  • Пример обучения y = 2x: w=0.5 → loss=20.25 → … → w=2.00 → loss≈0 за ~50 шагов.
  • Реализуется через automatic differentiation (PyTorch/TensorFlow) — градиенты считаются автоматически.
  • Тонкости масштаба: vanishing/exploding gradients лечат LayerNorm/RMSNorm и residual connections (см. Transformer); оптимизаторы SGD/Adam «помнят» историю градиентов; обновление идёт на батчах, а не на отдельных примерах.
  • Так же обучается и матрица эмбеддингов (см. Embeddings) — из случайной инициализации в осмысленную геометрию.

Два вопроса, которые возникают следом

Почему для трансформеров берут Adam, а не SGD. У SGD один шаг обучения на все параметры, и подбирать его приходится вручную. Adam хранит для каждого параметра скользящие оценки среднего и дисперсии градиента и нормирует шаг на них — параметры с редкими или мелкими градиентами получают относительно больший шаг. Для трансформера это принципиально, потому что масштабы градиентов сильно различаются между слоями и между embedding-таблицей и остальной сетью: единый шаг либо взрывает одни слои, либо не двигает другие. Плата — память: оптимизатор хранит два дополнительных состояния на каждый параметр, то есть примерно втрое больше, чем сами веса.

Gradient checkpointing — размен памяти на вычисления. При обычном обратном проходе нужны активации всех слоёв, сохранённые на прямом проходе; на глубокой сети они и занимают основную часть памяти. Чекпоинтинг сохраняет активации не для всех слоёв, а для части, а недостающие пересчитывает заново во время обратного прохода. Память падает существенно, время обучения растёт примерно на треть. Приём нужен ровно тогда, когда модель не влезает в память при желаемом размере батча — иначе он только замедляет.

Связано с

  • LLM Training Stages — backprop работает на всех этапах обучения
  • Transformer — residual/LayerNorm существуют ради стабильного градиента
  • Embeddings — обучаются тем же backprop из случайной инициализации