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

Здесь мы сконцентрируемся конкретно на гиперпараметре нейронной сети.

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

Так есть ли лучший подход для противодействия этому типу проблем?

Есть несколько подходов, здесь я расскажу об одном из них Keras Tuner.

Так что же такое Keras Tuner?

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

В качестве примера возьмем CIFAR10. Набор данных CIFAR-10 состоит из 60000 цветных изображений 32x32 в 10 классах, по 6000 изображений в каждом классе. Имеется 50000 обучающих изображений и 10000 тестовых изображений.

Итак, приступим!

Базовая производительность

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

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

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

Но для простоты рассмотрим эту архитектуру, так как мы больше сосредоточены на настройке гиперпараметров.

# model architecture
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.25))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

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

Затем настроим потери, показатели и оптимизатор. Скорость обучения также является гиперпараметром, который можно настраивать автоматически, но пока давайте установим его на 0.0001.

# compile the model
model.compile(loss='categorical_crossentropy',
optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
metrics=['accuracy'])

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

Результат не так уж и хорош. Теперь давайте попробуем Keras Tuner на той же архитектуре. А также обратите внимание на время по эпохам, и точность проверки начинается с 27% и достигает 42% примерно для 10 эпох.

Керас тюнер

Сначала установите тюнер keras и импортируйте его

# Install Keras Tuner
!pip install -q -U keras-tuner
import kerastuner as kt

Чтобы выполнить гипертюнинг с помощью Keras Tuner, вам необходимо:

  • Определите модель
  • Выберите гиперпараметры для настройки
  • Определите пространство поиска
  • Определите стратегию поиска

Модель, которую вы настроили для гипертюнинга, называется гипермоделью. При построении этой модели вы определяете пространство поиска гиперпараметров в дополнение к архитектуре модели.

Вы можете определить гипермодель двумя способами:

  • Используя функцию построителя модели
  • Создав подкласс класса Hypermodel API Keras Tuner

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

def model_builder(hp):
'''
Builds the model and sets up the hyperparameters to tune.
Args:
hp - Keras tuner object
Returns:
model with hyperparameters to tune
'''
# Choosing best value for filters
hp_filters=hp.Choice(
'num_filters',
values=[32, 64],
default=64)
# choosing best value for units in dense layer
hP_units=hp.Int(
'units',
min_value=32,
max_value=512,
step=32,
default=128)
# Choosing best value for activation
'''hp_activation=hp.Choice(
'dense_activation',
values=['relu', 'tanh', 'sigmoid'],
default='relu')'''
# Choosing best value for dropouts
hp_dropouts=hp.Choice(
'dropout',
values=[0.25, 0.35, 0.5])
# Initialize the Sequential API and start stacking the layers
model = Sequential()
# Tune the number of units in the first Dense layer
model.add(
Conv2D(hp_filters, kernel_size=3,activation='relu',input_shape=x_train.shape[1:]))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(rate=hp_dropouts))
model.add(Conv2D(hp_filters, 3, activation='relu'))
model.add(MaxPooling2D(pool_size=2))
model.add(Dropout(rate=hp_dropouts))
model.add(Flatten())
model.add(Dense(units=hP_units, activation='relu'))
model.add(Dropout(rate=hp_dropouts))
model.add(Dense(num_classes, activation='softmax'))
# Choose an optimal value between 32-512
# Tune the learning rate for the optimizer
# Choose an optimal value from 0.001, 0.0001, 0.00001 or 0.000001
hp_learning_rate = hp.Choice('learning_rate', values=[ 1e-3, 1e-4, 1e-5,1e-6])
model.compile(optimizer=keras.optimizers.Adam(learning_rate=hp_learning_rate),
loss=keras.losses.SparseCategoricalCrossentropy(),
metrics=['accuracy'])
return model

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

hp_activation=hp.Choice(
'dense_activation',
values=['relu', 'tanh', 'sigmoid'],
default='relu')

Создайте экземпляр тюнера и выполните гипертюнинг

Теперь, когда у нас есть построитель моделей, мы можем определить, как настройщик может найти оптимальный набор гиперпараметров, также называемый стратегией поиска. В Keras Tuner есть четыре тюнера со встроенными стратегиями - RandomSearch, Hyperband, BayesianOptimization и Sklearn.

Здесь я буду использовать тюнер Hyperband. Но вы можете найти другую производительность тюнера, упомянутую в коде, который вы можете проверить в github, ссылка доступна в конце этой статьи.

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

Вам также необходимо определить следующее, чтобы создать экземпляр тюнера Hyperband:

  • гипермодель (построенная функцией построителя модели)
  • objective для оптимизации (например, точность проверки)
  • a directory для сохранения журналов и контрольных точек для каждой пробной версии (конфигурации модели), запускаемой во время поиска гиперпараметров. Если вы повторно запустите поиск гиперпараметров, Keras Tuner использует существующее состояние из этих журналов для возобновления поиска. Чтобы отключить это поведение, передайте дополнительный аргумент overwrite=True при создании экземпляра тюнера.
  • project_name, чтобы отличаться от других пробегов. Он будет использоваться как имя подкаталога под directory.
# Instantiate the Tuner
hyperband_tuner = kt.Hyperband(
model_builder,
max_epochs=5,
seed = 5,
objective='val_accuracy',
directory='hyperband',
project_name='hyperband_cifar10'
)

Мы отобразим сводку поиска, используя tuner.search_space_summary()

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

stop_early = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=5)

Теперь давайте запустим поиск по гиперпараметрам. Это займет некоторое время.

# Perform hypertuning
hyperband_tuner.search(x_train, y_train, epochs=5, validation_split=0.2, callbacks=[stop_early]))

Это попробует комбинацию нашего гиперпараметра и покажет нам лучший на данный момент параметр и лучшую точность, найденную на данный момент.

Мы получим лучший гиперпараметр, используя tuner.get_best_hyperparamters()[0].

И давайте посмотрим на лучший гиперпараметр, выбранный тюнером keras.

Помните, что это значение зависит от вашей архитектуры.

Давайте построим и обучим модель с этими гиперпараметрами, выбранными тюнером Keras.

# Build the model with the optimal hyperparameters
h_model = hyperband_tuner.hypermodel.build(best_hps)
h_model.fit(x_train, y_train,
batch_size=batch_size,
epochs=epochs,
validation_data=(x_test, y_test))

И просто посмотрите на результат: точность проверки для базовой модели была где-то около 44%, а теперь мы получили точность проверки около 71%, результаты потрясающие. И потеря тоже примерно половина.

В первую эпоху это превышало производительность базовой модели.

И результат был всего за 10 эпох, вы можете попробовать запустить его на протяжении 50 или более и дайте мне знать результат.

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

Вы можете найти все в github, и есть много улучшений.

Считайте это бонусной задачей, попробуйте другую архитектуру, варианты, попробуйте с другими эпохами и дайте мне знать о результатах.

Резюме

  1. Keras Tuner - один из мощных инструментов для настройки гиперпараметров, и мы увидели, как хороший набор гиперпараметров может повлиять на вашу точность и общую производительность модели.
  2. Это лучше, чем использовать метод проб и ошибок и сделать процесс более плавным.
  3. Вы можете сосредоточиться на своем коде и архитектуре, а не на настройке гиперпараметров.
  4. Но да, есть компромисс, время для поиска лучшего гиперметра требует времени, которое пропорционально количеству опций, размерности вашего набора данных.
  5. Попробуйте поэкспериментировать с ним и посмотрите, что работает для вас, если производительность модели критична, и рассмотрите возможность использования тюнера keras в своем наборе инструментов.

использованная литература

Вы можете найти код, использованный в этой статье, здесь