Упрощение понимания оптимизаторов

Вы сказали оптимизация? - Ого, чувак, это какая-то сверхсложная математика; правильно? правильно? Неправильный! Большинство людей уклоняются от алгоритмов оптимизации, поскольку они в основном достижимы, написав строку кода в PyTorch или TensorFlow. Однако, что касается обучения нейронной сети, алгоритмы оптимизации чаще всего являются факторами, которые вносят наибольший вклад в обученную модель. Они имеют полное право голоса в том, как обновляются веса, что модель изучает, а что отбрасывает.

Глубокое обучение - одна из самых прогрессивных технологий на сегодняшний день. На самом деле нетрудно понять, почему так много людей интересуются искусственным интеллектом или нейронными сетями. Из-за огромного количества материалов курса, доступных в Интернете, новичку крайне сложно выбрать тот, который учит правильно. В результате большое количество людей, интересующихся искусственным интеллектом, редко знает основы.

Углубляясь в тему, глубокое обучение предполагает оптимизацию во многих отношениях и в разных контекстах. Одна из самых сложных проблем оптимизации в Deep Learning - это обучение нейронной сети. Оптимизация, связанная с обучением нейронной сети, вращается вокруг поиска параметра θ, который уменьшает функцию потерь J (θ).

В математической оптимизации и теории принятия решений функция потерь или функция - это функция, которая отображает событие или значения одной или нескольких переменных на вещественное число, интуитивно представляющее некоторую стоимость, связанную с событием - https://en.wikipedia.org/wiki/Loss_function

Одна из наиболее частых ошибок людей заключается в том, что они не могут отличить оптимизацию от обратного распространения. Это действительно сбивает с толку, поэтому позвольте мне рассказать вам об этом. При обратном распространении мы вычисляем градиенты и не обновляем веса на основе этих градиентов. Мы просто вычисляем градиенты. Во время оптимизации мы обновляем веса в соответствии с вычисленными градиентами и алгоритмом, который мы выбрали для оптимизации. Таким образом, алгоритм оптимизации меняется от одной сети к другой, но обратное распространение остается неизменным.

Оптимизация в нейронных сетях отличается от оптимизации, которая наблюдалась в различных моделях машинного обучения. В моделях машинного обучения мы смогли тщательно спроектировать целевую функцию таким образом, чтобы функция потерь была выпуклой, и, таким образом, задача оптимизации была довольно простой. Однако при обучении нейронных сетей все усложняется и выходит из-под контроля из-за следующих часто встречающихся проблем:

  1. Нейронные сети имеют проблемы выпуклой оптимизации большой размерности. В результате мы часто сталкиваемся с седловыми точками с нулевым градиентом. Проблема с седловыми точками состоит в том, что, наблюдая их из одного сечения, мы получаем локальные минимумы, а из другого сечения мы получаем глобальные максимумы.

2. Проблема оптимизации не заканчивается седловыми точками. Скалы в производных целевой функции - еще одна проблема оптимизации, связанная с обучением. В результате умножения нескольких весов мы получаем крутые участки, называемые скалами. Когда алгоритм находится перед таким обрывом, он может сделать слишком большой шаг и может спрыгнуть с обрыва, тем самым нарушив нормальный ход алгоритма.

3. Оптимизация, основанная на вычислениях локального градиента, не выполняется, если локальная поверхность не указывает на глобальные минимумы. Это может произойти, когда производная функции стоимости содержит определенный «обрыв» и не может его преодолеть. Он может перемещаться в пространстве более высоких измерений, но чрезмерное время, затрачиваемое на обучение, сделает сеть слишком медленной.

4. Проблема «исчезающих» и «взрывных» градиентов наблюдается и в нейронных сетях. Исчезающие и увеличивающиеся градиенты возникают, когда нейронная сеть включает в себя многократное умножение одной и той же матрицы (как в RNN), в результате чего получается матрица с высоким показателем степени. Когда собственное разложение матрицы выполняется для получения собственных значений, любое собственное значение, которое не находится в непосредственной близости от 1, либо взорвется (если больше 1), либо исчезнет (если меньше 1), создавая проблему исчезновения и взрыва градиентов.

Таким образом, мы видим, что существует множество проблем, с которыми мы можем столкнуться, если попытаемся оптимизировать и обучить нейронную сеть. К счастью, у нас есть готовые алгоритмы оптимизации, оставленные нам исследователями после месяцев и лет работы. Я буду обсуждать чрезвычайно популярный алгоритм оптимизации SGD. (Стохастический градиентный спуск)

SGD

Стохастический градиентный спуск, вероятно, является одним из наиболее часто используемых алгоритмов оптимизации для глубокого обучения. Чтобы понять стохастический градиентный спуск, мы должны понимать, что такое градиентный спуск. Градиентный спуск означает движение по склону градиента. Как вы «двигаетесь»?

Алгоритм градиентного спуска сначала решает, в какую сторону указывает уклон. Затем он делает шаг в сторону снижения склона. Интуиция, лежащая в основе этого, заключается в том, что мы в конечном итоге стремимся минимизировать функцию затрат и можем получить минимум, когда наклон равен нулю. Но послушайте - максимумы также имеют нулевой наклон! Вот почему мы используем матрицу Гессе. Матрица Гессиана хранит вторую производную функции стоимости и помогает нам отличать максимумы от минимума.

Сейчас в основном существует 3 типа градиентного спуска:

  1. Пакетный градиентный спуск: в этом типе градиентного спуска веса обновляются после оценки всех обучающих выборок.
  2. Онлайн-обучение: в этом типе градиентного спуска веса обновляются, как только оценивается одна обучающая выборка. Обучающие выборки выбираются случайным образом.
  3. Мини-пакетный градиентный спуск (SGD): мини-пакетный градиентный спуск сочетает в себе лучшее из двух миров. В этом случае мы случайным образом отбираем мини-пакет из обучающей выборки и после оценки обновляем веса. Затем мы отбираем еще одну мини-партию, и этот процесс повторяется снова и снова.

Теперь мы знаем, что веса обновляются в зависимости от скорости обучения, которую мы определили. Однако один из наиболее важных факторов, которые мы должны учитывать при написании алгоритма оптимизации SGD (как правило, вы этого не делаете), заключается в том, что скорость обучения должна со временем снижаться.

Снижение скорости обучения необходимо, потому что SGD использует мини-пакеты. Мини-пакеты выбираются из обучающих данных, и такая выборка данных приводит к присутствию шума. Шум не уходит даже тогда, когда мы приходим к минимуму. Таким образом, нам нужно внимательно следить за скоростью обучения, чтобы модель сходилась.

Почему следует использовать SGD, а не градиентный спуск (пакетный)?

Нейронным сетям для правильной работы требуется большой объем данных. Данные для обучения, необходимые даже в простом классификаторе, намного больше по сравнению с моделями машинного обучения. Использование градиентного спуска с огромным набором обучающих примеров было бы довольно затратным с точки зрения вычислений и увеличило бы время обучения экспоненциально. Одной из основных особенностей SGD и использования мини-пакетных моделей является то, что время обучения на обновление не увеличивается с увеличением данных обучения. Это чрезвычайно полезно, поскольку мы наконец можем преодолеть ограничение, установленное градиентным спуском на размер обучающих данных, которые мы можем использовать.

Я надеюсь, что эта статья помогла разобраться в концепции алгоритмов оптимизации и их необходимости в области глубокого обучения. Дайте мне знать о любых вопросах в разделе комментариев :)

Ссылка: Глубокое обучение, Ян Гудфеллоу, Йошуа Бенжио, Аарон Курвиль (2017 г.)