Какие знаешь модификации градиентного спуска?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Модификации градиентного спуска
Градиентный спуск — это основной алгоритм оптимизации в машинном обучении. За годы развития нейросетей появилось множество его эффективных модификаций, каждая решает специфические проблемы базового алгоритма.
1. Стохастический градиентный спуск (SGD)
Вместо вычисления градиента на всем датасете используются отдельные примеры или мини-батчи:
# SGD с мини-батчами
for epoch in range(num_epochs):
for batch in data_batches:
gradients = compute_gradients(batch, model)
weights -= learning_rate * gradients
Плюсы: быстрее вычисляется, добавляет шум (помогает избежать локальных минимумов), позволяет обучаться на больших данных. Минусы: высокая дисперсия обновлений, может прыгать вокруг оптимума.
2. Momentum (инерция)
Добавляет "инерцию" — накапливает градиенты из предыдущих шагов:
v = 0 # скорость
beta = 0.9 # коэффициент инерции
for step in range(iterations):
grad = compute_gradient()
v = beta * v + grad
weights -= learning_rate * v
Преимущества: ускоряет сходимость в направлении консистентного градиента, амортизирует шум, помогает преодолеть "узкие долины" в ландшафте потерь.
3. Nesterov Accelerated Gradient (NAG)
Улучшенная версия momentum — сначала смотрим на следующую позицию, потом вычисляем градиент:
v = 0
beta = 0.9
for step in range(iterations):
grad = compute_gradient(weights - learning_rate * beta * v)
v = beta * v + grad
weights -= learning_rate * v
Результат: более быстрая сходимость, лучше работает с выпуклыми функциями.
4. AdaGrad (адаптивное обучение)
Каждому параметру выделяется своя скорость обучения на основе истории градиентов:
g_squared = 0 # сумма квадратов градиентов
epsilon = 1e-8
for step in range(iterations):
grad = compute_gradient()
g_squared += grad ** 2
weights -= (learning_rate / (sqrt(g_squared) + epsilon)) * grad
Плюсы: меньше нужно подбирать learning rate, хорошо работает с разреженными данными. Минусы: learning rate монотонно убывает, может стать очень маленьким.
5. RMSprop (Root Mean Square Propagation)
Решает проблему AdaGrad с убыванием learning rate, используя экспоненциальное скользящее среднее:
mean_g_squared = 0
beta = 0.999 # обычно 0.9-0.999
epsilon = 1e-8
for step in range(iterations):
grad = compute_gradient()
mean_g_squared = beta * mean_g_squared + (1 - beta) * (grad ** 2)
weights -= (learning_rate / (sqrt(mean_g_squared) + epsilon)) * grad
Преимущество: learning rate остается адаптивным на протяжении всего обучения.
6. Adam (Adaptive Moment Estimation)
Комбинирует лучшие идеи Momentum и RMSprop — адаптивная скорость + инерция:
m = 0 # первый момент (mean)
v = 0 # второй момент (variance)
beta1, beta2 = 0.9, 0.999
epsilon = 1e-8
t = 0
for step in range(iterations):
t += 1
grad = compute_gradient()
m = beta1 * m + (1 - beta1) * grad
v = beta2 * v + (1 - beta2) * (grad ** 2)
# bias correction
m_hat = m / (1 - beta1 ** t)
v_hat = v / (1 - beta2 ** t)
weights -= learning_rate * m_hat / (sqrt(v_hat) + epsilon)
Почему это стандарт: хорошо работает практически везде, без большой чувствительности к гиперпараметрам, быстрая сходимость.
7. AdamW (Adam with Weight Decay)
Грамотная реализация L2 регуляризации (у стандартного Adam она не совсем правильная):
# В обычном Adam: loss += lambda * sum(weights ** 2)
# В AdamW: явный weight decay (как в SGD с momentum)
weights *= (1 - lambda * learning_rate)
weights -= learning_rate * m_hat / (sqrt(v_hat) + epsilon)
Важно: AdamW работает лучше для трансформеров и больших моделей.
8. Другие модификации
LAMB (Layer-wise Adaptive Moments optimizer for Batch training) — для обучения с очень большими batch size.
RAdam — исправляет нестабильность Adam на ранних стадиях обучения.
Lookahead — метаоптимизатор, работает с любым базовым оптимизатором.
Как выбирать?
- Рекуррентные сети (LSTM/GRU): RMSprop, Adam
- Трансформеры: AdamW
- Выпуклая оптимизация: Nesterov momentum
- Большие batch size: LAMB
- Старые проекты с SGD: переходи на Adam/AdamW
Общее правило: начни с Adam/AdamW, если не работает — пробуй другие.