English translation is not available yet. Showing Russian content.

Как работает 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 Во время обучения

  1. Для каждого нейрона генерируется бинарная маска m из распределения Бернулли с вероятностью p (занулить) и (1 – p) (оставить).
  2. Выход нейрона умножается на маску: output = output * m.
  3. Градиенты обратного распространения проходят только через оставшиеся нейроны.
  4. На следующем шаге маска генерируется заново.

Пример кода (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 dropout0.1
После attention (перед residual)Attention dropout0.1
После FFN (перед residual)FFN dropout0.1
Residual dropout (на пути residual)Residual dropout0.1–0.2
Output dropout (перед LM head)Output dropout0.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.

Шаги:

  1. Загрузить датасет IMDb (обучение/валидация).
  2. Создать конфиг трансформера с dropout=0.1 и без dropout (p=0).
  3. Обучить обе модели на 5 эпох, логировать train/val loss и accuracy.
  4. Построить графики.
  5. Сделать вывод: 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?

Навигация