Это оптимизационный алгоритм, который используется для минимизации функции потерь в задачах машинного обучения. Основная идея заключается в поиске минимального значения функции потерь путём итеративного движения в направлении наискорейшего убывания этой функции, что определяется градиентом (или производной) функции.
🚩Как это работает
🟠Определение функции потерь
В контексте машинного обучения функция потерь оценивает, насколько хорошо модель предсказывает данные. Чем меньше значение функции потерь, тем лучше подгонка модели к данным.
🟠Вычисление градиента
Градиент функции потерь — это вектор частных производных, который показывает направление наискорейшего роста функции. Для минимизации функции потерь нужно двигаться в противоположном направлении, т.е. по направлению наискорейшего убывания.
🟠Обновление параметров
На каждом шаге параметры модели (например, веса в линейной регрессии) корректируются в направлении, противоположном градиенту, что осуществляется по формуле:
🟠Итерации
Шаги 2 и 3 повторяются до тех пор, пока не будет достигнут критерий остановки, например, до достижения заданного числа итераций, минимального изменения функции потерь или минимального значения градиента.
🚩Вариации
🟠Стандартный градиентный спуск (Batch Gradient Descent)
Градиент вычисляется на основе всех обучающих данных на каждом шаге, что обеспечивает точное направление к минимуму, но может быть вычислительно дорогостоящим на больших данных.
🟠Стохастический градиентный спуск (Stochastic Gradient Descent, SGD)
Градиент вычисляется на основе одного случайно выбранного примера данных на каждом шаге, что делает процесс более быстрым, но увеличивает стохастичность движения к минимуму.
🟠Мини-пакетный градиентный спуск (Mini-batch Gradient Descent)
Компромисс между двумя предыдущими подходами, градиент вычисляется для небольшого подмножества данных (мини-пакета).
import numpy as np
def gradient_descent(x, y, lr=0.01, epochs=100):
m, b = 0.1, 0.1 # начальная инициализация параметров
n = len(x) # количество данных
for _ in range(epochs):
f = y - (m*x + b)
# Обновление m и b
m -= lr * (-2 * x.dot(f).sum() / n)
b -= lr * (-2 * f.sum() / n)
return m, b
# Демонстрация на простых данных
x = np.array([1,
2, 3, 4, 5])
y = np.array([5, 7, 9, 11, 13])
m, b = gradient_descent(x, y)
print("Наклон m:", m, "Пересечение b:", b)
Ставь 👍 и забирай 📚 Базу знаний