Боротьба з перенавчанням за допомогою dropout
Поширена проблема нейронних мереж — схильність до перенавчання на тренувальних даних. Це означає, що метрика, наприклад R\(^2\) або точність, висока на тренувальній вибірці, але низька на тестовій і валідаційній, і модель підлаштовується під шум у тренувальних даних.
Ми можемо запобігати перенавчанню, використовуючи відсікання (dropout). Під час навчання випадково «вимикаються» деякі нейрони, що допомагає завадити мережі підганяти шум у тренувальних даних. У keras є шар Dropout, який можна для цього використати. Потрібно задати ставку відсікання — частку з'єднань, що відсікаються під час навчання. Її задають десятковим числом від 0 до 1 у шарі Dropout().
Для цієї моделі ми повернемося до функції втрат середньоквадратичної помилки (mean squared error).
Ця вправа є частиною курсу
Machine Learning для фінансів у Python
Інструкції до вправи
- Додайте шар відсікання (
Dropout()) після першого шару Dense у моделі й використайте ставку 20% (0.2). - Використайте оптимізатор
adamі функцію втратmseпід час компіляції моделі в.compile(). - Навчіть модель на
scaled_train_featuresіtrain_targets, використовуючи 25 епох.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
from keras.layers import Dropout
# Create model with dropout
model_3 = Sequential()
model_3.add(Dense(100, input_dim=scaled_train_features.shape[1], activation='relu'))
model_3.add(____)
model_3.add(Dense(20, activation='relu'))
model_3.add(Dense(1, activation='linear'))
# Fit model with mean squared error loss function
model_3.compile(optimizer=____, loss=____)
history = model_3.fit(____, ____, epochs=____)
plt.plot(history.history['loss'])
plt.title('loss:' + str(round(history.history['loss'][-1], 6)))
plt.show()