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

Описание статьи

  • Вступление
  • О наборе данных
  • Загрузка набора данных
  • Предварительная обработка данных
  • Настройка конфигурации модели
  • Стратегия настройки модели
  • Определение лучших параметров модели
  • Переподготовка по лучшим параметрам
  • Получение среднего и стандартного отклонения CV-балла
  • Учебный код

Вступление

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

Это технология, используемая в беспилотных автомобилях, распознавание речи в Siri, Alexa или Google, добавление тегов к фотографиям на Facebook, рекомендации песен в Spotify и механизмы рекомендаций по продуктам. Теперь даже исследователи используют глубокое обучение для понимания сложных закономерностей в данных, например, для обнаружения глаукомы у пациентов с диабетом, управления стихийными бедствиями (прогнозирование землетрясений и наводнений), разработки новых материалов, обнаружения фальшивых новостей, робототехники и биомеханики. Чтобы лучше понять практическое применение глубокого обучения, я рекомендую вам посмотреть сериал YouTube Эпоха искусственного интеллекта.

Существует множество инструментов для обучения глубоких нейронных сетей. Для исследовательской работы исследователи используют язык программирования и библиотеки / пакеты для реализации таких сложных моделей, поскольку это обеспечивает большую гибкость и позволяет изменять модель в соответствии с требованиями работы. В настоящее время обучить глубокую нейронную сеть очень просто, спасибо Франсуа Шолле за разработку библиотеки глубокого обучения Keras. Используя Keras, можно реализовать модель глубокой нейронной сети с помощью нескольких строк кода.

Проблема начинается, когда вам, как исследователю, нужно найти лучший набор гиперпараметров, который дает вам наиболее точную модель / решение. Проверка каждого набора параметров вручную может занять очень много времени и утомить. Здесь в качестве удобного инструмента выступает класс KerasRegressor, который действует как оболочка для библиотеки scikit-learn в Keras. для автоматизации процесса настройки.

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

О наборе данных

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

Следовательно, в этой статье мы собираемся использовать конкретный набор данных [1], полученный из библиотеки машинного обучения UCI.

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

I1: Цемент (C1): кг в смеси m3
I2: Доменный шлак (C2): кг в смеси m3
I3: Летучая зола (C3): кг в смеси m3
I4: Вода (C4): кг в смеси м3
I5: Суперпластификатор (C5): кг в смеси м3
I6: Крупнозернистый заполнитель (C6): кг в смеси м3
I7: Мелкозернистый заполнитель (C7): кг на м3 смеси
I8: Возраст: День (1 ~ 365)
O1: Прочность бетона на сжатие: МПа

Где I: ввод; O: выход, C: компонент; м3: метр куб и МПа: мегапаскаль.

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

Бетон

Бетон состоит из трех основных компонентов: воды, заполнителя (камня, песка или гравия) и цемента. Цемент действует как связующее при смешивании с водой и заполнителями.

Прочность на сжатие

Прочность на сжатие - один из важнейших параметров, определяющих рабочие характеристики строительного материала. Бетонная смесь, разработанная для обеспечения требуемых характеристик и долговечности для конкретных строительных работ / проекта. Прочность бетона на сжатие определяют в лабораториях, чтобы сохранить желаемое качество бетона во время заливки. Прочность на сжатие рассчитывается путем деления разрушающей нагрузки на область приложения нагрузки, обычно через 28 дней (I8: возраст) периода отверждения. Хотя исследователи также сообщают о силе после 7, 14 и 21 дня периода лечения. Прочность бетона достигается за счет регулирования доли цемента (C1), мелких (C7) и крупных (C6) заполнителей, воды и различных добавок. Характеристическая прочность на сжатие бетона fc / fck обычно указывается в МПа (O1). Для нормальной конструкции характерная прочность на сжатие может варьироваться от 10 до 60 МПа; в то время как для определенной конструкции требование может превышать 600 МПа.

смесь

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

Аналогичным образом измельченный гранулированный доменный шлак (C2), минеральная добавка, добавляется в бетон для улучшения его свойств, таких как удобоукладываемость, прочность и долговечность.

Суперпластификаторы

Суперпластификаторы (высокодисперсные водоредукторы) используются в бетонных смесях для изготовления высокопрочного и долговечного бетона. Суперпластификаторы (C5) представляют собой водорастворимые органические вещества, которые уменьшают количество воды, необходимое для достижения определенной стабильности бетона, уменьшают водоцементное соотношение, уменьшают содержание цемента и увеличивают осадку. Использование суперпластификаторов снижает потребность в воде до 30% без потери удобоукладываемости.

Цель

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

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

Загрузка соответствующих библиотек

Самый первый шаг - загрузить соответствующие библиотеки Python.

import numpy as np                #for array manipulation
import pandas as pd               #data manipulation
from sklearn import preprocessing #scaling
import keras
from keras.layers import Dense    #for Dense layers
from keras.layers import BatchNormalization #for batch normalization
from keras.layers import Dropout            #for random dropout
from keras.models import Sequential #for sequential implementation
from keras.optimizers import Adam   #for adam optimizer
from keras import regularizers      #for l2 regularization
from keras.wrappers.scikit_learn import KerasRegressor 
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import KFold 
from sklearn.model_selection import cross_val_score

Загрузка набора данных

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

concrete = pd.read_excel('Concrete_Data.xlsx')
concrete.head()

Определение исходных и целевых данных

Следующим шагом является присвоение входных столбцов (компонентов) переменной train_inputs, а столбца вывода / назначения переменной train_targets. Нам нужно преобразовать данные в массив NumPy с помощью метода .values ​​перед подачей в модель нейронной сети. Набор данных включает 1030 наблюдений и 8 столбцов.

train_inputs = concrete.drop("Comp_str", axis = 1).values
train_targets = concrete["Comp_str"].values
print(train_inputs.shape)
print(train_targets.shape)

Предварительная обработка данных

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

train_inputs =  preprocessing.scale(train_inputs)

Настройка конфигурации модели

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

Шаг 1:. Самым первым шагом является определение функции create_model, в которой мы инициировали аргументы по умолчанию learning_rate = 0,01 и функцию активации «relu». Не волнуйтесь, они установлены по умолчанию, и позже мы изменим их для настройки.

def create_model(learning_rate = 0.01, activation = 'relu')

Шаг 2. Следующим шагом является установка нашего оптимизатора. Здесь мы выбрали оптимизатор Adam и начали с нашего значения скорости обучения аргумента по умолчанию.

# Use Adam optimizer with the given learning rate
opt = Adam(lr = learning_rate)

Шаг 3: первому слою всегда нужна форма ввода. Здесь входная форма - это количество столбцов в наборе обучающих данных. Мы извлекли количество введенных столбцов с помощью метода .shape и проиндексировали второе значение.

n_cols = train_inputs.shape[1]
input_shape = (n_cols, )

Шаг 4. Следующим шагом является определение последовательной компоновки вашей модели. Здесь мы использовали два плотных слоя из 128 скрытых нейронов. Для активации задан аргумент по умолчанию, то есть «relu», и мы также установили l2-регуляризацию, чтобы штрафовать большие веса и улучшить обучение представлению. Чтобы сделать представление более надежным, мы добавили слой Dropout, который случайным образом отбрасывает 50% соединений.

# Create your binary classification model  
    model = Sequential()
    model.add(Dense(128,
                    activation = activation,
                    input_shape = input_shape,
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(128,
                    activation = activation, 
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(1, activation = activation))

Шаг 5. Следующим шагом является компиляция модели. Для компиляции нам понадобится оптимизатор и функция потерь. Здесь мы выбрали Оптимизатор Адама, и, поскольку это задача регрессии, мы выбрали «mean_absolute_error» функция потерь. Мы выбрали mae, поскольку он более устойчив к выбросам, чем mse. Чтобы отслеживать другие ошибки, мы устанавливаем две другие метрики: средняя абсолютная ошибка (mse) и средняя абсолютная ошибка в процентах (mape ).

# Compile the model
    model.compile(optimizer = opt,
                  loss = "mean_absolute_error",
                  metrics=['mse', "mape"])
    return model

Вот общий план конфигурации модели:

n_cols = train_inputs.shape[1]
input_shape = (n_cols, )
# Creates a model given an activation and learning rate
def create_model(learning_rate = 0.01, activation = 'relu'):
  
    # Create an Adam optimizer with the given learning rate
    opt = Adam(lr=learning_rate)
  
    # Create your binary classification model  
    model = Sequential()
    model.add(Dense(128, 
                    activation = activation,
                    input_shape = input_shape,
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(128,
                    activation = activation, 
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(1, activation = activation))
# Compile the model
    model.compile(optimizer = opt,
                  loss = "mean_absolute_error",
                  metrics=['mse', "mape"])
    return model

Определение стратегии настройки модели

Следующим шагом является настройка макета для настройки гиперпараметров.

Шаг 1:. Первым шагом является создание объекта модели с помощью KerasRegressor из keras. wrappers.scikit_learn, передавая функцию create_model. Мы устанавливаем verbose = 0 чтобы перестать показывать журналы обучения модели. Аналогичным образом можно использовать KerasClassifier для настройки модели классификации.

# Create a KerasRegressor
model = KerasRegressor(build_fn = create_model,
                       verbose = 0)

Шаг 2. Следующим шагом является определение пространства поиска гиперпараметров. Здесь мы попробуем следующие общие гиперпараметры:

функция активации: relu и tanh

размер пакета: 16, 32 и 64

эпохи: 50 и 100

скорость обучения: 0,01, 0,001 и 0,0001

# Define the parameters to try out
params = {'activation': ["relu", "tanh"],
          'batch_size': [16, 32, 64], 
          'epochs': [50, 100],
          'learning_rate': [0.01, 0.001, 0.0001]}

Шаг 3: Затем мы выполним рандомизированный поиск с перекрестной проверкой в ​​пространстве параметров с помощью функции RandomizedSearchCV. Мы выбрали рандомизированный поиск, так как он работает быстрее, чем поиск по сетке. Здесь мы выполним 10-кратный поиск с перекрестной проверкой. Для небольших наборов данных создание отдельного набора данных для проверки требует данных обучения, поэтому в таких сценариях метод перекрестной проверки может быть лучшим подходом к обучению модели.

random_search = RandomizedSearchCV(model,
                                   param_distributions = params,
                                   cv = KFold(10))

Шаг 4. Затем мы подгоним модель к нашим train_inputs и train_targets.

random_search_results = random_search.fit(train_inputs, train_targets)

Вот схема общей настройки модели.

# Create a KerasClassifier object
model = KerasRegressor(build_fn = create_model,
                       verbose = 0)
# Define the hyperparameter space
params = {'activation': ["relu", "tanh"],
          'batch_size': [16, 32, 64], 
          'epochs': [50, 100],
          'learning_rate': [0.01, 0.001, 0.0001]}
# Create a randomize search cv object 
random_search = RandomizedSearchCV(model,
                                   param_distributions = params,
                                   cv = KFold(10))
random_search_results = random_search.fit(train_inputs, train_targets)

Определение лучших параметров

Модель с лучшими параметрами достигла средней абсолютной ошибки (MAE) 6,197 (прибл.). Наилучшая производительность модели достигается со скоростью обучения 0,001, размером эпох 100, размером batch_size 16 и функцией повторной активации.

print("Best Score: ",
      random_search_results.best_score_,
      "and Best Params: ",
      random_search_results.best_params_)

Почему отрицательная оценка

Фактическая MAE - это просто положительная версия числа, которое мы получаем.

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

Переоценка модели с лучшим набором параметров

Следующая задача - переоборудовать модель с лучшими параметрами, т. Е. скоростью обучения 0,001, размером эпох 100, batch_size 16 и функцией повторной активации. Здесь мы вычисляем среднее значение и стандартное отклонение 10-кратной оценки перекрестной проверки, чтобы увидеть изменение потерь на выходе.

n_cols = train_inputs.shape[1]
input_shape = (n_cols, )
# Create the model object with default arguments
def create_model(learning_rate = 0.001, activation='relu'):
  
    # Set Adam optimizer with the given learning rate
    opt = Adam(lr = learning_rate)
  
    # Create your binary classification model  
    model = Sequential()
    model.add(Dense(128,
                    activation = activation,
                    input_shape = input_shape,
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(128,
                    activation = activation, 
                    activity_regularizer = regularizers.l2(1e-5)))
    model.add(Dropout(0.50))
    model.add(Dense(1, activation = activation))
    # Compile the model
    model.compile(optimizer = opt,
                  loss = "mean_absolute_error",
                  metrics = ['mse', "mape"])
    return model

Получение среднего значения K-Fold и стандартного отклонения

Здесь мы снова используем KerasRegressor для создания объекта модели и вычисления показателя точности для каждого сгиба с помощью cross_val_score ( ) функция.

Результат показал, что с лучшими параметрами 10-кратная модель CV достигла среднего значения средней абсолютной ошибки (MAE) 6,269 (приблизительно) и стандартного значения. отклонение 1,799.

# Create a KerasClassifier
model = KerasRegressor(build_fn = create_model,
                       epochs = 100, 
                       batch_size = 16,
                       verbose = 0)
# Calculate the accuracy score for each fold
kfolds = cross_val_score(model,
                         train_inputs,
                         train_targets,
                         cv = 10)
# Print the mean accuracy
print('The mean accuracy was:', kfolds.mean())
# Print the accuracy standard deviation
print('With a standard deviation of:', kfolds.std())

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

Примечание

Поиск гиперпараметров на основе Keras очень ресурсоемок и требует много времени. Обучение этой модели заняло более 1 часа на моем локальном компьютере (i7, 16 ГБ ОЗУ) даже после использования графического процессора NVIDIA. Настройка гиперпараметров несколько раз замораживала мой компьютер. Так что наберитесь терпения при настройке этого типа больших вычислительно дорогих моделей. Такую задачу лучше выполнять с помощью облачных сервисов.

Нажмите здесь, чтобы увидеть код

Надеюсь, вы узнали что-то новое из этого блога.

Ссылки

[1] И-Ченг Е, «Моделирование прочности высокопроизводительного бетона с использованием искусственных нейронных сетей», Cement and Concrete Research, Vol. 28, №12, с. 1797–1808 (1998).

Рахул Раоньяр

  • Если вам понравилось, подпишитесь на меня на medium, чтобы узнать больше
  • Свяжитесь со мной в Twitter, LinkedIn, YouTube и Github