Оптимизатор LookAhead делает вашу модель менее чувствительной к выбору гиперпараметров.

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

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

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

Недавно предложенный оптимизатор LookAhead делает процесс оптимизации

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

Похоже, что это стоит изучить!

Алгоритм

Интуитивно алгоритм выбирает направление поиска, глядя вперед на последовательность «быстрых весов», сгенерированных другим оптимизатором.

Оптимизатор поддерживает два набора весов: быстрые веса θ и медленные веса ϕ. Оба они инициализируются одинаковыми значениями. Стандартный оптимизатор (например, Adam, SGD,…) с определенной скоростью обучения η используется для обновления быстрых весов θ для определенного количества шагов k, что приводит к некоторым новым значениям θ’.

Затем происходит решающая вещь: медленные веса ϕ перемещаются в направлении, определяемом разностью векторов весов θ’- ϕ. Длина этого шага регулируется параметром α - скорость обучения медленных весов.

Затем процесс повторяется, начиная с повторной установки значений быстрых весов на вновь вычисленные значения медленных весов ϕ’. Вы можете увидеть псевдокод ниже:

Какой в ​​этом смысл?

Чтобы ответить на этот вопрос, мы изучим (слегка измененную) картинку из публикации LookAhead, но в качестве введения давайте сначала посмотрим на другую картинку. Если бы наша модель имела только три веса, функцию потерь можно было бы легко визуализировать, как на рисунке ниже.

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

Вот что представлено в LookAhead paper:

Мы видим проекцию целевой функции (в данном случае это точность, но это также может быть потеря) на гиперплоскость в пространстве весов. Разные цвета соответствуют разным значениям целевой функции: чем ярче цвет, тем оптимальнее значение. Поведение оптимизатора LookAhead показано следующим образом: синяя пунктирная линия представляет траекторию быстрых весов θ (с синими квадратами, указывающими десять последующих состояний), а фиолетовая линия показывает направление быстрого обновления весов θ’- ϕ. Фиолетовые треугольники обозначают два последовательных значения медленных весов ϕ, ϕ’. Расстояние между треугольниками определяется скоростью обучения медленных весов α.

Мы видим, что стандартный оптимизатор (в данном случае SGD) проходит неоптимальную зеленую область, тогда как второе состояние с медленным весом уже намного ближе к оптимуму. Бумага описывает это более элегантно:

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

Как использовать это в Керасе?

Теперь о практической стороне метода: пока существует только неофициальная реализация Keras, которую можно легко использовать с вашим текущим оптимизатором:

Как видите, помимо самого оптимизатора Lookahead ожидает два аргумента:

  • sync_period, что соответствует ранее введенному k - количеству шагов, после которого два набора весов синхронизируются,
  • slow_step, что соответствует α скорости обучения медленных весов.

Чтобы убедиться, что он работает должным образом, вы можете установить slow_step на 1 и сравнить поведение Lookahead с поведением обычного оптимизатора.

Для α из 1 шаг обновления LookAhead сводится к:

это означает, что LookAhead сводится к базовому стандартному оптимизатору. Мы также можем видеть это на измененном изображении траектории весов:

Теперь конечное состояние для медленных весов такое же, как конечное состояние для быстрых весов.

Вы можете проверить это, используя следующий код:

Последнее слово

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

Считается, что он особенно эффективен в сочетании с Оптимизатором Rectified Adam. Об этом я расскажу в следующей статье.