Оптимизация Hyperparameter для глубоких обучающих структур с использованием байесовской оптимизации

Я построил структуру CLDNN (свертка, LSTM, глубокая нейронная сеть) для задачи классификации необработанных сигналов.

Каждая тренировочная эпоха длится около 90 секунд, и гиперпараметры, кажется, очень трудно оптимизировать.

Я изучал различные способы оптимизации гиперпараметров (например, случайный или сетевой поиск) и узнал о байесовской оптимизации.

Хотя я все еще не полностью понимаю алгоритм оптимизации, я кормлю, как будто это мне очень поможет.

Я хотел бы задать несколько вопросов относительно задачи оптимизации.

  • Как настроить байесовскую оптимизацию в отношении глубокой сети? (Какую функцию затрат мы пытаемся оптимизировать?)
  • Какую функцию я пытаюсь оптимизировать? Это стоимость проверки, установленная после N эпох?
  • Является ли мясная мята хорошей отправной точкой для этой задачи? Любые другие предложения для этой задачи?

Я бы очень признателен за понимание этой проблемы.

Ответы

Ответ 1

Хотя я все еще не полностью понимаю оптимизацию алгоритм, я питаюсь, как это очень поможет мне.

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

Байесовские методы оптимизации (например, PI, EI, UCB), построят модель целевой функции, используя Gaussian Process (GP) и в каждый шаг выбирает наиболее "перспективную" точку, основанную на их модели GP (обратите внимание, что "многообещающий" может быть определен по-разному различными методами).

Вот пример:

sin (x) * x

Истинная функция f(x) = x * sin(x) (черная кривая) в интервале [-10, 10]. Красные точки представляют собой каждое испытание, красная кривая - среднее значение GP, синяя кривая - среднее плюс или минус одно стандартное отклонение. Как вы можете видеть, модель GP не всегда соответствует истинной функции, но оптимизатор довольно быстро идентифицировал "горячую" область вокруг -8 и начал ее использовать.

Как настроить байесовскую оптимизацию в отношении глубокого сеть?

В этом случае пространство определяется (возможно, преобразованными) гиперпараметрами, обычно многомерным единичным гиперкубом.

Например, предположим, что у вас есть три гиперпараметра: скорость обучения α in [0.001, 0.01], регуляризатор λ in [0.1, 1] (как непрерывный), так и размер скрытого слоя N in [50..100] (целое число). Пространством для оптимизации является 3-мерный куб [0, 1]*[0, 1]*[0, 1]. Каждая точка (p0, p1, p2) в этом кубе соответствует троице (α, λ, N) следующим преобразованием:

p0 -> α = 10**(p0-3)
p1 -> λ = 10**(p1-1)
p2 -> N = int(p2*50 + 50)

Какую функцию я пытаюсь оптимизировать? Это стоимость подтверждение, установленное после N эпох?

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

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

Является ли мясная мята хорошей отправной точкой для этой задачи? Любой другой предложения по этой задаче?

spearmint - хорошая библиотека, вы можете определенно работать с этим. Я также могу рекомендовать hyperopt.

В своем собственном исследовании я закончил писать свою небольшую библиотеку, в основном по двум причинам: я хотел закодировать точный байесовский метод для использования (в частности, я нашел стратегия портфеля UCB и PI конвергировались быстрее, чем что-либо еще, в моем случае); плюс есть еще один способ, который может сэкономить до 50% времени обучения под названием предсказание кривой обучения (идея состоит в том, чтобы пропустить полный цикл обучения, когда оптимизатор уверен, что модель не учится так же быстро, как в других областях). Я не знаю ни одной библиотеки, которая ее реализует, поэтому я сама ее закодировала, и в итоге она окупилась. Если вам интересно, код на GitHub.