Dropout Layer
Слой dropout случайным образом обнуляет часть активаций во время обучения, не позволяя сети полагаться на отдельные нейроны и снижая переобучение.
Слой dropout — это компонент регуляризации нейронной сети, который на каждом шаге обучения случайным образом обнуляет долю p входных значений, а при инференсе передает все значения без изменений. Поскольку любой нейрон может отключиться на любом шаге, сеть не может полагаться на несколько конкретных нейронов или на их хрупкую взаимную адаптацию. Поэтому она учится извлекать более избыточные признаки, которые лучше обобщаются, и меньше переобучается на обучающих данных. Джеффри Хинтон и его коллеги представили этот метод в 2012 году, а Шривастава, Хинтон и соавторы подробно описали его в 2014 году. Это встроенный слой в PyTorch, TensorFlow и большинстве других платформ глубокого обучения. Его используют в архитектурах от полносвязных классификационных голов до трансформеров.
Как работает dropout#
Во время обучения слой создает новую случайную маску для каждого прямого прохода: каждое значение сохраняется с вероятностью 1 − p и обнуляется с вероятностью p. Поэтому на каждом шаге обучается своя прореженная подсеть, а полная сеть, используемая при тестировании, приближает усреднение по экспоненциально большому числу подсетей с общими весами. Поэтому dropout часто называют дешевым обучением ансамбля. Чтобы ожидаемое значение активации оставалось одинаковым в обеих фазах, современные платформы используют инвертированный dropout: сохраненные значения во время обучения умножаются на 1 / (1 − p), поэтому при инференсе слой ничего не делает. В PyTorch nn.Dropout учитывает режим обучения или оценки модуля:
import torch
from torch import nn
torch.manual_seed(0)
dropout = nn.Dropout(p=0.5)
x = torch.ones(10)
# Режим обучения: примерно половина значений обнуляется, а оставшиеся масштабируются на 1 / (1 - p) = 2
dropout.train()
print("Train:", dropout(x))
# Режим оценки: слой передает все значения без изменений
dropout.eval()
print("Eval: ", dropout(x))В режиме обучения шесть из десяти значений отбрасываются, а четыре оставшихся становятся равны 2.0, сохраняя ожидаемое значение 1.0; в режиме оценки все десять значений остаются равны 1.0.
Распространенные варианты dropout#
- Пространственный dropout:
nn.Dropout2dв PyTorch обнуляет целые каналы карт признаков. Это подходит для сверточных сетей, поскольку соседние пиксели внутри канала сильно коррелируют, а удаление отдельных пикселей почти не дает регуляризации. - Стохастическая глубина (DropPath): вместо отдельных активаций случайным образом пропускаются целые остаточные ветви для каждого примера. Это стандартный элемент обучения Vision Transformer и современных CNN.
- Dropout Монте-Карло: dropout остается активным при инференсе, и модель выполняет несколько прямых проходов для одного и того же входа. Разброс предсказаний дает недорогую оценку неопределенности модели для систем, критически важных с точки зрения безопасности. Гэл и Гахрамани интерпретировали этот метод как приближенный байесовский вывод.
- DropConnect: вместо активаций обнуляются отдельные веса, и для каждого соединения используется собственная маска.
Dropout на практике#
Вероятности dropout настраивают, как и любой другой гиперпараметр. Шривастава и соавторы обнаружили, что вероятность 0.5 для отключения скрытых нейронов хорошо работала на широком наборе сетей и задач, тогда как для входных нейронов лучше сохранять вероятность ближе к 1. В исходном Transformer использовалось p = 0.1. Слишком высокая вероятность замедляет сходимость и может привести к недообучению, а размещение dropout непосредственно перед пакетной нормализацией может снизить точность из-за сдвига дисперсии между обучением и тестированием. Многие сверточные нейронные сети в основном полагаются на пакетную нормализацию, аугментацию данных и уменьшение весов, оставляя dropout для классификационной головы. Модели классификации Ultralytics YOLO26 следуют этому шаблону: в них один слой dropout расположен между объединенными признаками с 1,280 каналами и конечным линейным классификатором, а его вероятность задается аргументом обучения dropout (по умолчанию 0.0).
from ultralytics import YOLO
# Загрузи модель классификации YOLO26, в голове которой есть слой dropout
model = YOLO("yolo26n-cls.pt")
# Обучай модель с dropout 10% в классификационной голове на небольшом подмножестве MNIST
results = model.train(data="mnist160", epochs=10, imgsz=64, dropout=0.1)Примеры применения в реальных условиях#
- Анализ медицинских изображений: Размеченные снимки дороги, поэтому диагностические классификаторы часто дообучают на нескольких тысячах изображений, используя предварительно обученную базовую сеть. Dropout в классификационной голове ограничивает запоминание отдельных случаев из такого небольшого набора.
- Обработка естественного языка: кодировщики Transformer, такие как BERT, применяют dropout с вероятностью 0.1 на всех слоях, включая веса внимания, во время предварительного обучения и дообучения.
Dropout и смежные методы#
- Пакетная нормализация: пакетная нормализация стандартизирует входы каждого слоя, чтобы стабилизировать обучение, и добавляет лишь небольшие шумы за счет статистик пакета, не удаляя ни одного нейрона.
- Сглаживание меток: сглаживание меток регуляризует модель через целевые значения обучения, смягчая метки one-hot, и сохраняет все активации.
- Прунинг: прунинг навсегда удаляет веса с низкой важностью, чтобы уменьшить модель. При dropout значения обнуляются только на одном шаге обучения, а число параметров не меняется.










