Что происходит при большом learning rate?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Эффекты большого learning rate при обучении нейронных сетей
Learning rate — это гиперпараметр, который контролирует размер шага обновления весов во время градиентного спуска. Когда learning rate слишком большой, возникает ряд критических проблем.
Основные проблемы
1. Расхождение (divergence) потерь
При большом learning rate модель делает чрезмерно большие шаги в пространстве весов. Вместо минимизации функции потерь, она может перепрыгивать через оптимальную точку и попадать в области с ещё большими потерями.
import numpy as np
import matplotlib.pyplot as plt
# Простая функция потерь (парабола)
def loss_function(x):
return (x - 3)**2 + 2
# Градиент
def gradient(x):
return 2 * (x - 3)
# Большой learning rate
lr_large = 0.5 # Слишком большой
x = 0
losses_large = [loss_function(x)]
for _ in range(10):
grad = gradient(x)
x = x - lr_large * grad # Шаг слишком большой!
losses_large.append(loss_function(x))
print(f"Потери с lr=0.5: {losses_large}")
# Оптимальный learning rate
lr_optimal = 0.01
x = 0
losses_optimal = [loss_function(x)]
for _ in range(10):
grad = gradient(x)
x = x - lr_optimal * grad
losses_optimal.append(loss_function(x))
print(f"Потери с lr=0.01: {losses_optimal[:5]}")
2. Осцилляции вокруг минимума
Модель может начать прыгать через минимум функции потерь, не сходясь к решению. Это создаёт нестабильное обучение с высокой дисперсией весов.
3. Невозможность найти локальный минимум
Нейронная сеть может застрять в цикле, не способная уточнить решение из-за слишком грубого шага оптимизации.
Признаки проблемы
- NaN (Not a Number) в потерях или весах — модель полностью развалилась
- Loss плотет вверх на графике обучения вместо снижения
- Большие скачки в validation метриках
- Взрывающиеся градиенты (градиентные взрывы)
Решения
1. Снизить learning rate
Меньший LR — более стабильное обучение, но медленнее сходится.
model = tf.keras.Sequential()
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001))
2. Использовать adaptive learning rate
Оптимизаторы вроде Adam, RMSprop, AdaGrad автоматически масштабируют LR для каждого параметра.
# Adam — умнее чем SGD
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) # Более робастен
optimizer = tf.keras.optimizers.SGD(learning_rate=0.01) # Менее робастен
3. Learning Rate Scheduling
Использовать высокий LR вначале, затем постепенно снижать.
def scheduler(epoch, lr):
if epoch > 5:
return lr * 0.5
return lr
callback = tf.keras.callbacks.LearningRateScheduler(scheduler)
model.fit(x_train, y_train, callbacks=[callback])
4. Gradient Clipping
Ограничить максимальное значение градиента.
optimizer = tf.keras.optimizers.Adam(learning_rate=0.001, clipvalue=1.0)
5. Batch Normalization
Нормализует активации, делая модель менее чувствительной к LR.
model.add(tf.keras.layers.Dense(128))
model.add(tf.keras.layers.BatchNormalization())
Правило выбора learning rate
Обычно начинают с:
- SGD: 0.01-0.1
- Adam: 0.001-0.01
- RMSprop: 0.0001-0.001
Далее подбирают экспериментально, глядя на график потерь — должна плавно снижаться.
Выводы
Большой learning rate приводит к расхождению, осцилляциям и неустойчивому обучению. Стоит использовать adaptive оптимизаторы (Adam), начать с консервативного LR и постепенно его подбирать. Правильный выбор LR — это баланс между скоростью сходимости и стабильностью.