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

Трансферное обучение

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

Это проверенный метод, позволяющий добиться гораздо лучших результатов при решении задач компьютерного зрения. Большинство предварительно обученных архитектур (Resnet, VGG, начальная и т. Д.) Обучаются в ImageNet, и в зависимости от сходства ваших данных с изображениями в ImageNet, эти веса необходимо будет изменить более или менее значительно.

В курсе fast.ai Джереми Ховард исследует различные стратегии скорости обучения для трансферного обучения для повышения производительности модели с точки зрения как скорости, так и точности.

1. Дифференциальное обучение

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

Фраза «Различная скорость обучения» подразумевает использование разных скоростей обучения в разных частях сети с более низкой скоростью обучения на начальных уровнях и постепенным увеличением скорости обучения на более поздних уровнях.

Внедрение дифференциальной скорости обучения в Керасе

Чтобы реализовать дифференциальное обучение в Keras, нам нужно изменить исходный код оптимизатора.

Мы модифицируем приведенный выше исходный код, чтобы включить следующее:

  • В функцию __init__ внесены следующие изменения:
  1. Разделить слои: split_1 и split_2 - это названия слоев, в которых должно быть выполнено первое и второе разделение соответственно.
  2. Параметр lr изменен, чтобы принимать список скоростей обучения - принимается список из 3 скоростей обучения (поскольку архитектура разделена на 3 разных сегмента)
  • При обновлении скорости обучения каждого слоя исходный код проходит через все слои и назначает ему скорость обучения. Мы изменили это, чтобы включить разную скорость обучения для разных уровней.

2. Стохастический градиентный спуск с перезапусками (SGDR)

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

SGDR - это недавний вариант отжига скорости обучения, который был представлен Лощиловым и Хаттером [5] в их статье «Sgdr: стохастический градиентный спуск с перезапусками». В этой технике мы время от времени резко увеличиваем скорость обучения. Ниже приведен пример сброса скорости обучения для трех равномерно распределенных интервалов с косинусоидальным отжигом.

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

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

Внедрение SGDR в Керасе

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

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