Введение в AI

Модуль 6: Как учатся нейросети. Backpropagation и оптимизация

Нейросеть — это набор слоёв с весами; обучение означает подбор этих весов так, чтобы выход модели как можно лучше соответствовал целям (меткам или целевой переменной). Чтобы понять, как именно это происходит, нужно разобрать три вещи: как мы измеряем «несоответствие» (функция потерь), как вычисляем направление изменения весов (обратное распространение ошибки) и как делаем шаги в этом направлении (градиентный спуск и его варианты). Без этого нейросеть остаётся «чёрным ящиком»; с этим — вы сможете осознанно выбирать loss, оптимизаторы и бороться с типичными проблемами обучения.

Задача модуля: вскрыть механику обучения: от функции потерь через backpropagation к градиентному спуску и типичным проблемам (затухающий и взрывающийся градиент, переобучение). Это основа для чтения статей и настройки любых глубоких моделей.

Что разберём

  • Loss — MSE для регрессии, Cross-Entropy для классификации.
  • Backpropagation — как градиент «течёт» от выхода к весам.
  • Градиентный спуск — batch, mini-batch, SGD, momentum, Adam.
  • Проблемы — затухание/взрыв градиента, регуляризация, dropout.

6.1 Функция потерь (Loss) для нейросетей

Обучение нейросети сводится к минимизации одной скалярной величины — функции потерь (loss), которая показывает, насколько предсказания модели отличаются от правильных ответов. Выбор loss определяет, что именно модель будет оптимизировать и как вести себя на границах классов или при выбросах.

Для регрессии чаще всего используют MSE (средний квадрат ошибки): усредняем квадраты разностей между предсказанием и целевым значением. Квадрат сильно штрафует большие отклонения, поэтому модель стремится не допускать крупных ошибок. Альтернативы — MAE (средняя абсолютная ошибка), Huber — когда выбросы не должны доминировать в обучении.

Для классификации стандарт — кросс-энтропия (cross-entropy). Истинная метка задаётся как one-hot вектор (единица на правильном классе, нули elsewhere); модель выдаёт распределение вероятностей по классам. Кросс-энтропия измеряет «расстояние» между предсказанным распределением и истинным: чем выше вероятность, которую модель поставила на правильный класс, тем меньше loss. Минимизируя кросс-энтропию, модель учится выдавать высокую уверенность в правильном классе и низкую — в остальных.

На практике: в PyTorch для многоклассовой классификации используют CrossEntropyLoss (внутри уже совмещён с softmax при необходимости); для регрессии — MSELoss. Выбор loss напрямую влияет на качество и сходимость.

6.2 Метод обратного распространения ошибки (Backpropagation)

У нейросети могут быть миллионы весов. Как понять, в какую сторону изменить каждый вес, чтобы уменьшить loss? Ответ даёт обратное распространение ошибки (backpropagation). Математическая основа — цепное правило дифференцирования: производная сложной функции по аргументу равна произведению производных по цепочке от выхода к аргументу.

Схема работы такая. Сначала выполняется прямой проход (forward): вход проходит через все слои, на каждом шаге считаются активации; в конце получаем предсказание и значение loss. Затем выполняется обратный проход (backward): от loss к входу. Для каждого слоя мы знаем градиент loss по выходам этого слоя; цепное правило позволяет вычислить градиент по входам слоя и по его весам. Эти градиенты передаются предыдущему слою, и так до первого. В итоге за один прямой и один обратный проход мы получаем градиент loss по всем весам сети.

Без backprop пришлось бы численно оценивать производные по каждому весу отдельно, что нереалистично для больших сетей. Благодаря backprop и автоматическому дифференцированию (autograd) в PyTorch и TensorFlow обучение глубоких сетей стало рутиной. Понимание «градиент течёт от выхода к входам и весам» помогает разбираться в архитектурах и отлаживать обучение.

Кратко

Forward: вход → слои → выход → loss. Backward: градиент loss распространяется по слоям в обратном порядке; для каждого веса получаем ∂loss/∂weight. Обновление весов идёт в направлении антиградиента.

6.3 Градиентный спуск и его вариации

После того как градиенты по всем весам посчитаны, нужно сделать шаг в направлении уменьшения loss. Градиентный спуск — итеративное обновление весов: на каждой итерации веса сдвигаются в сторону антиградиента (минус градиент) на величину, заданную learning rate (скорость обучения). От того, по скольким объектам мы считаем градиент и как выбираем шаг, зависят скорость сходимости и стабильность.

Batch gradient descent — градиент считается по всему датасету; шаг точный, но дорогой по времени и памяти. SGD (Stochastic Gradient Descent) — градиент по одному объекту; шаг шумный, но часто помогает выходить из плоских минимумов и быстрее проходить эпохи. Mini-batch — компромисс: градиент по небольшой подвыборке (например, 32 или 256 объектов). Это наиболее распространённый вариант: баланс между стабильностью и скоростью.

Для ускорения и устойчивости используют модификации. Momentum — накопление «инерции» градиента: направление обновления учитывает не только текущий градиент, но и предыдущие шаги, что сглаживает колебания. Adam (Adaptive Moment Estimation) и AdamW — адаптивные методы: для каждого параметра подбирается свой эффективный шаг на основе оценок первого и второго момента градиента. На практике Adam и AdamW чаще всего выбирают по умолчанию для нейросетей; они хорошо работают при стандартных настройках и реже требуют ручной подстройки learning rate.

Практика: типичный пайплайн — mini-batch, оптимизатор Adam или AdamW, learning rate часто от 1e-4 до 1e-2 в зависимости от задачи. При необходимости используют расписание изменения learning rate (scheduler).

6.4 Проблемы обучения и регуляризация

Глубокие сети сталкиваются с несколькими типичными проблемами. Затухающий градиент (vanishing gradient): при обратном распространении в сетях с активациями вроде сигмоиды или гиперболического тангенса производные на каждом слое по модулю меньше единицы. При перемножении по цепочке градиент на первых слоях становится очень маленьким, веса почти не обновляются, и нижние слои «не учатся». Решение — использовать активации, не сжимающие градиент так сильно: ReLU (и его варианты) дают производную 1 при положительном входе, поэтому градиент не затухает на таких нейронах.

Взрывающийся градиент (exploding gradient) — обратная ситуация: градиент по мере распространения назад растёт, веса получают огромные обновления и «взрываются». Это особенно характерно для длинных последовательностей в RNN. Решения: gradient clipping (ограничение нормы или величины градиента), нормализация слоёв (Layer Norm, Batch Norm), аккуратная инициализация весов.

Переобучение — модель запоминает обучающую выборку и плохо обобщает на новые данные. Один из основных приёмов регуляризации в нейросетях — Dropout. На каждом шаге обучения случайно «выключается» заданная доля нейронов (например, 0.2 или 0.5): их выход обнуляется. Сеть не может полагаться на отдельные нейроны и вынуждена распределять представление по ансамблю, что снижает переобучение. На инференсе dropout отключают, все нейроны работают, но веса масштабируются с учётом вероятности выпадения. Вместе с ограничением размера модели, early stopping и при необходимости L2-регуляризацией dropout помогает обучать более обобщающие модели.

Итог

Понимание loss, backprop и градиентного спуска — ядро обучения нейросетей. Знание про затухание/взрыв градиента и про dropout позволяет осознанно выбирать архитектуру, активации и регуляризацию при построении и отладке моделей.

Настройки

Тема