Вопрос

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

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

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

Это было полезно?

Решение

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

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

    • Адаград является наиболее широко известным из них и масштабирует глобальный уровень обучения η В каждом измерении, основанном на норме L2 истории градиента ошибок гт В каждом измерении:

      enter image description here

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

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

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

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

Другие советы

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

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

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

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

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

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

Копировано из моя магистерская диссертация:

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

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

Есть три варианта для размера шага в моих отношениях:

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

$ it turne bf frac { alpha} { sqrt {t}} $

В то время как T демонстрирует текущее число итерации, Alpha - гипер -параметр

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

$ it turne frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s}^2}}}} - frac { alpha} { beta + sqrt { sum_ {s = 1}^{t} {g_ {s}^2}}}} $

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

  • Последний - это сочетание времени и градиента , и это должно быть похоже

$ it turne frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s}^2}}}} - frac { alpha} { beta + sqrt { sum_ {s = 1}^{t} {g_ {s}^2}}}} + frac { gamma} { sqrt {t}} $

или же

$ it turne frac {1} { frac { alpha} { beta + sqrt { sum_ {s = 1}^{t - 1} {g_ {s}^2}}}} - frac { alpha} { beta + sqrt { sum_ {s = 1}^{t} {g_ {s}^2}}}} * frac { gamma} { sqrt {t}} $

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

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

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

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

Но эта вещь существует только на Fastai/Pytorch. Недавно кто -то сделал керас реализация.

что, в свою очередь, основано на этих статьях:

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

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

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

enter image description here

Мы видим, что потеря уменьшается очень быстро, когда ставка обучения составляет около 10 долларов^{-3} $. Используя этот подход, у нас есть общий способ выбрать приближение для наилучшего постоянного уровня обучения для нашего NetWork.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с datascience.stackexchange
scroll top