Оптимизатор 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. Об этом я расскажу в следующей статье.