Суть
Цикл из четырёх шагов:
- Forward pass — прогон входа через сеть, получение предсказания.
- Loss — измерение ошибки (например, cross-entropy).
- Backward pass — вычисление градиентов через правило цепочки.
- 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 из случайной инициализации