19 Dropout
Контекст
Большие сети переобучаются — запоминают шум, плохо генерализуют. Шривастава, Хинтон и др. дают простой и общий регуляризатор.
Идея и механизм
На каждом шаге обучения каждый нейрон выключается (зануляется) с вероятностью 1−p. Сеть не может полагаться на конкретные нейроны и их совместную ко-адаптацию → вынуждена учить избыточные, робастные признаки. На инференсе все нейроны активны, а выходы масштабируются, чтобы сохранить ожидаемую величину.
теория вероятностей Dropout как усреднение ансамбля
Пусть нейрон с активацией a сохраняется с вероятностью p: маска m ∼ Bernoulli(p), выход y = m · 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 # часть нейронов занулена
Почему это важно
Дёшево, обще, долго было стандартом в полносвязных и рекуррентных сетях; концептуально связывает регуляризацию с ансамблированием. В современных CNN частично вытеснен BatchNorm и обилием данных, но в трансформерах (dropout в attention/FFN) живёт.
Связи
Dropout в полносвязных слоях был одним из ключевых трюков, удержавших 60M-параметрную AlexNet от переобучения на ImageNet. Регуляризатор и прорыв 2012-го вышли из одной лаборатории и сработали вместе.
Оба стабилизируют/регуляризуют обучение, но по-разному: dropout добавляет шум выключением нейронов, BatchNorm нормирует активации (и даёт лёгкую регуляризацию как побочку). С приходом BatchNorm и больших данных dropout в свёрточных сетях заметно потеснили.
И там, и там сила — в ансамбле разнообразных моделей. Лес строит много отдельных деревьев; dropout «прячет» экспоненциальный ансамбль подсетей внутри одной сети с общими весами. Разные способы получить «мудрость толпы».
Вопросы пытливого ума
Почему тест-масштабирование на p приближает ансамбль, а не считает его точно?
Точное усреднение требовало бы прогнать все 2n подсетей и усреднить — невозможно. Умножение на p — это аккуратное приближение среднего геометрического их выходов, точное для линейных сетей и хорошее для умеренных нелинейностей. На практике приближение отлично работает, хотя строго ансамблю не равно.
Почему dropout почти исчез из современных CNN, но остался в трансформерах?
В CNN его роль регуляризатора во многом взяли BatchNorm, аугментация и обилие данных, а dropout между свёрточными картами мешал статистикам BN. В трансформерах нет BatchNorm (там LayerNorm), модели огромны и склонны к переобучению на конкретных данных — поэтому dropout в attention и FFN остаётся полезным. Выбор регуляризации зависит от архитектуры.
Не вредит ли случайное выключение нейронов на каждом шаге сходимости?
Замедляет — обучение шумнее и требует больше эпох (по сути учим много подсетей сразу). Это осознанный размен: чуть медленнее обучение ради заметно лучшего обобщения. Поэтому dropout ставят там, где переобучение — реальная угроза (большие сети, мало данных), и снимают, когда данных в избытке.
Что читать в оригинале
Конспекта + ключевых мест достаточно: идея маскирования, тест-масштабирование и ансамблевая интерпретация. Длинный эмпирический раздел можно пролистать.