Dropout и регуляризация

Урок про инструменты против переобучения: dropout и L2-регуляризацию.

Регуляризация — это набор приёмов, которые мешают сети слишком точно подгоняться под обучающие данные, заставляя её учить более общие закономерности.

В прошлом уроке мы научились видеть переобучение. Теперь — чем с ним бороться. Два самых ходовых средства: dropout (случайное «выключение» нейронов) и L2 (штраф за большие веса).

Dropout

Во время обучения dropout с заданной вероятностью обнуляет случайные нейроны на каждом шаге. Сеть не может полагаться на отдельный нейрон и учится более устойчивым признакам. Имитируем dropout с p=0.5 на векторе активаций — код запускается:

import random
random.seed(1)

activations = [0.8, 0.3, 0.9, 0.1, 0.6, 0.7]
p = 0.5  # доля выключаемых

dropped = [0.0 if random.random() < p else a for a in activations]
print("было: ", activations)
print("после dropout:", dropped)

Вывод:

было:  [0.8, 0.3, 0.9, 0.1, 0.6, 0.7]
после dropout: [0.0, 0.3, 0.9, 0.0, 0.0, 0.7]

Часть нейронов обнулилась случайно — на следующем шаге это будут уже другие. На инференсе dropout отключается, все нейроны работают.

L2-регуляризация

L2 добавляет к loss штраф, пропорциональный сумме квадратов весов — большие веса становятся «дорогими», и сеть держит их умеренными. Посчитаем штраф вручную:

weights = [0.5, -2.0, 1.5, 0.1]
lam = 0.01  # сила регуляризации

l2_penalty = lam * sum(w ** 2 for w in weights)
print("L2-штраф к loss:", round(l2_penalty, 4))

Вывод:

L2-штраф к loss: 0.0651

В Keras

Dropout — это отдельный слой; L2 задаётся параметром слоя (требует TF):

from tensorflow.keras import layers, regularizers

model = tf.keras.Sequential([
    layers.Dense(128, activation="relu",
                 kernel_regularizer=regularizers.l2(0.001)),
    layers.Dropout(0.5),       # выключаем 50% нейронов
    layers.Dense(10, activation="softmax"),
])

Как работает под капотом

Dropout — это форма ансамблирования: на каждом шаге обучается как бы «другая» прореженная подсеть, а на инференсе они усредняются. L2 же тянет веса к нулю на каждом шаге оптимизатора, сглаживая функцию модели. Оба приёма расширяют разрыв между сложностью, которую модель может выразить, и тем, что она реально запоминает.

Частые ошибки

  • Слишком сильный dropout. p=0.8 может «задушить» сеть — она недообучится (underfitting).
  • Dropout на выходном слое. Обычно его ставят между скрытыми слоями, не на softmax-выходе.
  • Регуляризация там, где её не нужно. Если модель и так недообучается, добавлять штрафы вредно — сначала убедитесь, что есть переобучение.

Итог

  • Регуляризация борется с переобучением, заставляя учить общие закономерности.
  • Dropout случайно выключает нейроны при обучении; на инференсе он отключён.
  • L2 штрафует за большие веса, удерживая модель «простой».
  • Слишком сильная регуляризация ведёт к недообучению — нужен баланс.
Проверьте себя
1. Что делает слой Dropout во время обучения?
AУдаляет нейроны навсегда
BСлучайно обнуляет часть нейронов на каждом шаге
CУвеличивает число весов
DМеняет функцию потерь
2. Что штрафует L2-регуляризация?
AБольшие веса (сумму квадратов весов)
BМаленькие активации
CЧисло эпох
DРазмер батча
3. Что произойдёт при слишком сильном dropout (например, p=0.8)?
AМодель обучится идеально
BМодель недообучится (underfitting)
CУскорится инференс
DИсчезнет bias