Выбор скорости обучения

85

В настоящее время я работаю над внедрением Stochastic Gradient Descent, SGDдля нейронных сетей, использующих обратное распространение, и, хотя я понимаю его назначение, у меня есть несколько вопросов о том, как выбрать значения для скорости обучения.

  • Связана ли скорость обучения с формой градиента ошибки, так как он определяет скорость снижения?
  • Если да, то как вы используете эту информацию, чтобы сообщить свое решение о стоимости?
  • Если это не то, какие ценности я должен выбрать, и как я должен выбрать их?
  • Кажется, что вы хотели бы, чтобы маленькие значения избегали перерегулирования, но как выбрать одно из таких значений, чтобы вы не застряли в локальных минимумах или не заняли много времени, чтобы спуститься?
  • Имеет ли смысл иметь постоянную скорость обучения, или я должен использовать какую-то метрику для изменения ее значения по мере приближения к минимуму в градиенте?

Вкратце: как выбрать курс обучения для SGD?

ragingSloth
источник

Ответы:

69
  • Связана ли скорость обучения с формой градиента ошибки, так как он определяет скорость снижения?

    • В простом SGD ответ - нет. Используется глобальная скорость обучения, которая не зависит от градиента ошибок. Однако интуиция, к которой вы стремитесь, вдохновила различные модификации правила обновления SGD.
  • Если да, то как вы используете эту информацию, чтобы сообщить свое решение о стоимости?

    • Adagrad является наиболее широко известным из них и масштабирует глобальную скорость обучения η для каждого измерения на основе l2 нормы истории градиента ошибок gt для каждого измерения:

      введите описание изображения здесь

    • Adadelta - это еще один такой алгоритм обучения, который использует как историю градиента ошибок, такую ​​как adagrad, так и историю обновления веса, и имеет то преимущество, что ему вообще не нужно устанавливать скорость обучения .

  • Если это не то, какие ценности я должен выбрать, и как я должен выбрать их?

    • Задание скорости обучения для простого SGD в нейронных сетях обычно представляет собой процесс, начинающийся с нормального значения, такого как 0,01, и затем выполняющий перекрестную проверку, чтобы найти оптимальное значение. Типичные значения варьируются в пределах нескольких порядков от 0,0001 до 1.
  • Кажется, что вы хотели бы, чтобы маленькие значения избегали перерегулирования, но как вы выбираете такое, чтобы вы не застревали в локальных минимумах или не спускались слишком долго? Имеет ли смысл иметь постоянную скорость обучения, или я должен использовать какую-то метрику для изменения ее значения по мере приближения к минимуму в градиенте?

    • Как правило, наилучшее значение находится рядом с наивысшей стабильной скоростью обучения, и в процессе обучения используется затухание / отжиг скорости обучения (линейное или экспоненциальное). Причиной этого является то, что на раннем этапе есть четкий сигнал обучения, поэтому агрессивные обновления поощряют исследование, в то время как на более низких скоростях обучения допускается более деликатное использование поверхности локальной ошибки.
Indico
источник
1
На практике вы будете использовать скорость обучения с Adadelta. На некоторых проблемах не работает без.
Байер
Следует отметить, что оптимизатор Adam в наши дни более привычен, чем Adagrad или Adadelta.
E_net4 все еще
22

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

http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf

Что касается вашего 4-го пункта, вы правы в том, что обычно нужно выбирать «сбалансированную» скорость обучения, которая не должна ни превышать, ни сходиться слишком медленно. Можно диагностировать скорость обучения по убыванию функции стоимости для диагностики / точной настройки. На практике Эндрю обычно использует алгоритм L-BFGS (упомянутый на стр. 12), чтобы получить «достаточно хорошую» скорость обучения.

BrNguyen
источник
9

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

Помимо полномасштабной оптимизации гиперпараметров, я хотел бы упомянуть одну методику, которая довольно часто используется для выбора скорости обучения, о которой до сих пор не говорилось. Имитация отжига - это метод оптимизации модели, при котором каждый начинает с большой скорости обучения и постепенно снижает скорость обучения по мере оптимизации. Обычно вы оптимизируете свою модель с большой скоростью обучения (0,1 или около того), а затем постепенно уменьшаете эту скорость, часто на порядок (например, до 0,01, затем до 0,001, 0,0001 и т. Д.).

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

lmjohns3
источник
6

Скопированный из моей магистерской диссертации :

  • Если потеря не уменьшается в течение нескольких эпох, скорость обучения может быть слишком низкой. Процесс оптимизации также может застревать в локальном минимуме.
  • Потеря NAN может быть вызвана слишком высокой скоростью обучения. Другая причина - деление на ноль или логарифм нуля.
  • Отслеживание обновлений веса: Андрей Карпати предложил в 5-й лекции CS231n отслеживать обновления веса, чтобы проверить, правильно ли выбран уровень обучения. Он предполагает, что обновление веса должно быть порядка 10−3. Если обновление веса слишком высокое, тогда скорость обучения должна быть уменьшена. Если обновление веса слишком низкое, то скорость обучения должна быть увеличена.
  • Типичные показатели обучения указаны в [0,1, 0,00001].
Мартин Тома
источник
4

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

В моем отношении есть три варианта размера шага:

  • Один относится ко времени , и каждое измерение должно иметь одинаковый размер шага. Вы могли заметить что-то вроде

αt

в то время как t показывает текущий номер итерации, альфа является гиперпараметром

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

1αβ+s=1t1gs2αβ+s=1tgs2

в то время как альфа и бета являются гиперпараметрами, g демонстрирует градиент

  • последняя комбинация времени и градиента , и это должно быть как

1αβ+s=1t1gs2αβ+s=1tgs2+γt

или же

1αβ+s=1t1gs2αβ+s=1tgs2γt

Надеюсь, что это поможет вам, удачи -)

Джо
источник
У вас есть ссылка на это?
Джон
Вы можете сослаться на часть скорости обучения FTRL, мы можем сформулировать ее с помощью TIME и GRADIENT.
Джо
3

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

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

дилип балинени
источник
3

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

Но эта вещь существует только на fastai / pytorch. Недавно кто-то сделал реализацию keras .

которые в свою очередь основаны на этих документах:

Надеюсь это поможет.

Tenshi
источник
2

Позвольте мне дать краткое введение в другой подход к выбору скорости обучения, основанный на курсе глубокого обучения Джереми Ховарда 1. Если вы хотите копнуть глубже, см. Этот пост .

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

введите описание изображения здесь

103

Дэвид Масип
источник