Объясняет отсевы в нейронных сетях, когда их использовать и как это реализовано.

В этом посте мы поймем, что такое «выпадение» в нейронных сетях, когда мы должны использовать «выпадение» и как это реализовано в нейронных сетях.

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

Чтобы уменьшить переобучение, мы используем методы регуляризации, такие как L1 и L2 для алгоритмов машинного обучения. В случае нейронных сетей мы используем либо кросс-валидацию K-Fold, либо Dropout.

Итак, давайте разберемся, что такое Dropout

Отсев - это метод уменьшения переобучения.

В Dropout мы случайным образом отбрасываем блоки вместе со всеми входящими и исходящими соединениями, связанными с этими блоками, из нейронной сети. Это сделано во время обучения модели. Это показано на схеме ниже.

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

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

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

Цель отсева - минимизировать функцию потерь.

Это можно понять на примере класса из 10 детей, в котором 3 ребенка полны энтузиазма и большую часть времени отвечают на вопросы. Если мы не позволим этим троим детям отвечать, мы дадим возможность другим детям высказаться. Таким образом гарантируется, что учитель может исправить детей, когда они делают что-то не так, и таким образом все дети учатся.

Когда следует использовать метод отсева?

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

Как нейронная сеть определяет, сколько единиц должно быть выброшено случайным образом?

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

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

Параметр скорости находится между 0 и 1, что является долей единиц, которые мы собираемся сбросить.

Если у нас есть 2 скрытых слоя по 5 скрытых единиц в каждом. Если мы укажем скорость как 0,4, тогда мы случайным образом сбросим 2 скрытых единицы, все входящие и исходящие веса, как показано ниже.

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

Для прогнозирования тестовых данных используется простой метод приближенного усреднения. На этапе тестирования используется глубокая нейронная сеть без отсевов. Если единица сохраняется с вероятностью p во время обучения, исходящие веса (w) этой единицы умножаются на вероятность p во время тестирования. Это гарантирует, что для любого скрытого модуля прогнозируемый результат будет таким же, как и фактический результат во время тестирования.

В каких областях отсев повышает производительность?

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

Как реализовать Dropout с помощью Keras?

мы используем мультиклассовую классификацию с набором данных оценки автомобилей.

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
#Reading the data
dataset = pd.read_csv('car_acceptability.csv')
# creating  target variables
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
y=le.fit_transform(dataset['Car Acceptability'])
from keras.utils import to_categorical
output_category = to_categorical(y, num_classes=None)
output_category
#creating dummy variables for categorical data
dataset_1= pd.get_dummies(dataset, 
                          columns=['Doors','Persons','Buying Price', 'Maintenance Price', 'Lug Boot', 'Safety'],
                          prefix= ['Doors','Persons','Buying Price', 'Maintenance Price', 'Lug Boot', 'Safety'])
dataset_1.head(2)
# creating input features
X = dataset_1.iloc[:,[1,2,3,5,6,8,9, 10,12,13,14,16,17]]
#standardizing the input feature
from sklearn.preprocessing import StandardScaler
sc= StandardScaler()
X= sc.fit_transform(X)
# creating training and test data
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, output_category, test_size=0.3)

мы определяем функцию build_classifier, чтобы использовать оболочки KerasClassifier для построения нейронной сети. Наша нейронная сеть имеет 13 входных единиц. 2 скрытых слоя

Мы применяем дропаут к 2 скрытым слоям, скрытым слоям по 5 единиц в каждом и выходному слою. Мы удаляем 20% скрытых юнитов, которые будут случайным образом сбрасывать по одному юниту с каждого скрытого слоя.

from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import cross_val_score
from keras import Sequential
from keras.layers import Dense
from keras.layers import Dropout
def build_classifier():
    classifier= Sequential()
    classifier.add(Dense(5, activation='relu', kernel_initializer='uniform', input_dim=11))
    classifier.add(Dropout(rate=0.2))
    classifier.add(Dense(5, activation='relu', kernel_initializer='uniform'))
    classifier.add(Dropout(rate=0.2))
    classifier.add(Dense(1, activation='sigmoid', kernel_initializer='uniform'))
    classifier.compile(optimizer='adam',  loss='binary_crossentropy',metrics=['accuracy'] )
    return classifier
#Output Layer
    classifier.add(Dense(4, activation='softmax', kernel_initializer=kernel))
#Compiling the neural network
    classifier.compile(optimizer=optimizer,loss='categorical_crossentropy', metrics =['accuracy'])
    return classifier
# build kerasclassifier
classifier = KerasClassifier(build_fn=build_classifier)
# running a 10 fold cross validation
accuracies = cross_val_score(estimator=classifier, X=X_train, y=y_train, cv=10, n_jobs=-1)
# print mean accuracies for 10 fold cross validation
print(accuracies.mean())

Мы получаем в среднем 79% точности.

Ссылки:

Http://jmlr.org/papers/volume15/srivastava14a.old/srivastava14a.pdf