Выпадающий слой (Dropout Layer) - Лена Капаца
Выпадающий слой (Dropout Layer) by Лена Капаца June 25, 2023 Продвинуто

Dropout Layer – это один из методов Регуляризации (Regularization), применяемых в Нейронных сетях (NN).  Идея заключается в том, чтобы случайным образом обнулять (отключать) некоторые выходы (нейроны) в процессе обучения модели. Это помогает предотвратить переобучение, улучшить обобщающую способность модели и повысить ее устойчивость.

Метод был предложен в 2012 году в статье "Dropout: A Simple Way to Prevent Neural Networks from Overfitting" авторства Nitish Srivastava и других.

Выпадающий слой: Keras

Посмотрим, как это работает. С примером нам поможет библиотека 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

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Подари чашку кофе дата-сайентисту ↑

© Лена Капаца. Все права защищены.