Направление движения мы теперь знаем: чтобы уменьшать функцию потерь, нужно двигаться против градиента.
Но одного направления недостаточно. Нужно ещё решить, насколько сильно менять вес за один шаг.
Посмотрим на нашу точку w = 0. Производная здесь равна:
градиент = −45
Знак уже сообщает нам полезную информацию. Градиент отрицательный, значит для уменьшения ошибки вес нужно увеличивать.
Но означает ли число 45, что вес нужно сразу увеличить на 45?
Проверим:
w = 0 − (−45) = 45
Минимум находится в точке w = 3. Значит, такой шаг оказался огромным: мы проскочили минимум далеко вперёд.
Причина в том, что градиент — это не готовый шаг. Он показывает, насколько сильно функция потерь реагирует на небольшое изменение веса.
Чем больше модуль градиента, тем круче склон. Чем меньше модуль градиента, тем более пологий участок графика.
Поэтому удобно разделить две вещи:
- градиент сообщает направление и крутизну склона;
- скорость обучения определяет, насколько сильно мы будем реагировать на этот градиент.
Скорость обучения (learning rate, lr) — число, на которое мы умножаем градиент перед изменением веса.
Сначала вычисляем изменение веса:
Δw = −lr · градиент
а затем обновляем сам вес:
wновый = wстарый + Δw
Эти две строки часто записывают одной:
w = w − lr · градиент
Минус здесь очень важен: градиент указывает направление роста функции потерь, а нам нужно двигаться в противоположную сторону.
Посмотрим, что произойдёт при lr = 0.05.
В точке w = 0:
градиент = −45
Δw = −0.05 · (−45) = +2.25
wновый = 0 + 2.25 = 2.25
Вот теперь шаг выглядит разумно. Мы не прыгнули сразу на 45, а переместились с 0 до 2.25 — довольно близко к минимуму w = 3.
Если взять меньший lr, изменение веса будет меньше. Если взять больший — больше.
lr = 0.001 → Δw = +0.045
lr = 0.05 → Δw = +2.25
lr = 0.2 → Δw = +9
То есть lr управляет размером шага.
Слишком маленький lr заставляет модель двигаться к минимуму очень медленно. Слишком большой может заставить её перескакивать через минимум и даже уходить всё дальше от него.
Универсального значения lr, подходящего для любой модели, нет. Поэтому скорость обучения является гиперпараметром: её выбирают до обучения или изменяют по специальному правилу во время обучения.
Почему шаг уменьшается возле минимума
Есть ещё одна важная особенность градиентного спуска.
Размер изменения веса равен:
|Δw| = lr · |градиент|
Поэтому при одном и том же lr размер шага зависит от самого градиента.
Далеко от минимума склон нашей функции крутой, модуль градиента большой — шаг получается большим.
Возле минимума склон становится пологим, модуль градиента уменьшается — вместе с ним автоматически уменьшается и шаг.
Посмотрим на это при lr = 0.05:
| w |
градиент |
Δw = −lr · градиент |
новый w |
| 0 |
−45 |
+2.25 |
2.25 |
| 2 |
−15 |
+0.75 |
2.75 |
| 2.9 |
−1.5 |
+0.075 |
2.975 |
| 3 |
0 |
0 |
3 |
Далеко от цели шаг большой, рядом с целью — маленький.
Это важное отличие от метода с постоянным шагом. Там длину каждого шага мы задавали заранее. Здесь она автоматически меняется вместе с крутизной функции.
В точном минимуме нашей функции:
градиент = 0
поэтому:
Δw = −lr · 0 = 0
Если алгоритм точно попал в минимум, следующий шаг ничего не изменит.
На практике обучение нейронной сети обычно не попадает в минимум идеально. Поэтому используют дополнительные условия остановки: например, ограничение числа шагов или проверку того, что функция потерь почти перестала уменьшаться.
Теперь основной цикл обучения замкнулся:
данные
↓
модель
↓
прогноз
↓
функция потерь
↓
градиент
↓
Δw = −lr · градиент
↓
новые веса
↓
повтор
Попробуем три разных lr
Теперь понятно, зачем нужен lr. Посмотрим, насколько сильно его значение влияет на обучение.
Запустим градиентный спуск три раза. Во всех случаях:
- используем одну и ту же функцию потерь;
- начинаем с
w = 0;
- ищем минимум
w = 3;
- делаем по шесть шагов.
Отличаться будет только скорость обучения.
Таблица 3. Значение веса после каждого шага.
| номер шага |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
| lr = 0.001 |
0 |
0.045 |
0.0893 |
0.133 |
0.176 |
0.2184 |
0.2601 |
| lr = 0.05 |
0 |
2.25 |
2.8125 |
2.9531 |
2.9883 |
2.9971 |
2.9993 |
| lr = 0.2 |
0 |
9 |
−9 |
27 |
−45 |
99 |
−189 |
Три значения lr дали совершенно разное поведение.
lr = 0.001 — направление правильное, но шаги слишком маленькие. Вес движется к тройке, однако очень медленно.
lr = 0.05 — шаг достаточно большой, чтобы быстро приблизиться к минимуму, но не настолько большой, чтобы потерять устойчивость. Уже через несколько шагов вес почти равен 3.
lr = 0.2 — шаг слишком большой. Алгоритм каждый раз перелетает через минимум, причём расстояние до него увеличивается. Обучение расходится.
Получается главный смысл скорости обучения:
слишком маленький lr → обучение идёт медленно
подходящий lr → быстро приближаемся к минимуму
слишком большой lr → перескакиваем минимум,
колебания могут расти
Поэтому скорость обучения — один из самых важных параметров градиентного спуска.