
Переобучение (overfitting) — одна из проблем глубоких нейронных сетей (Deep Neural Networks, DNN), состоящая в следующем: модель хорошо объясняет только примеры из обучающей выборки, адаптируясь к обучающим примерам, вместо того чтобы учиться классифицировать примеры, не участвовавшие в обучении (теряя способность к обобщению). За последние годы было предложено множество решений проблемы переобучения, но одно из них превзошло все остальные, благодаря своей простоте и прекрасным практическим результатам; это решение — Dropout (в русскоязычных источниках — “метод прореживания”, “метод исключения” или просто “дропаут”).
Dropout

Графическое представление метода Dropout, взятое из статьи, в которой он впервые был представлен. Слева — нейронная сеть до того, как к ней применили Dropout, справа — та же сеть после Dropout.
Сеть, изображенная слева, используется при тестировании, после обучения параметрам.
Главная идея Dropout — вместо обучения одной DNN обучить ансамбль нескольких DNN, а затем усреднить полученные результаты.
Сети для обучения получаются с помощью исключения из сети (dropping out) нейронов с вероятностью
Исключенные нейроны не вносят свой вклад в процесс обучения ни на одном из этапов алгоритма обратного распространения ошибки (backpropagation); поэтому исключение хотя бы одного из нейронов равносильно обучению новой нейронной сети.
Цитируя авторов,
В стандартной нейронной сети производная, полученная каждым параметром, сообщает ему, как он должен измениться, чтобы, учитывая деятельность остальных блоков, минимизировать функцию конечных потерь. Поэтому блоки могут меняться, исправляя при этом ошибки других блоков. Это может привести к чрезмерной совместной адаптации (co-adaptation), что, в свою очередь, приводит к переобучению, поскольку эти совместные адаптации невозможно обобщить на данные, не участвовавшие в обучении. Мы выдвигаем гипотезу, что Dropout предотвращает совместную адаптацию для каждого скрытого блока, делая присутствие других скрытых блоков ненадежным. Поэтому скрытый блок не может полагаться на другие блоки в исправлении собственных ошибок.
В двух словах, Dropout хорошо работает на практике, потому что предотвращает взаимоадаптацию нейронов на этапе обучения.
Получив приблизительное представление о методе Dropout, давайте рассмотрим его подробнее.
Как работает Dropout
Как уже говорилось, Dropout выключает нейроны с вероятностью
Вероятность выключения каждого нейрона одинакова. Это означает следующее:
При условии, что
— линейная проекция входного
-мерного вектора x на
-мерное пространство выходных значений;
– функция активации,
применение Dropout к данной проекции на этапе обучения можно представить как измененную функцию активации:
где
Очевидно, что эта случайная величина идеально соответствует Dropout, примененному к одному нейрону. Действительно, нейрон выключают с вероятностью
Посмотрим на применение Dropout к i-му нейрону:
где
Так как на этапе обучения нейрон остается в сети (не подвергается выключению) с вероятностью q, на этапе тестирования нам необходимо эмулировать поведение ансамбля нейронных сетей, использованного при обучении. Для этого авторы предлагают на этапе тестирования умножить функцию активации на коэффициент q. Таким образом,
На этапе обучения:
На этапе тестирования:
Обратный (Inverted) Dropout
Возможно использовать немного другой подход — обратный Dropout. В данном случае мы умножаем функцию активации на коэффициент не во время тестового этапа, а во время обучения.
Коэффициент равен обратной величине вероятности того, что нейрон останется в сети:
На этапе обучения:
На этапе тестирования:
Во многих фреймворках для глубокого обучения Dropout реализован как раз в этой модификации, так как при этом необходимо лишь однажды описать модель, а потом запускать обучение и тестирование на этой модели, меняя только параметр (коэффициент Dropout).
В случае прямого Dropout мы вынуждены изменять нейронную сеть для проведения тестирования, так как без умножения на q нейрон будет возвращать значения выше, чем те, которые ожидают получить последующие нейроны; именно поэтому реализация обратного Dropout встречается чаще.
Dropout множества нейронов
Легко заметить, что слой
Таким образом, на выходе слоя
Так как каждый нейрон представлен в виде случайной величины, распределенной по закону Бернулли, и все эти величины независимы, общее число исключенных нейронов — также случайная величина, но имеющая биномиальное распределение:
где вероятность
Эту формулу легко объяснить следующим образом:
— вероятность получения последовательности
успешных событий за
попыток, и, следовательно,
неуспешных.
— биномиальный коэффициент, используемый для расчета количества возможных успешных последовательностей.
Теперь мы можем использовать это распределение, чтобы рассчитать вероятность отключения определенного количества нейронов.
Используя метод Dropout, мы фиксируем коэффициент Dropout
Например, если слой, к которому мы применили Dropout, состоит из
Как видим, вероятность отключения ровно
Следующий скрипт на Python 3 поможет представить, сколько нейронов будет выключено для разных значений
import matplotlib.pyplot as plt
from scipy.stats import binom
import numpy as np
# number of neurons
n = 1024
# number of tests (input examples)
size = 500
# histogram bin width, for data visualization
binwidth = 5
for p in range(1, 10):
# per layer probability
prob = p / 10
# generate size values from a bi(n, prob)
rnd_values = binom.rvs(n, prob, size=size)
# draw histogram of rnd values
plt.hist(
rnd_values,
bins=[x for x in range(0, n, binwidth)],
# normalize = extract the probabilities
normed=1,
# pick a random color
color=np.random.rand(3, 1),
# label the histogram with its probability
label=str(prob))
plt.legend(loc='upper right')
plt.show()

Биномиальное распределение достигает максимума в районе
Как видим из изображения выше, для любого
Более того, можно заметить, что распределение значений почти симметрично относительно
Коэффициент масштабирования введен авторами для компенсации значений активации, так как на этапе обучения используется лишь доля от
Dropout и другие регуляризаторы
Dropout часто используется с L2-нормализацией и другими методами ограничения параметров (например, Max Norm). Методы нормализации помогают поддерживать невысокие значения параметров модели.
Вкратце, L2-нормализация представляет собой дополнительный элемент функции потерь, где
Нетрудно понять, что этот дополнительный элемент сокращает величину, на которую изменяется параметр во время обратного распространения ошибки методом градиентного спуска. Если
Dropout сам по себе не может предотвратить рост значений параметров на этапе обновления. Более того, обратный Dropout ведет к тому, чтобы шаги обновления стали даже больше, как показано ниже.
Обратный Dropout и другие регуляризаторы
Так как Dropout не предотвращает роста параметров и их переполнения, нам может помочь L2-регуляризация (или любой другой метод регуляризации, ограничивающий значения параметров).
Если мы представим коэффициент Dropout в явном виде, уравнение выше превратится в следующее:
Нетрудно заметить, что в случае обратного Dropout скорость обучения масштабируется с помощью коэффициента
Поэтому отныне мы будем называть
Эффективная скорость обучения выше, чем скорость обучения, выбранная нами: таким образом метода нормализации, ограничивающие значения параметров, могут упростить процесс выбора скорости обучения.
Итоги
- Dropout существует в двух модификациях: прямой (используется нечасто) и обратный.
- Dropout на отдельном нейроне может быть представлен как случайная величина с распределением Бернулли.
- Dropout на множестве нейронов может быть представлен как случайная величина с биномиальным распределением.
- Несмотря на то, что вероятность того, что из сети будет выключено ровно np нейронов, np — среднее количество нейронов, отключенных в слое из n нейронов.
- Обратный Dropout увеличивает скорость обучения.
- Обратный Dropout следует использовать совместно с другими методами нормализации, ограничивающими значения параметров, чтобы упростить процесс выбора скорости обучения.
- Dropout помогает предотвратить проблему обучения в глубоких нейронных сетях.
О, а приходите к нам работать? :)wunderfund.io — молодой фонд, который занимается высокочастотной алготорговлей. Высокочастотная торговля — это непрерывное соревнование лучших программистов и математиков всего мира. Присоединившись к нам, вы станете частью этой увлекательной схватки.
Мы предлагаем интересные и сложные задачи по анализу данных и low latency разработке для увлеченных исследователей и программистов. Гибкий график и никакой бюрократии, решения быстро принимаются и воплощаются в жизнь.
Присоединяйтесь к нашей команде: wunderfund.io