Автор: Александр Гончаренко
Редактура: Марк Страхов, Павел Батырь
Градиентный спуск позволяет нам найти $argmin(f(x_{0},x_{1}...x_{n})$. Это основной метод обучения нейросетей. С его помощью мы ищем такие веса, при которых loss функция будет принимать минимальное значение.
Градиент — это вектор частных производных. В случае с нейросетями градиент — $\frac{dloss}{dw_{i}}$
Напомним также, что производная — это скорость изменения функции. Получается, градиент — ****направление наибольшего роста функции. Следовательно, если мы будем двигаться в обратную сторону, то будем уменьшать значение loss функции. Это нам и нужно.
Обычный градиентный спуск обновляет веса и основывается только на антиградиенте в текущей точке:
$θ= θ−η⋅∇J(θ)$,
где $θ$ — веса, $η$ — шаг градентного спуска (learning rate), который является гиперпараметром, $∇J(θ)$ — градиент loss функции по весам.
В случае обычного градиентного спуска (GD) мы считаем градиент по всем объектам обучающей выборки и делаем шаг. К сожалению, при слишком большой выборке эта операция может оказаться очень дорогостоящей в плане вычислительных ресурсов.
Еще один способ — считать градиент на каждом объекте (SGD). Но тогда путь к минимуму будет очень шумным. Самый распространенный вариант — minibatch SGD (нечто среднее между GD и SGD). В этом случае мы делим тренировочную выборку на батчи (подвыборки) **и на каждом батче считаем градиент. Такой метод позволяет уменьшать количество шума при поиске минимума.
Для градиентного спуска очень важно подобрать правильный шаг. Например, если мы выберем слишком большой шаг — мы можем проскочить оптимум:
В то же время при выборе слишком маленького шага мы будем очень медленно двигаться:
Либо вообще не дойдем до оптимума и застрянем в локальном минимуме: