Стохастический градиентный спуск: как учатся нейросети
🎯 Зачем это нужно?
Представь, что ты учишься играть в видеоигру 🎮. После каждого матча ты анализируешь свои ошибки и становишься лучше. Но что если вместо анализа ВСЕХ матчей сразу, ты будешь учиться после каждого отдельного боя? Быстрее, правда?
Именно так работает стохастический градиентный спуск (SGD) - основа обучения современных нейросетей:
💬 ChatGPT: обучается на миллионах текстов, но обновляет веса после каждой небольшой порции
📸 Instagram: рекомендации формируются по кусочкам ленты, а не по всей истории сразу
🚗 Tesla Autopilot: учится на каждом участке дороги отдельно, а не ждет конца поездки
📚 История вопроса
В 1951 году Herbert Robbins придумал идею: “А что если не ждать, пока обработаем все данные, а обновляться по одному примеру?” Тогда это казалось безумием - как можно получить точный результат по неполным данным? 🤯
Но оказалось, что эта “неточность” - суперсила! SGD работает быстрее и часто находит лучшие решения, чем классический градиентный спуск. Сегодня 99% всех нейросетей в мире обучаются именно через SGD.
💡 Интуиция
[МЕДИА: image_01] Описание: Сравнение обычного и стохастического градиентного спуска на холмистом ландшафте Промпт: “educational illustration comparing gradient descent paths on hilly landscape, one smooth path vs zigzag stochastic path, both leading to global minimum, modern data science style, blue and orange colors”
Представь, что ты спускаешься с горы в тумане 🌫️:
Обычный градиентный спуск: Ты стоишь на месте, ждешь пока туман рассеется, смотришь на ВСЮ гору, выбираешь идеальное направление и делаешь один точный шаг. Повторяешь.
Стохастический градиентный спуск: Ты делаешь шаг, основываясь только на том, что видишь вокруг прямо сейчас. Шаги получаются “зигзагообразными”, но ты двигаешься быстрее и не застреваешь в ямках!
Ключевое отличие: SGD добавляет “полезный шум”, который помогает избежать локальных минимумов.
📐 Формальное определение
Обычный градиентный спуск: θₜ₊₁ = θₜ - α · ∇L(θₜ)
где L(θ) - функция потерь на ВСЕХ данных.
Стохастический градиентный спуск: θₜ₊₁ = θₜ - α · ∇L_i(θₜ)
где L_i(θ) - функция потерь только на i-том примере (или мини-батче).
Ключевые понятия:
- Эпоха - один проход по всему датасету
- Батч - небольшая порция данных (обычно 32-256 примеров)
- Learning rate (α) - размер шага (обычно 0.001-0.1)
🔍 Примеры с разбором
Пример 1: Линейная регрессия
Датасет: 1000 домов с ценами Задача: предсказать цену по площади
# Обычный градиентный спуск
for epoch in range(100):
gradient = compute_gradient_all_data() # ВСЕ 1000 домов
weights = weights - lr * gradient
# SGD с батчами по 32
for epoch in range(100):
for batch in batches(data, batch_size=32): # 1000/32 ≈ 31 обновление
gradient = compute_gradient(batch) # только 32 дома
weights = weights - lr * gradient
Результат: SGD сделает 31×100 = 3100 обновлений против 100 у обычного GD!
[МЕДИА: image_02] Описание: График сравнения скорости сходимости SGD vs GD Промпт: “comparison chart showing SGD vs GD convergence speed, loss function decreasing over iterations, SGD curve more noisy but faster, clean scientific visualization style”
Пример 2: Нейросеть для распознавания цифр
# Датасет MNIST: 60,000 картинок цифр
batch_size = 128
epochs = 10
for epoch in range(epochs):
for i in range(0, 60000, batch_size): # 60000/128 ≈ 469 батчей
X_batch = X[i:i+batch_size] # 128 картинок
y_batch = y[i:i+batch_size] # 128 меток
# Прямой проход
predictions = model(X_batch)
loss = cross_entropy(predictions, y_batch)
# Обратное распространение
gradients = backprop(loss)
# Обновление весов (SGD)
for param in model.parameters:
param -= learning_rate * gradients[param]
Результат: За 10 эпох = 4690 обновлений весов, нейросеть достигает 98% точности!
🎮 Практика
Базовый уровень 🟢
Задание 1: У нас есть датасет из 1000 примеров. Сколько обновлений весов произойдет за 5 эпох при batch_size=50?
💡 Подсказка
Количество батчей за эпоху = размер датасета / размер батчаЗадание 2: Почему SGD называется “стохастическим” (случайным)?
💡 Подсказка
Подумай о том, какие данные мы используем для вычисления градиентаЗадание 3: Реализуй простой SGD для линейной регрессии:
def sgd_step(w, b, x_batch, y_batch, lr):
# Твой код здесь
pass
Продвинутый уровень 🟡
Задание 4: Сравни память, необходимую для обычного GD vs SGD на датасете ImageNet (14M изображений):
- GD: сколько изображений нужно держать в памяти?
- SGD с batch_size=256: сколько изображений?
Задание 5: Объясни, почему SGD может найти лучший минимум, чем обычный GD:
💡 Подсказка
Подумай о "шуме" в градиентах и локальных минимумахЗадание 6: Какой learning rate выбрать?
- Датасет: 10,000 примеров
- Модель: нейросеть с 1M параметров
- Batch size: 32
Челлендж 🔴
Задание 7: Adaptive Learning Rate: Как изменить learning rate в процессе обучения?
def adjust_learning_rate(initial_lr, epoch, strategy="decay"):
# Реализуй стратегии: decay, step, cosine
pass
Задание 8: Mini-batch vs Full-batch: При каком размере датасета SGD перестает быть эффективнее обычного GD?
⚠️ Частые ошибки
❌ Ошибка: Слишком большой learning rate (α > 0.1) ✅ Правильно: Начинать с α = 0.01, уменьшать если loss растет 💡 Почему: Большой lr приводит к “прыжкам” мимо минимума
❌ Ошибка: Слишком маленький batch size (< 16)
✅ Правильно: Использовать 32-256 для большинства задач
💡 Почему: Маленький батч = слишком шумный градиент, медленная сходимость
❌ Ошибка: Не перемешивать данные между эпохами ✅ Правильно: random.shuffle(data) перед каждой эпохой 💡 Почему: Без перемешивания модель может запомнить порядок примеров
❌ Ошибка: Использовать SGD для очень маленьких датасетов (< 1000 примеров)
✅ Правильно: При малых данных лучше обычный GD или L-BFGS
💡 Почему: На маленьких данных “стохастичность” вредит больше, чем помогает
🎓 Главное запомнить
✅ Суть: SGD обновляет веса по небольшим порциям данных, а не по всему датасету
✅ Формула: θₜ₊₁ = θₜ - α · ∇L_batch(θₜ)
✅ Применение: 99% современных нейросетей обучаются через SGD и его варианты
🔗 Связь с другими темами
Откуда пришли: Градиентный спуск (урок 285) → добавили стохастичность Куда ведет: Momentum, Adam, AdaGrad (продвинутые оптимизаторы) Используется в: Backpropagation, обучение всех типов нейросетей Математика: Теория вероятностей (стохастические процессы), матричное исчисление
Понял тему? Закрепи в боте! 🚀
Попрактикуйся на задачах и получи персональные рекомендации от AI
💪 Начать тренировку