Как работает градиентный спуск
Градиентный спуск — это фундаментальный алгоритм оптимизации, используемый для минимизации функции потерь в машинном обучении и статистической оптимизации. Этот метод основан на идее, что если вы хотите найти минимум функции, вы должны двигаться в направлении, противоположном градиенту функции в данной точке.
Основные шаги алгоритма:
1. Инициализация: Начните с случайного значения параметра(ов) \( \theta \) (например, веса в линейной регрессии).
2. Вычисление градиента: Определите градиент функции потерь в текущей точке \( \theta \). Градиент показывает направление наискорейшего увеличения функции, поэтому для минимизации мы движемся в противоположном направлении.
3. Обновление параметра: Обновите параметр, двигаясь в направлении, противоположном градиенту:
\[
\theta := \theta - \eta \nabla_{\theta} J(\theta)
\]
где \( \eta \) — это скорость обучения, которая определяет размер шага.
4. Повторение: Повторяйте шаги 2 и 3, пока не будет достигнут критерий остановки (например, когда изменение \( \theta \) становится незначительным или количество итераций превышает предел).
Важные аспекты:
- Скорость обучения \( \eta \): Если скорость обучения слишком велика, может произойти "перепрыгивание" минимума, если слишком мала — процесс обучения будет очень медленным.
- Выбор начальной точки: Начальная точка может существенно повлиять на то, достигнет ли процесс локального минимума, глобального минимума или застрянет в плато.
- Нормализация данных: При работе с многомерными данными рекомендуется нормализовать данные, чтобы обеспечить равномерное масштабирование признаков. Это ускоряет сходимость градиентного спуска.
- Варианты градиентного спуска:
- Стандартный градиентный спуск: Вычисляется на всём наборе данных.
- Стохастический градиентный спуск (SGD): Градиент вычисляется на каждом шаге только по одному обучающему примеру, что делает метод менее стабильным, но гораздо быстрее.
- Мини-пакетный градиентный спуск: Компромисс между первыми двумя методами, градиент вычисляется для небольшого подмножества данных (мини-пакета).
Пример:
```python
import numpy as np
def gradient_descent(x, y, lr=0.01, epochs=1000):
m, b = 0, 0 # начальные параметры
n = len(y) # количество данных
for _ in range(epochs):
f = y - (m*x + b) # функция потерь
# Градиенты по m и b
dm = -2 * np.sum(x * f) / n
db = -2 * np.sum(f) / n
# Обновление параметров
m -= lr
* dm
b -= lr * db
return m, b
# Пример данных
x = np.array([1, 2, 3, 4, 5])
y = np.array([2, 4, 5, 4, 5])
m, b = gradient_descent(x, y, lr=0.01, epochs=1000)
print(f"Наклон m: {m}, Пересечение b: {b}")
```
Этот код демонстрирует, как применять градиентный спуск для простой линейной регрессии.
April 14, 2024, easyoffer