Коннекционизм.
ЛЕКЦИЯ 6. Математика обучения: Loss, Градиенты и Оптимизаторы
- 08.11.26 г.
- 9772225665000 26023
Общие положения
В предыдущих лекциях мы разобрали архитектуры: нейрон, MLP, CNN, RNN. Мы увидели, как они устроены. Но остался главный вопрос: как они учатся? Что происходит внутри, когда сеть «тренируется»? Почему одни сети учатся хорошо, а другие — плохо? И почему иногда сеть, которая идеально работает на обучающих данных, полностью проваливается на новых?
Эта лекция — о математике обучения. Мы разберем функцию потерь, градиентный спуск, алгоритм обратного распространения ошибки, оптимизаторы и переобучение. Это фундамент, без которого понимание любых архитектур остается поверхностным. Без этой лекции CNN и RNN — просто схемы. С ней — работающие механизмы.
Напомним важную предпосылку, о которой мы говорили раньше: чтобы обучение через градиенты было возможным, функции активации должны быть дифференцируемыми. Именно поэтому пороговая функция Мак-Каллока-Питтса уступила место Sigmoid, Tanh и ReLU.
1. Функция потерь: как измерить ошибку
1.1. Что это такое
Функция потерь (Loss Function) — это число, которое показывает, насколько сеть ошибается. Чем меньше потерь, тем лучше сеть решает задачу.
Представьте, что вы стреляете по мишени. Функция потерь — это расстояние от вашего выстрела до центра. Чем ближе к центру, тем меньше потерь.
Важно сразу разделить два понятия.
Loss — то, что сеть минимизирует во время обучения.
Метрики качества (accuracy, F1, perplexity и другие) — то, чем мы оцениваем результат. Это связанные, но разные вещи.
Ключевое различие в том, что loss мы дифференцируем: по нему можно вычислить градиент и обновить веса. Accuracy, precision, recall… — недифференцируемы: они просто считают долю правильных ответов. Поэтому мы не можем обучать сеть напрямую по accuracy — нам нужен loss, который можно «продифференцировать».
1.2. MSE (Mean Squared Error)
Для задач регрессии — когда нужно предсказать число (цену, температуру, возраст) — используется MSE, средняя квадратичная ошибка.
Ее формула проста: берем разницу между предсказанием и правильным ответом, возводим в квадрат, усредняем по всем примерам. Словесно это можно записать так: MSE = (1/n) · Σ (y − ŷ)² , где y — правильный ответ, ŷ — предсказание, n — число примеров.
Почему квадрат? Чтобы отрицательные и положительные ошибки не компенсировали друг друга. Если сеть ошибается на +5 и на −5, простая сумма даст 0 — как будто ошибки нет. Квадрат делает все ошибки положительными.
Аналогия. Вы бросаете дротики. Первый попал на 5 см левее центра, второй — на 5 см правее. Если просто сложить смещения, получится 0 — «идеально». Но это не так. Квадрат показывает реальную величину промаха.
1.3. Cross-Entropy (Кросс-энтропия)
Для задач классификации — когда нужно определить класс (кошка, собака, машина) — используется Cross-Entropy.
Она сравнивает распределение вероятностей, которое выдает сеть, с истинным распределением (где правильный класс имеет вероятность 1, а остальные — 0).
На практике перед Cross-Entropy почти всегда стоит слой Softmax: он превращает сырые числа (логиты) в вероятности, которые в сумме дают 1. Без этого сравнение распределений было бы некорректным.
Пример. Сеть предсказывает: «кошка — 0.9, собака — 0.08, машина — 0.02». Если на картинке действительно кошка, ошибка маленькая. Если сеть предсказывает «кошка — 0.1, собака — 0.8, машина — 0.1», а на картинке кошка — ошибка большая.
Аналогия. Вы ставите на скачки. Если вы поставили 90% денег на правильную лошадь — вы молодец. Если 90% на неправильную — вы проиграли. Cross-Entropy измеряет, насколько «уверенно и правильно» сеть угадывает класс.
1.4. Какую функцию выбрать
Если задача — предсказать число (регрессия), то выбирается MSE. Если задача — выбрать класс (классификация) — Cross-Entropy. Это стандартные пары, которые работают в большинстве случаев.
2. Градиентный спуск: как уменьшить ошибку
2.1. Идея
Мы знаем, насколько сеть ошибается (функция потерь). Теперь нужно уменьшить эту ошибку. Как?
Градиентный спуск — это метод, который говорит нам, в каком направлении менять веса, чтобы ошибка уменьшилась.
Градиент — это вектор, который указывает направление наискорейшего возрастания функции. Нам нужно уменьшать ошибку, поэтому мы идем в противоположном направлении.
Как это связано с функцией потерь? Градиентный спуск минимизирует функцию потерь. Мы вычисляем градиент функции потерь по весам и делаем шаг в противоположном направлении. Это и есть обучение: мы постепенно уменьшаем ошибку. Каждый шаг — это маленькое улучшение.
Аналогия. Вы стоите на склоне горы в густом тумане. Вы не видите вершину, но можете ощупать ногами склон. Вы делаете шаг в сторону наибольшего спуска — вниз. Это и есть градиентный спуск.
2.2. Learning Rate (шаг обучения)
Learning rate — это размер шага, с которым мы меняем веса за одну итерацию: если очень большой шаг — вы можете перепрыгнуть минимум и никогда не сойтись, если очень маленький шаг — вы будете учиться вечность.
Аналогия. Вы спускаетесь с горы. Если вы делаете огромные прыжки, вы можете перелететь долину и оказаться на другом склоне. Если вы делаете крошечные шаги, вы будете спускаться годами. Нужен оптимальный размер шага.
Learning Rate Schedule. На практике learning rate часто уменьшают в процессе обучения: сначала большой шаг, чтобы быстро приблизиться к минимуму, потом маленький, чтобы точно попасть в него. Это называется learning rate schedule (расписание скорости обучения). Самые распространенные схемы — ступенчатое уменьшение (step decay), косинусное затухание (cosine annealing) и экспоненциальное затухание. Без расписания обучение часто оказывается менее стабильным.
Warmup. В современных моделях (особенно трансформерах) часто используют warmup: первые несколько тысяч шагов learning rate линейно растет (от нуля до целевого значения), а потом уменьшается. Это стабилизирует обучение на начальном этапе, когда веса еще случайны и градиенты могут быть очень большими.
2.3. Локальные минимумы
Градиентный спуск может застрять в локальном минимуме — точке, где ошибка мала, но не минимальна.
Глобальный минимум — это самая низкая точка, локальный — просто «яма» на пути.
Насколько это страшно? В глубоких сетях — не так страшно, как кажется. Во-первых, современных оптимизаторов (Adam) и правильной инициализации часто достаточно, чтобы выйти из локального минимума. Во-вторых, в пространстве высокой размерности локальные минимумы часто оказываются почти такими же хорошими, как глобальный. В-третьих, стохастичность SGD (случайный выбор батчей) помогает «выпрыгивать» из локальных ям.
Стохастичность полезна не только для выхода из локальных минимумов, но и для исследования пространства параметров. Случайные батчи дают разные градиенты, и сеть не застревает в одной точке.
3. Обратное распространение ошибки (Backpropagation)
3.1. Проблема
Мы знаем, что веса нужно менять. Но как понять, какой именно вес внес какой вклад в ошибку?
В однослойной сети это просто: ошибка на выходе напрямую связана с весами. Но в многослойной сети есть скрытые слои. Мы видим только ошибку на выходе. Как ее «протолкнуть» обратно, в скрытые слои?
Идея обратного распространения ошибки восходит к работам по оптимальному управлению: Генри Дж. Келли (Henry J. Kelley, 1960) и Артура Брайсона (Arthur Bryson, 1961). Брайсон опубликовал свою работу в материалах симпозиума Гарвардского университета. Пол Вербос применил ее к нейросетям в 1974 году. А Румельхарт, Хинтон и Уильямс популяризировали ее в 1986 году . Так что «неразрешимой до 1986» — это упрощение: метод был известен, но широкую известность получил после работы 1986 года.
Проблема казалась неразрешимой, потому что идея обратного распространения была известна в теории оптимального управления, но еще не была применена к нейросетям так, чтобы это стало практическим методом обучения.
3.2. Решение
Backpropagation (обратное распространение ошибки) — это алгоритм, который позволяет вычислить вклад каждого веса в ошибку.
Идея такова.
а. Сеть делает предсказание (прямой проход).
б. Вычисляется ошибка (Loss).
в. Ошибка распространяется обратно от выходного слоя к входному.
г. На каждом слое вычисляется, какой вклад внес каждый вес в ошибку.
д. Веса корректируются пропорционально их вкладу.
Математическая основа — цепное правило дифференцирования (Chain Rule). Оно позволяет вычислить производную сложной функции через производные ее частей.
Пример с числами. Представьте сеть с одним скрытым слоем. Ошибка на выходе — 0.5. Backpropagation вычисляет, что вес w₁ внес вклад 0.3, а вес w₂ — 0.2. Мы корректируем w₁ сильнее, чем w₂, потому что он больше виноват в ошибке.
Аналогия. Команда провалила проект. Менеджер выясняет, кто внес какой вклад в провал, и корректирует работу каждого. Backpropagation делает то же самое: он выясняет, какой вес внес какую ошибку, и корректирует его.
3.3. Значение и проблема затухающих градиентов
Backpropagation — это ключевой алгоритм современного глубокого обучения. Без него не было бы ни CNN, ни RNN, ни трансформеров. Он позволил обучать глубокие сети — с десятками и сотнями слоев.
Но у Backpropagation есть проблема: в очень глубоких сетях градиенты могут затухать. Когда градиент проходит через много слоев, он умножается на производные функций активации. Если эти производные меньше 1, градиент становится очень маленьким — и ранние слои почти не обучаются. Это называется проблемой затухающих градиентов (vanishing gradient).
Именно поэтому появились ReLU (ее производная равна 1 для положительных значений), batch normalization (нормализует выходы слоев) и остаточные связи в ResNet (позволяют градиенту «перепрыгивать» через слои).
4. Оптимизаторы: как ускорить обучение
4.1. SGD (Stochastic Gradient Descent)
SGD — это базовый вариант градиентного спуска. Веса обновляются после каждого примера (или небольшого батча).
Плюсы: простота, часто хорошо работает.
Минусы: может колебаться, медленно сходится на сложных задачах.
Промежуточный шаг между чистым SGD и более сложными методами — SGD с momentum (моментом). Momentum — это модификация SGD, которая накапливает «инерцию» движения по направлению градиента и помогает быстрее проходить овраги функции потерь.
4.2. Adam (Adaptive Moment Estimation)
Adam — это адаптивный оптимизатор. Он подстраивает скорость обучения для каждого параметра отдельно.
Плюсы: быстрее сходится, меньше нужно настраивать learning rate вручную.
Минусы: иногда чуть хуже обобщает, чем хорошо настроенный SGD. Это эмпирическое наблюдение, а не строгое правило: в некоторых задачах (особенно в компьютерном зрении) SGD с momentum может давать лучший результат на валидации, чем Adam.
Weight decay. В Adam часто добавляют weight decay — это способ добавить L2-регуляризацию прямо в оптимизатор: на каждом шаге веса немного уменьшаются. Версия Adam с weight decay называется AdamW и часто используется на практике.
4.3. Что выбрать
На практике Adam — это стандартный выбор для большинства задач. Он работает «из коробки» и не требует тонкой настройки. SGD используют, когда нужен максимальный контроль над процессом или когда Adam почему-то не работает.
5. Основные понятия: батч, итерация, эпоха
Батч — это группа примеров, по которым вычисляется градиент за один шаг. Например, 32 изображения, 64 текста.
Зачем нужны батчи? Обрабатывать все данные сразу — вычислительно тяжело. Обрабатывать по одному примеру — медленно и нестабильно. Батч — это компромисс: достаточно данных для стабильного градиента, но не слишком много для памяти.
Итерация — это один шаг оптимизации: взяли батч, вычислили градиент, обновили веса.
Эпоха — это полный проход по всему обучающему набору.
Пример. Если у вас 1000 примеров и батч размером 100, то одна эпоха — это 10 итераций (1000 / 100 = 10).
Инициализация весов: веса нельзя инициализировать нулями — тогда все нейроны будут учиться одинаково, и сеть не сможет выучить ничего сложного. Используют специальные методы: Xavier (для Sigmoid и Tanh) и He (для ReLU). Они подбирают начальные веса так, чтобы градиенты не затухали и не взрывались.
Batch normalization — это метод, который нормализует выходы слоя, стабилизируя обучение. Он позволяет использовать более высокие learning rate и ускоряет сходимость. Этот прием стал стандартом для глубоких сетей (в том числе для ResNet, о которых мы говорили ранее). Без batch normalization обучение очень глубоких сетей было бы значительно сложнее.
6. Переобучение: когда сеть учит шум
6.1. Что это такое
Переобучение (Overfitting) — это ситуация, когда сеть запоминает обучающие данные, а не учит закономерность. Она идеально работает на обучающем наборе, но проваливается на новых данных.
Аналогия. Студент выучил все ответы на экзаменационные вопросы, но не понял предмет. На экзамене с теми же вопросами он ответит идеально. Но дайте ему задачу, которой не было в списке — он растеряется.
6.2. Как обнаружить
Данные обычно делят на три части: обучающую (на ней сеть учится), валидационную (на ней проверяем, не переобучилась ли сеть) и тестовую (на ней оцениваем финальное качество). Валидация — это «пробный экзамен», тест — «выпускной».
Строим два графика: ошибка на обучении (train loss) и ошибка на валидации (validation loss).
Если обе ошибки падают — все хорошо.
Если train loss падает, а validation loss начинает расти — это переобучение.
Важно: train loss и validation loss — это разные вещи.
Train loss — то, что сеть минимизирует.
Validation loss — то, что мы измеряем на данных, которых сеть не видела.
Переобучение — это когда train loss падает, а validation loss растет. Почему это происходит? Сеть начинает запоминать шум в обучающих данных, а не общие закономерности. На новых данных шума нет — и сеть ошибается.
Связь с объемом данных: переобучение особенно опасно при малом объеме данных. Чем больше примеров, тем сложнее сети запомнить их все, и тем больше она вынуждена учить общие закономерности.
6.3. Как бороться
Dropout. Случайным образом отключаем часть нейронов во время обучения. Сеть вынуждена учиться более устойчиво, не полагаясь на отдельные нейроны. Dropout заставляет сеть распределять знания по многим нейронам, а не полагаться на один «супер-нейрон». Это делает ее более устойчивой к шуму.
Регуляризация (L1/L2). Добавляем штраф за большие веса в функцию потерь. L1-регуляризация (Lasso) штрафует за сумму модулей весов — многие веса становятся нулевыми. L2-регуляризация (Ridge) штрафует за сумму квадратов — веса просто уменьшаются. L1 используют для отбора признаков, L2 — для общей стабилизации.
Ранняя остановка (Early Stopping). Останавливаем обучение, когда validation loss начинает расти. Не даем сети «переучиться». Важно: при ранней остановке мы сохраняем модель, которая показала лучший результат на валидации, а не ту, что получилась в конце обучения. Мы хотим использовать лучшую модель, а не последнюю.
Аугментация данных. Искусственно увеличиваем обучающий набор: повороты, сдвиги, изменение яркости изображений. Это помогает сети учиться на разнообразных примерах и снижает переобучение.
Уменьшение сложности модели. Меньше слоев, меньше нейронов — меньше параметров, меньше возможностей для запоминания шума. Однако слишком простая модель может недообучиться. Нужен баланс между сложностью и объемом данных.
Порядок применения.
На практике часто начинают с ранней остановки и аугментации (если данных мало), затем добавляют dropout и регуляризацию, а в крайнем случае уменьшают сложность модели.
6.4. Недообучение (Underfitting)
Противоположная проблема: сеть слишком простая , чтобы выучить закономерность. Она плохо работает и на обучении, и на валидации.
Решение: увеличить сложность модели (больше слоев, нейронов), дольше обучать, улучшить признаки.
7. Как измеряют качество модели
7.1. Accuracy (Точность)
Доля правильных ответов. Если модель правильно классифицировала 90 из 100 картинок — точность 90%.
Ограничение: не работает для несбалансированных данных. Если 95% примеров — класс А, модель, которая всегда говорит «А», получит 95% точности, но будет бесполезной.
Что использовать вместо accurac?. Для несбалансированных данных используют precision (точность предсказаний положительного класса), recall (полнота — какую долю положительных примеров модель нашла) и F1-меру (гармоническое среднее precision и recall). Эти метрики лучше отражают качество в условиях дисбаланса.
Что такое «положительный класс»? Это тот класс, который нас интересует (например, «мошенничество» или «болезнь»). Precision показывает, насколько мы можем доверять предсказаниям этого класса, recall — какую долю реальных случаев мы нашли.
Напомним: accuracy, precision, recall и F1 — это метрики оценки. Они не заменяют функцию потерь, которую сеть минимизирует во время обучения.
7.2. Perplexity (Перплексия)
Для языковых моделей. Показывает, насколько модель «удивлена» реальным текстом. Чем ниже перплексия, тем лучше модель предсказывает текст.
Интуитивное объяснение. Если модель предсказывает каждое слово с вероятностью 1/100, перплексия равна 100. Если с вероятностью 1/10 — перплексия 10. Чем меньше, тем увереннее модель.
7.3. Человеческая оценка
Для генеративных систем (текст, изображения) автоматические метрики часто не работают. Люди оценивают, насколько ответ полезен, креативен, безопасен. Это основа RLHF (обучение с подкреплением на основе человеческой обратной связи).
8. Пример
8.1. Настройка радиоприемника
Представьте, что вы настраиваете радиоприемник:
- веса — это ручки настройки,
- ошибка — это шум в динамике,
- градиентный спуск — это процесс, при котором вы крутите ручки, чтобы уменьшить шум,
- learning rate — это скорость, с которой вы крутите ручки. Слишком быстро — проскочите станцию. Слишком медленно — будете крутить вечность.
Backpropagation — это способ понять, какую именно ручку и в какую сторону нужно крутить.
8.2. Переобучение
Студент, который выучил все ответы, но не понял предмет. На знакомых вопросах — отлично. На новых — провал.
8.3. Сравнение с человеческим обучением
Человек учится с 1–2 примеров, а нейросеть — с тысяч. Человек сразу понимает закономерность, а сеть постепенно подстраивает веса. Это различие важно для понимания, почему нейросети требуют так много данных.
9. Заключение
Мы разобрали математику обучения. Мы увидели, что сеть учится, минимизируя функцию потерь через градиентный спуск. Backpropagation позволяет вычислить вклад каждого веса в ошибку. Оптимизаторы (SGD, Adam) ускоряют этот процесс. А переобучение — это главная опасность, которая подстерегает нас на этом пути.
Теперь, когда мы понимаем, как сети учатся, мы можем перейти к тому, чему они учатся.