Что такое градиентный спуск
Градиентный спуск — это оптимизационный алгоритм, который используется для минимизации функции потерь в задачах машинного обучения. Основная идея заключается в поиске минимального значения функции потерь путём итеративного движения в направлении наискорейшего убывания этой функции, что определяется градиентом (или производной) функции.
Как это работает:
1. Определение функции потерь: В контексте машинного обучения функция потерь оценивает, насколько хорошо модель предсказывает данные. Чем меньше значение функции потерь, тем лучше подгонка модели к данным.
2. Вычисление градиента: Градиент функции потерь — это вектор частных производных, который показывает направление наискорейшего роста функции. Для минимизации функции потерь нужно двигаться в противоположном направлении, т.е. по направлению наискорейшего убывания.
\[
\theta := \theta - \eta \cdot \nabla_\theta J(\theta)
\]
где \( \theta \) — параметры модели, \( \eta \) — скорость обучения (learning rate), \( \nabla_\theta J(\theta) \) — градиент функции потерь по параметрам \( \theta \).4. Итерации: Шаги 2 и 3 повторяются до тех пор, пока не будет достигнут критерий остановки, например, до достижения заданного числа итераций, минимального изменения функции потерь или минимального значения градиента.
Вариации:
- Стандартный градиентный спуск (Batch Gradient Descent): Градиент вычисляется на основе всех обучающих данных на каждом шаге, что обеспечивает точное направление к минимуму, но может быть вычислительно дорогостоящим на больших данных.
- Стохастический градиентный спуск (Stochastic Gradient Descent, SGD): Градиент вычисляется на основе одного случайно выбранного примера данных на каждом шаге, что делает процесс более быстрым, но увеличивает стохастичность движения к минимуму.
- Мини-пакетный градиентный спуск (Mini-batch Gradient Descent): Компромисс между двумя предыдущими подходами, градиент вычисляется для небольшого подмножества данных (мини-пакета).
Пример:
```python
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)
```Градиентный спуск — это фундаментальный алгоритм для оптимизации в машинном обучении, который позволяет минимизировать функцию потерь и тем самым улучшать модели на основе данных.
April 14, 2024, easyoffer
