Функции потерь, оптимизация и backpropagation
В прошлых темах мы сделали два ключевых шага:
научились ставить задачу (что предсказываем, как измеряем качество, где риск утечки данных);
разобрали данные и архитектуры (MLP, CNN, RNN, трансформеры).Теперь соединим это в единый механизм обучения: функция потерь говорит, что считать ошибкой, оптимизатор говорит, как уменьшать эту ошибку, а backpropagation (обратное распространение ошибки) эффективно считает, как каждый параметр модели влияет на ошибку.
!Диаграмма полного цикла: прямой проход, вычисление потерь, backprop, шаг оптимизатора
Функция потерь
Функция потерь (loss) — это число, показывающее, насколько предсказание модели плохо относительно правильного ответа. Мы обучаем модель так, чтобы в среднем потери становились меньше.
Важно связывать loss с постановкой задачи из первой статьи:
если задача — классификация, loss должен сравнивать вероятности классов и правильный класс;
если задача — регрессия, loss измеряет расстояние между числами;
если важны разные цены ошибок, это отражают весами классов, порогами или выбором метрики и loss.Популярные функции потерь и когда они нужны
| Тип задачи | Что выдаёт модель | Частая функция потерь | Интуиция |
|---|---|---|---|
| Регрессия | число | MSE | большие ошибки наказываются сильнее |
| Регрессия | число | MAE | штраф пропорционален модулю ошибки |
| Бинарная классификация | вероятность | BCE | поощряет высокую вероятность правильного класса |
| Многоклассовая классификация | вероятности по классам | Cross-entropy | наказывает, если правильному классу дали низкую вероятность |
#### MSE для регрессии
Что означает каждый элемент:
— число примеров, по которым считаем среднюю ошибку.
— индекс примера.
— истинный ответ для примера .
— предсказание модели для примера .
— ошибка предсказания.
— квадрат ошибки: большие промахи становятся гораздо дороже.
— усреднение по примерам.Практическая заметка: если в данных бывают редкие, но огромные выбросы, MSE может чрезмерно подстраиваться под них. Тогда иногда лучше MAE или более устойчивые варианты (например, Huber loss).
#### Cross-entropy для классификации
Для многоклассовой классификации обычно используют softmax + cross-entropy.
Softmax превращает набор чисел (их часто называют логиты) в вероятности:
Пояснение:
— число классов.
— логит для класса (сырой выход модели до вероятностей).
— экспонента, делает значения положительными.
— нормировка, чтобы суммы вероятностей были равны 1.
— итоговая вероятность класса .Cross-entropy в простейшем виде можно понимать так: если правильный класс должен иметь вероятность близкую к 1, loss становится большим, когда модель даёт ему маленькую вероятность.
Практическая заметка: во многих фреймворках есть функция cross_entropy, которая принимает логиты, а softmax внутри делает сама. Это часто численно стабильнее.
Loss и метрика — не одно и то же
Loss оптимизируется напрямую градиентным спуском.
Метрика (accuracy, F1, ROC-AUC и т.д.) нужна, чтобы оценивать качество так, как важно вам.Например, в дисбалансной классификации можно обучаться с cross-entropy, но следить за PR-AUC или F1 на validation.
Оптимизация: как модель уменьшает loss
У нейросети есть параметры (веса и смещения). Мы хотим подобрать такие , чтобы loss был минимальным.
Градиентный спуск
Базовая идея: если мы знаем, в какую сторону нужно поменять параметры, чтобы loss уменьшился, — делаем небольшой шаг в эту сторону.
Типичная формула обновления:
Пояснение:
— все обучаемые параметры модели.
— функция потерь.
— градиент: вектор, показывающий, как loss меняется при малых изменениях каждого параметра.
— скорость обучения (learning rate): размер шага.
знак минус означает, что мы идём в сторону уменьшения loss.Мини-батчи, эпохи и почему не считают градиент на всём датасете
На практике градиент считают не по всем данным сразу, а по небольшим порциям.
Батч (batch) — сколько примеров мы берём для одного шага оптимизации.
Мини-батч SGD — градиентный спуск, где каждый шаг использует случайный мини-батч.
Эпоха — один полный проход по обучающей выборке.Это делает обучение быстрее и добавляет полезный “шум”, который иногда помогает выходить из плохих локальных областей.
Популярные оптимизаторы
SGD: простой и часто хорошо обобщает, но требует подбора learning rate.
SGD с momentum: добавляет “инерцию”, чтобы устойчивее двигаться по одному направлению.
Adam: адаптирует шаги под каждый параметр, обычно быстро сходится и удобен как стартовый выбор.Оригинальная статья про Adam: Adam: A Method for Stochastic Optimization.
Что обычно настраивают в обучении
learning rate ;
размер батча;
число эпох;
scheduler для learning rate (как он меняется по ходу обучения);
регуляризацию (например, weight decay).Практический принцип: если loss на train не падает, чаще всего проблема в learning rate, нормализации данных, ошибке в таргете/разметке или в баге в пайплайне.
Backpropagation: откуда берутся градиенты
Чтобы сделать шаг оптимизации, нужен градиент . Считать его “в лоб” для каждого параметра было бы слишком дорого.
Backpropagation — это эффективный способ вычислять градиенты в моделях, которые представимы как композиция операций.
> “The back-propagation algorithm is a practical way to calculate the gradient of the error function with respect to the weights…” — Rumelhart, Hinton, Williams, Learning representations by back-propagating errors (1986)
Ключевая идея: правило цепочки
Если вычисление можно представить как цепочку функций, то производная всей цепочки выражается через произведение производных частей.
Простой пример:
модель выдаёт
loss считается как
а зависит от параметра Тогда зависимость loss от параметра можно записать так:
Пояснение:
— насколько изменится loss, если немного изменить параметр .
— насколько loss чувствителен к изменению предсказания.
— насколько предсказание чувствительно к изменению параметра.
знак — произведение: “влияние параметра на loss” раскладывается на влияние параметра на предсказание и влияние предсказания на loss.Backprop делает это не для одной цепочки, а для целого вычислительного графа, проходя по нему с конца к началу.
Прямой и обратный проход
Обучение нейросети на одном батче почти всегда устроено так:
Прямой проход: считаем предсказания по входам .
Считаем loss .
Обратный проход: считаем градиенты loss по всем параметрам.
Оптимизатор обновляет параметры.Автоматическое дифференцирование в практике
В современных библиотеках вы обычно не реализуете backprop вручную: используется автодифференцирование.
PyTorch: Automatic differentiation package — torch.autograd
TensorFlow: Automatic differentiation and GradientTapeПолезный навык: понимать, что autograd строит вычислительный граф и умеет вычислять градиенты, но он не спасёт от неправильного loss, утечки данных или неверных таргетов.
Типичные проблемы оптимизации и как их распознать
Learning rate слишком большой или слишком маленький
Признаки:
слишком большой: loss скачет, обучение нестабильно, иногда появляются NaN.
слишком маленький: loss падает очень медленно или почти стоит.Практика: попробуйте изменить learning rate в 3–10 раз и посмотрите на первые сотни шагов.
Переобучение
Переобучение проявляется как:
train loss падает,
а validation loss перестаёт улучшаться или ухудшается.Это связано с темами про данные: иногда “лечится” не архитектурой, а улучшением разбиения, разметки и устранением утечек.
Типовые инструменты (идею важно знать уже сейчас):
early stopping по validation;
регуляризация (weight decay);
dropout;
аугментации (для изображений, текста, аудио).Взрывающиеся и затухающие градиенты
Затухающие градиенты: ранние слои почти не обучаются.
Взрывающиеся градиенты: градиенты становятся огромными, обучение “ломается”.Это особенно актуально для RNN и очень глубоких сетей (связь с темой архитектур).
Практические меры:
нормализации (например, batch norm / layer norm — подробнее обычно обсуждают в темах про стабильное обучение);
правильная инициализация весов;
gradient clipping (особенно в RNN);
архитектурные решения: residual-связи, LSTM/GRU вместо простой RNN.Как связать всё вместе: минимальный рабочий рецепт
Ниже — компактный чек-лист, объединяющий постановку, данные, архитектуру и обучение.
Выберите корректный формат таргета и loss под задачу.
Проверьте разбиение train/val/test и отсутствие утечек.
Начните с простого baseline и понятного оптимизатора (часто Adam).
Логируйте:
- train loss,
- validation loss,
- ключевую метрику (accuracy/F1/MAE и т.д.).
Если метрика не растёт, задайте себе вопросы:
- правильно ли определён таргет;
- нет ли сдвига распределений между train и val;
- адекватен ли learning rate;
- соответствует ли архитектура типу данных.
Что дальше
Дальше в курсе обычно переходят от “механики обучения” к устойчивой практике:
регуляризация и борьба с переобучением;
стратегии выбора гиперпараметров;
отладка обучения и диагностика ошибок;
воспроизводимость экспериментов.Главная мысль этой темы: нейросеть обучается не “магией”, а оптимизацией численной цели. Если вы правильно выбрали loss, честно подготовили данные и понимаете, как работает backprop и шаг оптимизатора, вы можете системно улучшать качество, а не надеяться на случай.