Это первая часть серии статей: «Что мне больше всего нравится в моей любимой библиотеке глубокого обучения fastai».

Этот выпуск: Скорость обучения (LR)

LR перед фастай

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

Примечание: поскольку я познакомился с Fastai в начале своей карьеры в области глубокого обучения, я мало что знаю о том, как что-то делается без / до fastai, поэтому, пожалуйста, дайте мне знать, если это было немного неточно, также отнеситесь к этому разделу с зерном соли.

Путь фастай

На быстрый путь к LR повлияла статья Лесли Смита [1]. В основном есть 3 компонента для поиска лучшего LR, нахождения оптимального LR для обучения (объясняется в разделе поиска LR), по мере продвижения обучения, уменьшения LR (объяснено в разделе отжига LR) и несколько предостережений по переносу обучения (объяснено в дискриминационный LR) и обучение за один цикл (часть отжига LR).

Какой должна быть наша скорость обучения?
Это важный вопрос, который следует задать, поскольку скорость обучения - это то, что приводит параметры нашей модели к оптимальным решениям. Если слишком мало, изучение займет слишком много времени. Если слишком высоко, модель будет НЕ ДАЖЕ учиться. Нам нужна скорость обучения в диапазоне значений, которая приводит параметры к конвергенции, при этом делая это в разумных темпах.

LR найти

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

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

Выбор LR с наименьшими потерями ошибочен. Нам нужен LR, при котором потери уменьшаются быстрее всего. Это также самая крутая часть графика. Fastai реализует функцию, чтобы найти как самый крутой, так и минимальный LR, деленный на 10 (что также является хорошим LR для тренировки).

learn.lr_find() [docs]

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

LR отжиг

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

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

Это аналогично гольфу. Вы не пытаетесь пробить лунку (вы могли бы, но это больше удача, чем умение), вы просто пытаетесь подбросить мяч как можно дальше в общем направлении лунки. И по мере того, как вы приближаетесь, вы меняете свои булавы, чтобы добиться большей точности и контроля, и ищите более мелкие шаги, каждый шаг приближая вас к лунке.

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

Этот процесс изменения LR во время обучения называется распадом LR / отжигом LR. На рисунке ниже показаны большие начальные шаги в сравнении с меньшими конечными шагами.

Подходит для одного цикла

В настоящее время общее мнение о сложности обучения на основе GD (градиентного спуска) состоит в том, что оптимизатор может застрять в седловых точках. Это отличается от того, что мы раньше считали главной проблемой (локальные минимумы). Лесли Смит показывает в [3], что увеличение LR помогает избежать седловых точек и достичь хорошей области функции потерь, после чего мы снова уменьшаем LR по причинам, объясненным в разделе LR отжиг. Однако есть один заключительный шаг к подходу подгонки одного цикла, как объяснил Сильвен Гуггер здесь, который заключается в уменьшении LR до одной сотой минимального LR для последних нескольких итераций. Также известен как аннигиляция.

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

fit_one_cycle(learn:Learner, cyc_len:int, max_lr:Union[float, Collection[float], slice]=slice(None, 0.003, None), moms:Point=(0.95, 0.85), div_factor:float=25.0, pct_start:float=0.3, final_div:float=None, wd:float=None, callbacks:Optional[Collection[Callback]]=None, tot_epochs:int=None, start_epoch:int=None) [docs]

Есть 2 основных параметра, которые нужно использовать при планировании LR, что мы и делаем во время политики одного цикла. А это импульс и размер шага. Для получения дополнительной информации и дальнейшего чтения о том, как планируется LR, отметьте здесь.

Дискриминационный LR (во время трансферного обучения)

Трансферное обучение - это процесс использования нейронной сети, обученной для одной задачи, для выполнения другой задачи после минимального обучения. Это чрезвычайно полезно по причинам, которые я сейчас объясню.

Цайлер и Фергус опубликовали потрясающую статью под названием «Визуализация и понимание сверточных сетей» [2], в которой они показывают, чему учатся разные слои нейронной сети, и визуализируют то, что изучается разными слоями. На изображении ниже мы видим, что первый слой распознает основные линии, цвета и цветовые градиенты. Второй уровень распознает более сложные формы, такие как края и круги, а затем на третьем уровне сеть начинает распознавать шаблоны.

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

И фастай для этого отлично подходит. Подход fastai к переносному обучению состоит из двух шагов.

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

Четыре строки кода для передачи обучения с быстрым ИИ:

learn = cnn_learner(dls, resnet34, metrics=error_rate) 
#import a model of your choice, pretrained on imagenet (default)
learn.fit_one_cycle(3, 3e-3) 
#train the last few layers of model
learn.unfreeze() 
#unfreeze the model, so we can train all layers
learn.fit_one_cycle(12, lr_max=slice(1e-6,1e-4))
# use a lr_max, which uses lowest value of LR for first layer
# and increments LR for later layers

График ниже представляет собой график зависимости LR от потерь после размораживания модели. Как мы видим, крутого спуска потерь нет, это соответствует нашей идее о том, что начальные слои усвоили полезную информацию. Отсюда и низкие потери даже на старте, и постепенное снижение.

Метод выбора LR остается прежним, минимум / 10 или точка наискорейшего спуска.

использованная литература

[1]. Лесли Н. Смит, Дисциплинированный подход к гиперпараметрам нейронной сети: Часть 1 - скорость обучения, размер пакета, импульс и распад веса (2018 ), arXiv: 1803.09820

[2]. Мэтью Д. Цайлер, Роб Фергус, Визуализация и понимание сверточных сетей (2013), arXiv: 1311.2901

[3]. Лесли Н. Смит, Циклические курсы обучения для обучения нейронных сетей (2017), arXiv: 1506.01186