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

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

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

SGDR использует косинусный отжиг, который снижает скорость обучения в виде половины косинусной кривой, например:

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

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

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

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

Даже если другой набор данных немного изменит функцию потерь, потери останутся относительно стабильными:

Этот более плоский желоб лучше, поскольку он предлагает как точное, так и стабильное решение. Это более обобщенный; то есть у него более высокая способность реагировать на новые данные. Чтобы найти более стабильный локальный минимум, мы можем время от времени увеличивать скорость обучения, поощряя модель «прыгать» от одного локального минимума к другому, если он находится в крутой впадине. Это «перезапуски» в SGDR.

В первом периоде «полукосинуса» на графике выше мы спускаемся в локальный минимум, например:

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

Во втором периоде «полукосинуса» мы спускаемся в другой локальный минимум.

А потом снова резко увеличиваем скорость обучения. Только на этот раз, поскольку мы находимся в более стабильной области функции потерь, этот «перезапуск» не выводит нас из локального минимума:

Наконец, мы снова постепенно уменьшаем скорость обучения, пока не минимизируем функцию потерь, найдя устойчивое решение.

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

Чтобы визуализировать это в 3D, вот две модели:

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

Вы также можете увеличивать длину цикла после каждого цикла, например:

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