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

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

Пока я видел много разных гиперпараметров, которые мне нужно настроить:

  • Уровень обучения: начальная скорость обучения, распад обучения
  • AdamOptimizer нуждается в 4 аргументах (скорость обучения, beta1, beta2, epsilon), поэтому нам нужно настроить их - по крайней мере, epsilon
  • размер партии
  • nb итераций
  • Lambda L2 - параметр регуляризации
  • Количество нейронов, количество слоев
  • какая функция активации для скрытых слоев, для выходного уровня
  • параметр отсечки

У меня есть 2 вопроса:

1) Видите ли вы какой-либо другой гиперпараметр, который я мог бы забыть?

2) На данный момент моя настройка довольно "ручная", и я не уверен, что я не делаю все правильно. Есть ли специальный заказ для настройки параметров? Например, скорость обучения сначала, затем размер партии, тогда... Я не уверен, что все эти параметры независимы - на самом деле, я совершенно уверен, что некоторые из них не являются. Какие из них явно независимы и какие из них явно не являются независимыми? Должны ли мы затем настроить их вместе? Есть ли какая-либо бумага или статья, в которой говорится о правильной настройке всех параметров в специальном порядке?

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

точность

Стоимость

Для скорости обучения я использовал распад: LR (t) = LRI/sqrt (epoch)

Спасибо за вашу помощь ! Павел

Ответы

Ответ 1

Мой общий порядок:

  1. Размер партии, так как это в значительной степени повлияет на время обучения будущих экспериментов.
  2. Архитектура сети:
    • Количество нейронов в сети
    • Количество слоев
  3. Отдых (выпадение, регистр L2 и т.д.)

зависимости:

Я бы предположил, что оптимальные значения

  • скорость обучения и размер партии
  • скорость обучения и количество нейронов
  • количество нейронов и количество слоев

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

Что касается ваших гиперпараметров:

  • Для оптимизатора Адама: "Рекомендуемые значения в документе: eps = 1e-8, beta1 = 0,9, beta2 = 0,999". (источник)
  • Для скорости обучения с Адамом и RMSProp я нашел значения около 0,001, чтобы быть оптимальным для большинства проблем.
  • В качестве альтернативы Адаму вы также можете использовать RMSProp, что уменьшает площадь памяти до 33%. См. Этот ответ для получения более подробной информации.
  • Вы также можете настроить начальные значения веса (см. Все, что вам нужно, это хороший init). Хотя, инициализатор Xavier, похоже, является хорошим способом предотвратить настройку веса.
  • Я не настраиваю число итераций/эпох как гиперпараметр. Я тренирую сеть до тех пор, пока ее ошибка проверки не сходится. Тем не менее, я даю каждому пробегу бюджет времени.

Ответ 2

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

Ответ 3

Для менее важных параметров вы, вероятно, можете выбрать разумную ценность и придерживаться ее.

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

Ответ 4

Я не знаю какого-либо инструмента, специфичного для тензорного потока, но наилучшей стратегией является сначала начать с основных гиперпараметров, таких как скорость обучения 0,01, 0,001, вес = 0,0005, 0,0005. А затем настройте их. Выполнение этого вручную займет много времени, если вы используете caffe, следующий - лучший вариант, который будет принимать гиперпараметры из набора входных значений и даст вам наилучший набор.

https://github.com/kuz/caffe-with-spearmint

для получения дополнительной информации вы также можете следовать этому руководству:

http://fastml.com/optimizing-hyperparams-with-hyperopt/

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