Как работает dropout и зачем он нужен в LLM? (regularization)
Краткий тезис
Dropout — это техника регуляризации, которая случайно «выключает» (зануляет) часть нейронов во время обучения с вероятностью викиЭто предотвращает Это предотвращает (чрезмерную взаимную подстройку) нейронов, заставляя сеть учиться более робастным признакам. В LLM dropout применяется на выходах слоёв attention и feed-forward network (FFN), а также на эмбеддингах. Во время инференса dropout отключается, а веса масштабируются, чтобы сохранить математическое ожидание выходов.
1. Термин: Dropout (отсев)
Dropout — это метод регуляризации, предложенный Geoffrey Hinton и его коллегами в 2012 году (статья «Improving neural networks by preventing co-adaptation of feature detectors»). Идея: во время каждого шага обучения каждый нейрон (кроме выходного) с вероятностью p временно удаляется из сети вместе со всеми его связями. Таким образом, на каждом шаге обучается немного другая архитектура, что эквивалентно ансамблированию множества «тонких» сетей.
Ключевые термины
- Вероятность dropout (p) — доля нейронов, которые зануляются. Обычно p = 0.1–0.5. Для LLM чаще p = 0.1.
- Co-adaptation — ситуация, когда нейроны начинают полагаться друг на друга, компенсируя ошибки друг друга. Dropout разрушает такие зависимости.
- Масштабирование при инференсе — чтобы выходы обученной сети совпадали по математическому ожиданию с выходами во время обучения, веса обученной сети умножаются на (1 – p) (или выходы делятся на (1 – p) во время обучения).
2. Как работает dropout: механизм
2.1 Во время обучения
- Для каждого нейрона генерируется бинарная маска m из распределения Бернулли с вероятностью p (занулить) и (1 – p) (оставить).
- Выход нейрона умножается на маску:
output = output * m. - Градиенты обратного распространения проходят только через оставшиеся нейроны.
- На следующем шаге маска генерируется заново.
Пример кода (PyTorch):
import torch
import torch.nn as nn
# Dropout с вероятностью 0.1
dropout = nn.Dropout(p=0.1)
x = torch.randn(4, 128) # батч из 4 примеров, 128 признаков
x_dropped = dropout(x) # ~10% элементов занулены, остальные умножены на 1/(1-p)
2.2 Масштабирование (inverted dropout)
На практике чаще используют inverted dropout: во время обучения выходы оставшихся нейронов делятся на (1 – p), чтобы сохранить сумму. Тогда на инференсе dropout просто отключается без дополнительного масштабирования.
Формула
- Обучение:
output = (1 / (1-p)) * x * m - Инференс:
output = x
2.3 Dropout на разных слоях
Dropout можно применять к:
- Входам слоя (embedding dropout)
- Выходам слоя (hidden dropout)
- Внутри слоя (например, attention dropout — зануление отдельных весов внимания)
В трансформерах dropout обычно ставят после каждого под-слоя (attention и FFN) перед residual connection.
3. Зачем нужен dropout в LLM?
3.1 Предотвращение переобучения
LLM имеют огромное количество параметров (миллиарды). Без регуляризации они легко запоминают обучающие данные. Dropout добавляет шум, который мешает сети выучить несущественные паттерны.
3.2 Борьба с co-adaptation
В больших моделях нейроны могут «сговориться»: один нейрон учится исправлять ошибки другого. Dropout заставляет каждый нейрон быть полезным независимо, что улучшает обобщающую способность.
3.3 Ансамблевый эффект
Каждая маска dropout порождает новую подсеть. Обучение с dropout эквивалентно обучению ансамбля из 2^n (где n — число нейронов) моделей с общими весами. При инференсе используется «усреднённая» модель.
3.4 Регуляризация внимания
В attention dropout зануляет отдельные веса внимания (после softmax), что предотвращает чрезмерную концентрацию на одном токене и улучшает устойчивость к шуму.
4. Dropout в архитектуре LLM (трансформер)
В современных LLM dropout применяется в нескольких местах:
| Место применения | Тип dropout | Типичное значение p |
|---|---|---|
| Embedding (входные токены) | Embedding dropout | 0.1 |
| После attention (перед residual) | Attention dropout | 0.1 |
| После FFN (перед residual) | FFN dropout | 0.1 |
| Residual dropout (на пути residual) | Residual dropout | 0.1–0.2 |
| Output dropout (перед LM head) | Output dropout | 0.1 |
Пример из реализации GPT-2 (Hugging Face):
class GPT2Block(nn.Module):
def __init__(self, config):
self.attn = GPT2Attention(config)
self.ln_1 = nn.LayerNorm(config.hidden_size)
self.mlp = GPT2MLP(config)
self.ln_2 = nn.LayerNorm(config.hidden_size)
self.dropout = nn.Dropout(config.dropout) # обычно 0.1
def forward(self, x):
x = x + self.dropout(self.attn(self.ln_1(x)))
x = x + self.dropout(self.mlp(self.ln_2(x)))
return x
Важно В больших LLM (например, GPT-3, LLaMA) dropout часто уменьшают или вовсе отключают на этапе pre-training, так как объём данных огромен, и переобучение не является проблемой. Однако dropout может использоваться при fine-tuning на маленьких датасетах.
5. Dropout при инференсе
Во время инференса dropout выключается (p = 0). Это стандартная практика, так как модель должна давать детерминированный результат. Однако существует техника Monte Carlo Dropout (MC Dropout), когда dropout оставляют включённым и делают несколько проходов, чтобы оценить неопределённость предсказания. Для LLM это редко используется из-за вычислительных затрат.
6. Альтернативы dropout в LLM
| Метод | Описание | Применение в LLM |
|---|---|---|
| Weight decay (L2-регуляризация) | Штраф за большие веса | Почти всегда |
| Label smoothing | Смягчение целевых меток | Часто |
| Stochastic depth | Случайное пропускание целых блоков | Реже |
| Layer normalization | Стабилизация активаций | Обязательно |
| DropConnect | Зануление весов, а не выходов | Редко |
Dropout остаётся одним из самых популярных методов, особенно при fine-tuning.
7. Практические рекомендации
- p = 0.1 — хорошее значение для LLM. Слишком большой p (0.5) может замедлить сходимость.
- Если модель переобучается (train loss падает, val loss растёт), увеличьте dropout.
- Если модель недообучается (train loss высокий), уменьшите dropout.
- При pre-training на больших корпусах dropout часто отключают, чтобы не терять информацию.
- При fine-tuning на маленьком датасете dropout обязателен.
Пет-проект для закрепления
Задача Обучить маленький трансформер (2 слоя, 4 головы, размер эмбеддинга 128) на задаче классификации текста (например, IMDb) с dropout и без, сравнить кривые обучения и итоговую accuracy.
Инструменты PyTorch, Hugging Face Transformers, Datasets.
Шаги:
- Загрузить датасет IMDb (обучение/валидация).
- Создать конфиг трансформера с dropout=0.1 и без dropout (p=0).
- Обучить обе модели на 5 эпох, логировать train/val loss и accuracy.
- Построить графики.
- Сделать вывод: dropout снижает переобучение, val accuracy выше.
Ожидаемый результат Модель с dropout покажет меньший разрыв между train и val loss, а val accuracy будет на 1–3% выше.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 670 | Как работает Layer Normalization в трансформере? |
| 671 | Что такое residual connection и зачем он нужен? |
| 672 | Как устроен механизм attention? |
| 673 | Что такое position encoding? |
| 676 | Какие методы регуляризации используются при обучении LLM? |
| 680 | Как работает weight decay и чем отличается от L2 regularization? |
Навигация
- Предыдущий: 674
- Следующий: 676
- Индекс: 00. Индекс разборов