Влияние методологий регуляризации L2, выпадения нейронов и ранней остановки на производительность модели

Задний план

В своем предыдущем посте я обсуждал выбор модели для наилучших результатов прогнозирования цен Airbnb в Нью-Йорке.

Базовое значение – это среднее значение переменной цены: 178,60 доллара США.

XGBoost, модель CART, дополненная градиентным повышением, обеспечила лучший прогноз XG Boost RSME в размере 71,24 долл. США.

Набор данных

Набор данных содержит 47 542 уникальных местоположения списков с 20 января 2009 г. по 15 мая 2018 г. Существует 95 отдельных объектов различных типов, 35 из которых были выбраны для дальнейшего изучения. Данные были масштабированы перед моделированием.

После создания фиктивных столбцов районов и уникальных удобств окончательная форма набора данных была следующей:

(37260, 373)

Модели

  1. Ненастроенная семислойная нейронная сеть
#Set the input and output shape
input_dim= X_train.shape[1]
output_dim= 1
# Create the model
model= Sequential()
#Specify input layer
model.add(Dense(373, input_dim=input_dim, activation='relu'))
#Add hidden layers 
model.add(Dense(256, activation='relu'))
model.add(Dense(128, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dense(20, activation='relu'))
#Specify output layer
model.add(Dense(output_dim))
#Compile 
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
#fit
history = model.fit(X_train_s, y_train, validation_data=(X_test_s, y_test), epochs=50, verbose=2)

Окончательный RSME составил 84,5 доллара США, что лучше исходного уровня, но уступает алгоритму XGBoost. Самая низкая оценка RSME составила 77,68 долл. США на эпохе 4–5.

Давайте визуализируем кривую потерь:

train_loss=history.history['loss']
test_loss=history.history['val_loss']
plt.plot(train_loss,label='Training loss')
plt.plot(test_loss,label='Test loss')
plt.title("Untuned Neural Network Loss Function")
plt.legend();

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

2. Та же сеть с регуляризацией L1–L2

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

При регуляризации L1 веса уменьшаются на постоянную величину по направлению к 0. При регуляризации L2 веса уменьшаются на величину, пропорциональную w. Когда конкретный вес имеет большую величину, |w||w|, регуляризация L1 уменьшает вес намного меньше, чем регуляризация L2. Напротив, когда |w||w| мало, регуляризация L1 уменьшает вес намного больше, чем регуляризация L2. Конечным результатом является то, что регуляризация L1 имеет тенденцию концентрировать вес сети на относительно небольшом количестве важных соединений, в то время как другие веса стремятся к нулю. [1]

# Create the model
model= Sequential()
#Specify input layer
model.add(Dense(373, input_dim=input_dim, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
# Add hidden layers 
model.add(Dense(256, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(128, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(50, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
model.add(Dense(20, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Specify output layer
model.add(Dense(output_dim))
#Compile
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
#fit
history = model.fit(X_train_s, y_train, validation_data=(X_test_s, y_test), epochs=50, verbose=2)

Окончательное значение RSME составило 86,58 доллара США, что лучше исходного уровня, но хуже, чем у ненастроенной сети. Самый низкий показатель RSME составил 76,93 доллара США в эпоху 6.

Исключение:

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

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

Это, в свою очередь, приводит к тому, что сеть способна к лучшему обобщению и с меньшей вероятностью будет соответствовать обучающим данным.[2]

model= Sequential()
model.add(Dense(373, input_dim=input_dim, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 1
model.add(Dropout(0.5)) # Ben Shaver suggestion
model.add(Dense(256, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 2
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 3
model.add(Dropout(0.5))
model.add(Dense(50, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 4
model.add(Dropout(0.5))
model.add(Dense(20, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 5
model.add(Dropout(0.5))
model.add(Dense(output_dim))
#Compile 
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
#fit
history = model.fit(X_train_s, y_train, validation_data=(X_test_s, y_test), 
                    epochs=50, verbose=2)

Окончательный RSME составил 90,97 долл. США, что лучше исходного уровня, но хуже, чем у всех предыдущих сетей. Самая низкая оценка RSME составила 82,64 доллара США на эпохе 11.

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

Ранняя остановка

Методология ранней остановки вычисляет разницу в функции потерь для каждой эпохи и завершает работу сети в точке, где прекращается улучшение. Этот метод упрощает модель, устраняя необходимость ввода пользователем количества эпох и делегируя принятие решения другим гиперпараметрам. Валидацию можно использовать для обнаружения начала переобучения во время контролируемого обучения нейронной сети; Затем обучение останавливается до сходимости, чтобы избежать проблемы. [3]

callbacks = [EarlyStopping(monitor='val_loss', patience=6)]
input_dim= X_train.shape[1]
output_dim= 1
model= Sequential()
model.add(Dense(373, input_dim=input_dim, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 1
model.add(Dropout(0.5)) # Ben Shaver suggestion
model.add(Dense(256, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 2
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 3
model.add(Dropout(0.5))
model.add(Dense(50, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 4
model.add(Dropout(0.5))
model.add(Dense(20, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 5
model.add(Dropout(0.5))
model.add(Dense(output_dim))
#Compile 
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
#fit
history = model.fit(X_train_s, y_train, validation_data=(X_test_s, y_test), epochs=50, verbose=2,callbacks=callbacks,)

Протокол ранней остановки остановил нейронную сеть в эпоху 17, когда скорости обучения и тестирования начали расходиться. RSME составил 92,95 доллара США, худший показатель на данный момент.

Действительно ли меньше больше? 5 лучше 7

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

# set early stopping parameters
callbacks = [EarlyStopping(monitor='val_loss', patience=6)]
model= Sequential()
model.add(Dense(373, input_dim=input_dim, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 1
model.add(Dropout(0.5))
model.add(Dense(128, activation='relu',
               kernel_regularizer=regularizers.l2(0.01)))
# #Dropout layer 2
# model.add(Dropout(0.5))
# model.add(Dense(50, activation='relu',
#                kernel_regularizer=regularizers.l2(0.01)))
#Dropout layer 3
model.add(Dropout(0.5))
model.add(Dense(output_dim))
#Compile 
model.compile(loss='mse', optimizer='adam', metrics=['mse'])
#fit
history = model.fit(X_train_s, y_train, validation_data=(X_test_s, y_test), epochs=50, verbose=2,callbacks=callbacks,)

На сегодняшний день это была лучшая производительность нумеральной сети. RSME составил 75,87 доллара США, что очень близко к прогнозу XGBoost.