Это фундаментальный алгоритм оптимизации, используемый для минимизации функции потерь в машинном обучении и статистической оптимизации. Этот метод основан на идее, что если вы хотите найти минимум функции, вы должны двигаться в направлении, противоположном градиенту функции в данной точке.
🚩Основные шаги алгоритма
1⃣Инициализация
Начните с случайного значения параметра(ов) \( \theta \) (например, веса в линейной регрессии).
2⃣Вычисление градиента
Определите градиент функции потерь в текущей точке \( \theta \). Градиент показывает направление наискорейшего увеличения функции, поэтому для минимизации мы движемся в противоположном направлении.
3⃣Обновление параметра
Обновите параметр, двигаясь в направлении, противоположном градиенту:
\theta := \theta - \eta \nabla_{\theta} J(\theta)
где \( \eta \) — это скорость обучения, которая определяет размер шага.
4⃣Повторение
Повторяйте шаги 2 и 3, пока не будет достигнут критерий остановки (например, когда изменение \( \theta \) становится незначительным или количество итераций превышает предел).
🚩Важные аспекты
🟠Скорость обучения \( \eta \)
Если скорость обучения слишком велика, может произойти "перепрыгивание" минимума, если слишком мала — процесс обучения будет очень медленным.
🟠Выбор начальной точки
Начальная точка может существенно повлиять на то, достигнет ли процесс локального минимума, глобального минимума или застрянет в плато.
🟠Нормализация данных
При работе с многомерными данными рекомендуется нормализовать данные, чтобы обеспечить равномерное масштабирование признаков. Это ускоряет сходимость градиентного спуска.
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}")
Ставь 👍 и забирай 📚 Базу знаний