Dropout Layer – это один из методов Регуляризации (Regularization), применяемых в Нейронных сетях (NN). Идея заключается в том, чтобы случайным образом обнулять (отключать) некоторые выходы (нейроны) в процессе обучения модели. Это помогает предотвратить переобучение, улучшить обобщающую способность модели и повысить ее устойчивость.
Метод был предложен в 2012 году в статье "Dropout: A Simple Way to Prevent Neural Networks from Overfitting" авторства Nitish Srivastava и других.
Посмотрим, как это работает. С примером нам поможет библиотека Keras. Для начала импортируем необходимые модули:
# mlp with dropout on the two circles dataset
from sklearn.datasets import make_circles
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from matplotlib import pyplot
Сгенерируем игрушечный двумерный Датасет (Dataset) на 100 строк, зашумленных на 10%:
X, y = make_circles(n_samples=100, noise=0.1, random_state=1)
Разделим датасет на Тренировочную (Train Data) и Тестовую (Test Data) части:
n_train = 30
trainX, testX = X[:n_train, :], X[n_train:, :]
trainy, testy = y[:n_train], y[n_train:]
Инициируем модель с двумя плотностными (Dense) слоями, одним выпадающим (Dropout) и скомпилируем ее. Dropout(0.4)
означает, что мы удаляем случайным образом 40% записей:
# define model
model = Sequential()
model.add(Dense(500, input_dim=2, activation='relu'))
model.add(Dropout(0.4))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
Обучим модель на наших данных:
history = model.fit(trainX, trainy, validation_data=(testX, testy), epochs=4000, verbose=0)
Посмотрим, как сильно тестовые данные "прибивают" Долю правильных ответов (Accuracy):
pyplot.plot(history.history['accuracy'], label='train')
pyplot.plot(history.history['val_accuracy'], label='test')
pyplot.legend()
pyplot.show()
Выведем Долю правильных ответов (Accuracy):
_, train_acc = model.evaluate(trainX, trainy, verbose=0)
_, test_acc = model.evaluate(testX, testy, verbose=0)
print('Train: %.3f, Test: %.3f' % (train_acc, test_acc))
Train: 0.967, Test: 0.771
Если запустить этот код повторно и закомментировать строку с выпадающий слоем, то график будет выглядеть следующим образом:
Точность после теста будет равна тем же 77,1%, однако обобщающая способность модели ухудшилась: колебания на первом графике гораздо лучше объясняют десятипроцентный шум в данных.
Автор оригинальной статьи: Palash Sharma
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
© Лена Капаца. Все права защищены.