← Назад к вопросам

Что происходит при большом learning rate?

1.2 Junior🔥 111 комментариев
#Машинное обучение

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Эффекты большого 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 — это баланс между скоростью сходимости и стабильностью.