Мы с вами рассмотрели алгоритм стохастического градиентного спуска. Кстати говоря, по-батчевый градиентный спуск тоже называется стохастическим градиентным спуском в пакетах для обучения нейронных сетей. Этот алгоритм хорош всем. Он достаточно быстро вычисляет, насколько нужно обновить текущие веса модели для того, чтобы улучшить её производительность (для того чтобы уменьшить функцию потерь). Однако у него есть серьёзный недостаток, и вот с чем он связан. Рассмотрим функцию потерь, которая сильно вытянута. Я здесь нарисовал очень простой пример плохой функции потерь с которой у градиентного спуска будут большие проблемы. В чём заключаются проблемы? Допустим, мы начинаем некоторой точке (вот, мы в ней находимся). Мы посчитали градиент в этой точке, и теперь мы хотим сделать шаг в направлении, противоположном направлению градиента (и мы его делаем). Вот, мы сделали один шаг, теперь посчитаем градиент в этой точке. Градиент в этой новой точке будет направлен практически в противоположном направлении, а по значению будет примерно таким же, как градиент начальной точки. И теперь мы делаем шаг согласно алгоритму нашего градиентного спуска. И, вот, через две итерации мы оказываемся в точке, которая совсем недалеко находится от начальной нашей точки. Если мы продолжим делать так дальше, то получим некоторую зигзагообразную траекторию. Для того, чтобы найти минимум при помощи этого алгоритма, потребуется очень много времени вот для такой простой функции потерь, и с этим надо что-то делать, потому что очень долго обучать нейронную сеть -- это затратно, мы хотим это делать как-то поумнее. И здесь нам на помощь приходит физическая аналогия -- аналогия катящегося шара. Если мы возьмём чашу, которая вот так же вытянута как эта функция потерь, и положим в некоторую её точку шар, то этот шар будет сначала катиться в направлении градиента. Однако затем он достаточно быстро начинает катиться в сторону минимума -- он сделать здесь несколько витков, однако рано или поздно он скатится к самому минимуму, и это произойдет гораздо быстрее чем если мы будем вот так вот перемещаться по зигзагообразной траектории. Давайте попробуем смоделировать вот такое поведение шара в виде оптимизационного алгоритма. Итак, для того чтобы описать как движется шар вот в таком случае нам потребуются два уравнения. Первое уравнение -- это Второй закон Ньютона: ускорение равно "1" делить на массу умножить на силу, которая действует на шар или материальную точку. И второе уравнение -- это уравнение, которое просто является определением понятия скорости: изменение координаты объекта за единицу времени равняется скорости. Первое уравнение можно расписать немножко более подробно. Первая сила, которая входит в это уравнение -- это потенциальная сила, которая задана нашей лосс-функцией. Эта сила равна "минус градиент нашей лосс-функции", или "минус градиент потенциала", потому что эта сила потенциальна. Вторая сила, которая здесь есть -- это сила трения, причем это сила именно вязкого трения. Таким образом, первое уравнение расписывается следующим образом: "-1 делить на m градиент f" так происходит потому, что F равняется "минус градиент потенциала f", и "f" в нашем случае -- это просто лосс-функция. А сила трения (сила вязкого трения) равна по определению "-эта умножить на скорость", где "эта" -- это коэффициент вязкого трения. Почему минус? Потому что то сила вязкого трения сопротивляется движению, то есть если у нас шар движется, то сила вязкого трения старается его остановить, уменьшает скорость. Итак, мы получили первое уравнение системы уравнений движения шара. Второе уравнение мы оставим, как оно есть сейчас. Для решения системы дифференциальных уравнений (вот таких) мы будем использовать метод конечных разностей. Метод конечных разностей -- это очень эффективный метод, который используется для численного решения дифференциальных уравнений. Что такое "метод конечных разностей"? Рассмотрим определение производной: производная некоторой функции f по её аргументу будет равна пределу (при "дельта x" стремящемуся к нулю) приращения функции в точке, в которой мы ищем производную, ищем производную, делить на приращение аргумента. Из этого определения мы уберём предел, и получим конечную разность. Вот таким образом при помощи конечной разности можно приблизить производную некоторой функции.
К сожалению, у нас пока нет статистики ответов на данный вопрос,
но мы работаем над этим.