Эпоха 3 · Взрыв deep learning · 2014

19 Dropout

Dropout: A Simple Way to Prevent Neural Networks from Overfitting · Srivastava, Hinton, Krizhevsky, Sutskever, Salakhutdinov · JMLR
🟧 оригинал выборочно~40 миноригинал ↗
Суть за 20 секунд. На каждом шаге обучения случайно «выключаем» нейроны → сеть не полагается на их совместные «сговоры» и учит робастные признаки. Эквивалентно усреднению экспоненциального ансамбля прореженных подсетей. Дешёвый мощный регуляризатор, ставший стандартом.

Контекст

Большие сети переобучаются — запоминают шум, плохо генерализуют. Шривастава, Хинтон и др. дают простой и общий регуляризатор.

Идея и механизм

На каждом шаге обучения каждый нейрон выключается (зануляется) с вероятностью 1−p. Сеть не может полагаться на конкретные нейроны и их совместную ко-адаптацию → вынуждена учить избыточные, робастные признаки. На инференсе все нейроны активны, а выходы масштабируются, чтобы сохранить ожидаемую величину.

теория вероятностей Dropout как усреднение ансамбля

Пусть нейрон с активацией a сохраняется с вероятностью p: маска m ∼ Bernoulli(p), выход y = m · a. Тогда ожидаемый выход:

E[y] = p · a

Поэтому на тесте, когда все нейроны включены, выход умножают на p — чтобы средняя величина совпала с обучением (или применяют «inverted dropout»: делят на p при обучении, тест не трогают).

Главная интерпретация. Каждый шаг обучает одну из 2n «прореженных» подсетей (по числу подмножеств из n нейронов), и все они делят веса. Тест-масштабирование приближённо вычисляет среднее геометрическое предсказаний всего этого экспоненциального ансамбля. То есть dropout ≈ обучение гигантского ансамбля ценой одной сети.

NumPy Inverted dropout (train / eval)
import numpy as np

def dropout(a, p=0.5, train=True):
    if not train:
        return a                              # на инференсе — без изменений
    mask = (np.random.rand(*a.shape) < p) / p # маска + масштаб 1/p
    return a * mask                           # часть нейронов занулена
на каждом шаге часть нейронов случайно выключена
Перечёркнутые нейроны выключены на этом шаге. Каждый шаг — своя случайная «прореженная» подсеть; все делят общие веса.
Аналогия. Хинтон придумал dropout в банке: он заметил, что кассиров постоянно ротируют, и ему объяснили — чтобы труднее было сговориться о мошенничестве. Если любого сотрудника в любой момент могут убрать, никто не может выстроить хрупкую схему, завязанную на конкретных людей. Так и нейроны: раз тебя могут «выключить», нельзя полагаться на соседа — приходится быть полезным самому.

Почему это важно

Дёшево, обще, долго было стандартом в полносвязных и рекуррентных сетях; концептуально связывает регуляризацию с ансамблированием. В современных CNN частично вытеснен BatchNorm и обилием данных, но в трансформерах (dropout в attention/FFN) живёт.

Связи

← применён в16. AlexNet

Dropout в полносвязных слоях был одним из ключевых трюков, удержавших 60M-параметрную AlexNet от переобучения на ImageNet. Регуляризатор и прорыв 2012-го вышли из одной лаборатории и сработали вместе.

↔ соперник26. Batch Normalization

Оба стабилизируют/регуляризуют обучение, но по-разному: dropout добавляет шум выключением нейронов, BatchNorm нормирует активации (и даёт лёгкую регуляризацию как побочку). С приходом BatchNorm и больших данных dropout в свёрточных сетях заметно потеснили.

↔ родственник идеи12. Random Forests

И там, и там сила — в ансамбле разнообразных моделей. Лес строит много отдельных деревьев; dropout «прячет» экспоненциальный ансамбль подсетей внутри одной сети с общими весами. Разные способы получить «мудрость толпы».

Вопросы пытливого ума

Почему тест-масштабирование на p приближает ансамбль, а не считает его точно?

Точное усреднение требовало бы прогнать все 2n подсетей и усреднить — невозможно. Умножение на p — это аккуратное приближение среднего геометрического их выходов, точное для линейных сетей и хорошее для умеренных нелинейностей. На практике приближение отлично работает, хотя строго ансамблю не равно.

Почему dropout почти исчез из современных CNN, но остался в трансформерах?

В CNN его роль регуляризатора во многом взяли BatchNorm, аугментация и обилие данных, а dropout между свёрточными картами мешал статистикам BN. В трансформерах нет BatchNorm (там LayerNorm), модели огромны и склонны к переобучению на конкретных данных — поэтому dropout в attention и FFN остаётся полезным. Выбор регуляризации зависит от архитектуры.

Не вредит ли случайное выключение нейронов на каждом шаге сходимости?

Замедляет — обучение шумнее и требует больше эпох (по сути учим много подсетей сразу). Это осознанный размен: чуть медленнее обучение ради заметно лучшего обобщения. Поэтому dropout ставят там, где переобучение — реальная угроза (большие сети, мало данных), и снимают, когда данных в избытке.

Что читать в оригинале

Конспекта + ключевых мест достаточно: идея маскирования, тест-масштабирование и ансамблевая интерпретация. Длинный эмпирический раздел можно пролистать.