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 штрафует за большие веса, удерживая модель «простой».
- Слишком сильная регуляризация ведёт к недообучению — нужен баланс.