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

Математическая оптимизация (также известная как математическое программирование) представляет собой совершенно отдельную область исследований и почти так же разнообразна, как и само машинное обучение. Обратитесь к странице wiki для краткого обзора.

Основная цель этой оптимизации (специально для машинного обучения) - минимизировать или максимизировать значение математической функции (также известной как целевая функция, функция потерь или функция стоимости). Пусть функция будет f (x). Результатом минимальной оптимизации этой функции будет значение для x, так что значение функции f (x) будет минимальным.

Самый популярный и самый простой алгоритм, который использовался в машинном обучении, известен как алгоритм «градиентного спуска» (технически говоря, стохастический градиентный спуск, поскольку мы вводим только часть данных для обновления). Это итеративный алгоритм, который обновляет параметры таким образом, что стоимость (значение функции) со временем становится все меньше и меньше. Уравнение обновления градиентного спуска:

х = х - (альфа * dy_dx)

где ‘alpha’ - скорость обучения, которую необходимо настроить вручную, а ‘dy_dx’ - производная от ‘y’ относительно. ‘x’.

За этим последовали огромные исследовательские усилия, чтобы сделать алгоритм градиентного спуска быстрее и лучше. Двумя наиболее известными из них были Momentum и RMSprop. Позже стало ясно, что альфа не должна быть постоянной и должна уменьшаться (математический распад) с течением времени. Все эти исследования привели к созданию текущего стандартного оптимизатора: ADAM. Оптимизация adam сочетает в себе импульс, среднеквадратичное значение и снижение скорости обучения и в настоящее время дает наилучшую производительность оптимизации. Однако у него довольно много параметров (технически гиперпараметры): alpha, beta1, beta2 и epsilon. Хотя параметры beta и epsilon настраиваются редко, они есть.

Полная процедура оптимизатора Adam:

Предпоследний шаг, о котором я не упоминал ранее, известен как коррекция смещения вычисленных моментов.

Совершенно очевидно, что уравнения сложные. Более того, совсем недавно это исследование выявило ряд проблем в алгоритме оптимизации ADAM. Примечательно, что исследовательская работа объявляет ошибку в доказательстве сходимости в исходной статье. Таким образом, теоретически ADAM не сходится даже для задач выпуклой оптимизации. Из-за этого также возникли некоторые проблемы с обобщением модели.

Во многом сложность адама объясняется его производительностью. Я понимаю, что эта сложность возникает из-за того, что измерение затрат считается отдельным от измерений параметров. Здесь мне нравится цитировать понятие пространства-времени (не пространства-времени) из общей теории относительности Эйнштейна. «Пространство и время не разделены, но одно». Следуя этому принципу, я обнаружил, что использование измерения стоимости в уравнении обновления может сильно повлиять на оптимизацию. Я предполагаю, что «измерение стоимости и измерения параметров не являются отдельными и должны использоваться вместе при внесении обновлений во время оптимизации».

С этой мыслью я продолжил свое исследование и нашел уравнение Ньютона-Рафсона для поиска корней.

x = x - (y / dy_dx)

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

Чтобы проверить его достоверность, я попытался запустить его на одномерной функции. И что может быть лучше функции квадрата для проверки?

Пусть y = f (x) = x², как показано ниже:

Выполнение алгоритма Ньютона-Рафсона для этой функции дало очень гладкую кривую оптимизации. Он был получен в результате выполнения алгоритма 50 итераций, начиная с x = 1000.

Стоимость упала до нуля (близко к) менее чем за 10 итераций. Это было многообещающим и убедило меня в наличии некоторого смысла в моей исходной гипотезе.

Возникает вопрос: можем ли мы использовать алгоритм Ньютона-Рафсона непосредственно в машинном обучении? Что ж, ответ - Нет. Но это определенно очень близко.

В случае машинного обучения целевые функции определяются как положительные действительные функции, из-за чего минимальное значение может быть только 0 (или больше), и функция не будет обрезать оси параметров. Он мог только легко прикоснуться к нему. Итак, это идеально подходит для использования Ньютона-Рафсона, верно? Нахождение корня равносильно его минимизации. Не правда ли? Что ж, к сожалению, нельзя гарантировать, что корень существует, и предполагать, что он существует, слишком оптимистично, что я усвоил на собственном горьком опыте.

Я внимательно изучил поведение Адама, чтобы понять, что делает его таким хорошим. И я обнаружил, что член импульса в числителе и член среднеквадратичного значения в знаменателе как бы имитируют поведение обратной производной. Это (а также серия поисков уравнения методом проб и ошибок) привело меня к следующему уравнению обновления.

x = x - ((y * dy_dx) / (y + (dy_dx)²))

Обратите внимание, что (dy_dx) ² - это просто квадрат производной члена, а не производная второго порядка от y wrt. х.

Используя это уравнение для функции квадрата, получилась следующая оптимизационная кривая:

Довольно гладко, верно! Когда дело доходит до уравнений оптимизации, исследование не может быть полным без проверки его на экспоненциальной функции.

Пусть y = f (x) = exp (x)

Честно говоря, я немного волновался, потому что производной от exp (x) является сама по себе. Итак, достаточно ли устойчиво уравнение на непоколебимой, неизменной (доказательство дифференцирования): exp (x)?

Ну да, уравнение устойчиво и при возведении в степень. В следующем разделе я объясню, почему он стабилен.

Лучший способ понять это уравнение - визуализировать трехмерную поверхность члена обновления в уравнении. Поверхность может взаимодействовать с здесь.

Пусть g (k, v) = (k * v) / (k + v²);

В этой функции мы подставляем k = y (т. Е. Стоимость) и v = dy_dx (т. Е. Производная)

Вышеупомянутое изображение - это неподвижный снимок поверхности под пояснительным углом. Измерение x - это измерение стоимости, а y - производное измерение, как определено в функции g (x, y) выше.

Очевидно, что поверхность сужается к плоскости z = 0 по мере удаления в любом направлении по оси y (производная) . Это означает, что обновление замедляется, если наклон становится слишком большим (т.е. слишком крутым); желаемое поведение. Кроме того, поверхность разрезает плоскость z = 0 точно в точке y = 0 (т. Е. Производная = 0). Это показывает, что уравнение стабильно и сходится, когда производная становится равной 0. Наконец, наиболее важной особенностью является то, что свойства этих лент контролируются измерением x (стоимость). Когда стоимость становится равной 0, z также приближается к нулю. Это наиболее желаемое поведение, т.е. алгоритм должен останавливаться при достижении корня (минимального значения).

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

Итак, со всеми этими синтетическими математическими экспериментами, можем ли мы предположить, что уравнение будет использоваться для машинного обучения? Зачем предполагать? Давай попробуем и узнаем.

Я провел эксперимент с самым популярным набором данных машинного обучения: MNIST (Drosophila).

Конфигурация. Классификатор, который я использовал, представляет собой трехуровневую нейронную сеть с функцией активации ReLU. Я не использовал здесь пакетную нормализацию, поскольку сеть довольно мелкая, а входные данные нормализованы. Распределение данных не будет слишком сильно сдвигаться всего на трех уровнях, что дает ReLU достаточно возможностей для создания нелинейных границ. Чтобы упростить задачу, регуляризация не использовалась, поскольку основное внимание уделяется части оптимизации, а не классификации.

Я получил следующий график потерь после запуска алгоритма для 12 эпох:

Важная конфигурация алгоритма, о которой следует упомянуть, - это инициализация весов. В этом эксперименте используется инициализатор Xavier.

Сравнение этой кривой с оптимизатором Adam со всеми гиперпараметрами по умолчанию и при той же конфигурации дает следующие графики:

Я смоделировал так много оптимизаторов, что у тензорной доски закончились цвета, и по совпадению цвета двух оптимизаторов оказались одинаковыми. Итак, тот, что внизу, - это Адам.

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

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

Оранжевая кривая предназначена для инициализации Усеченный нормальный. Судя по изображению, я бы сказал, что TN немного лучше.

Ну, поскольку все это сравнение было сделано только с адамом; Итак, как эта оптимизация работает по сравнению с другими? Ну, я запустил эту конфигурацию для целой группы оптимизаторов из tensorflow:

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

Есть одно важное различие между Адамом и этим алгоритмом оптимизации, которое я наблюдал (как упоминалось ранее): это уравнение оптимизации тренирует более плоское (с широким диапазоном) распределение, которое очень приближается к Распределение Лапласа в отличие от первоначального Гауссова распределения по сравнению с адамом. Следующая вкладка «Гистограммы» TensorBoard предоставляет это свидетельство.

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

На следующем изображении гистограммы Адама сравниваются с инициализированными TN (оранжевыми).

На этом я хотел бы закончить объяснение и сравнение этого алгоритма оптимизации. Я хотел бы выделить два ключевых преимущества этого алгоритма перед адамом: простота и автономность. Еще раз отметим, что я не использовал здесь производные высшего порядка или гессианы.

Код этого эксперимента можно найти в моем репозитории здесь в разделе IDEA_2.

Итак, алгоритм сейчас апробирован теоретически и практически. Учитывая многообещающие результаты по MNIST, было бы интересно посмотреть, насколько далеко это может зайти для более крупных моделей, таких как CNN, ResNet, RNN и т. Д.

На протяжении всей работы я придерживался принципа бритвы Оккама. Я считаю, что «Простота - это ключ»!