В настоящее время я работаю над внедрением Stochastic Gradient Descent, SGD
для нейронных сетей, использующих обратное распространение, и, хотя я понимаю его назначение, у меня есть несколько вопросов о том, как выбрать значения для скорости обучения.
- Связана ли скорость обучения с формой градиента ошибки, так как он определяет скорость снижения?
- Если да, то как вы используете эту информацию, чтобы сообщить свое решение о стоимости?
- Если это не то, какие ценности я должен выбрать, и как я должен выбрать их?
- Кажется, что вы хотели бы, чтобы маленькие значения избегали перерегулирования, но как выбрать одно из таких значений, чтобы вы не застряли в локальных минимумах или не заняли много времени, чтобы спуститься?
- Имеет ли смысл иметь постоянную скорость обучения, или я должен использовать какую-то метрику для изменения ее значения по мере приближения к минимуму в градиенте?
Вкратце: как выбрать курс обучения для SGD?
Ниже очень хорошая заметка (стр. 12) о скорости обучения в нейронных сетях (обратное распространение) Эндрю Нг. Вы найдете детали, касающиеся скорости обучения.
http://web.stanford.edu/class/cs294a/sparseAutoencoder_2011new.pdf
Что касается вашего 4-го пункта, вы правы в том, что обычно нужно выбирать «сбалансированную» скорость обучения, которая не должна ни превышать, ни сходиться слишком медленно. Можно диагностировать скорость обучения по убыванию функции стоимости для диагностики / точной настройки. На практике Эндрю обычно использует алгоритм L-BFGS (упомянутый на стр. 12), чтобы получить «достаточно хорошую» скорость обучения.
источник
Выбор скорости обучения является примером "мета-проблемы", известной как оптимизация гиперпараметров . Наилучшая скорость обучения зависит от рассматриваемой проблемы, а также от архитектуры оптимизируемой модели и даже от состояния модели в текущем процессе оптимизации! Есть даже пакеты программ , посвященных оптимизации гиперпараметр , такие как мята и hyperopt (всего пару примеров, есть много других!).
Помимо полномасштабной оптимизации гиперпараметров, я хотел бы упомянуть одну методику, которая довольно часто используется для выбора скорости обучения, о которой до сих пор не говорилось. Имитация отжига - это метод оптимизации модели, при котором каждый начинает с большой скорости обучения и постепенно снижает скорость обучения по мере оптимизации. Обычно вы оптимизируете свою модель с большой скоростью обучения (0,1 или около того), а затем постепенно уменьшаете эту скорость, часто на порядок (например, до 0,01, затем до 0,001, 0,0001 и т. Д.).
Это можно сочетать с ранним прекращением работы, чтобы оптимизировать модель с одной скоростью обучения, если прогресс достигнут, а затем переключиться на меньшую скорость обучения, как только прогресс замедляется. Похоже, что более высокие скорости обучения помогают модели находить области общей крупномасштабной оптимумы, тогда как меньшие скорости помогают модели сосредоточиться на одном конкретном локальном оптимуме.
источник
Скопированный из моей магистерской диссертации :
источник
Скорость обучения, трансформируемая как «размер шага» во время нашего итерационного процесса, была горячей проблемой в течение многих лет, и она будет продолжаться.
В моем отношении есть три варианта размера шага:
в то время как t показывает текущий номер итерации, альфа является гиперпараметром
в то время как альфа и бета являются гиперпараметрами, g демонстрирует градиент
или же
Надеюсь, что это поможет вам, удачи -)
источник
Нейронные сети часто обучаются градиентным спуском по весам. Это означает, что на каждой итерации мы используем обратное распространение для вычисления производной функции потерь по каждому весу и вычитания ее из этого веса. Однако, если вы на самом деле попробуете это, веса будут слишком сильно меняться в каждой итерации, что сделает их «чрезмерно корректными», и потери будут на самом деле увеличиваться / расходиться. Таким образом, на практике люди обычно умножают каждую производную на небольшое значение, называемое «скоростью обучения», прежде чем вычесть ее из соответствующего веса.
Вы также можете думать о функции потери нейронных сетей как о поверхности, где каждое направление, в котором вы можете двигаться, представляет собой значение веса. Градиентный спуск - это как прыжки в текущем направлении склона, а скорость обучения - как длина прыжка, который вы совершаете.
источник
В дополнение к ответу Дэвида, в fastai я нашел концепцию определения наилучшей скорости обучения для этих данных с использованием определенной архитектуры.
Но эта вещь существует только на fastai / pytorch. Недавно кто-то сделал реализацию keras .
которые в свою очередь основаны на этих документах:
Надеюсь это поможет.
источник
Позвольте мне дать краткое введение в другой подход к выбору скорости обучения, основанный на курсе глубокого обучения Джереми Ховарда 1. Если вы хотите копнуть глубже, см. Этот пост .
Скорость обучения, предложенная в курсе Джереми Ховарда, основана на систематическом способе пробовать разные скорости обучения и выбирать тот, который делает функцию потери наиболее сниженной. Это делается путем подачи многих партий в метод мини-пакетного градиентного спуска и увеличения скорости обучения для каждой новой партии, которую вы передаете этому методу. Когда скорость обучения очень мала, функция потерь будет уменьшаться очень медленно. Когда скорость обучения очень велика, функция потерь увеличивается. Между этими двумя режимами существует оптимальная скорость обучения, при которой функция потерь уменьшается быстрее всего. Это можно увидеть на следующем рисунке:
источник