Dropout — это техника регуляризации нейронных сетей, позволяющая
уменьшить переобучение за счёт случайного «выключения» части нейронов на
этапе обучения. В TensorFlow.js она реализуется как слой
tf.layers.dropout и применяется внутри модели для создания
устойчивых и обобщающих признаков.
Dropout случайным образом отключает определённый процент нейронов во время каждой итерации обучения. При этом активированные нейроны продолжают передавать информацию, а отключённые нейроны временно не участвуют в вычислениях. Важно понимать, что на этапе предсказания (inference) все нейроны остаются активными, а веса масштабируются для компенсации ранее отключённых нейронов.
Математически процесс можно описать так: для слоя с входом (x) и вероятностью удержания (p):
[ = x / p]
где () — вектор случайных бинарных масок, () — поэлементное умножение. Масштабирование на (1/p) гарантирует сохранение среднего значения активации.
В TensorFlow.js слой Dropout создаётся следующим образом:
const dropoutLayer = tf.layers.dropout({
rate: 0.5, // вероятность "выключения" нейронов
inputShape: [128] // размер входного вектора, если это первый слой
});
Ключевые параметры:
0.5 означает, что в среднем половина нейронов
будет отключена.Dropout добавляется в модель как обычный слой:
const model = tf.sequential();
model.add(tf.layers.dense({units: 128, activation: 'relu', inputShape: [784]}));
model.add(tf.layers.dropout({rate: 0.3}));
model.add(tf.layers.dense({units: 10, activation: 'softmax'}));
Здесь после первого плотного слоя добавлен слой Dropout с вероятностью отключения 30%.
Для сложных архитектур с несколькими входами и ветвлениями используется функциональный API:
const input = tf.input({shape: [784]});
const x = tf.layers.dense({units: 256, activation: 'relu'}).apply(input);
const xDrop = tf.layers.dropout({rate: 0.4}).apply(x);
const output = tf.layers.dense({units: 10, activation: 'softmax'}).apply(xDrop);
const model = tf.model({inputs: input, outputs: output});
Важный момент: Dropout применяется только на этапе обучения. В
TensorFlow.js это контролируется автоматически через флаг
training при вызове model.predict или
model.fit. Например, внутри кастомного слоя или при прямом
вызове call слоя можно явно указать:
const y = dropoutLayer.apply(x, {training: true});
earlyStopping).1. Сверточные сети: Для ConvNet Dropout часто
вставляют после полносвязных слоёв, но можно использовать и после
сверточных слоёв с аккуратной настройкой rate.
2. Рекуррентные сети: В LSTM или GRU Dropout применяется к входам и состояниям, чтобы предотвратить чрезмерное запоминание последовательностей.
3. Глубокие MLP: Dropout особенно эффективен для многослойных перцептронов с большим количеством скрытых нейронов, снижая переобучение на небольших выборках.
При обучении модели с Dropout:
model.compile({
optimizer: 'adam',
loss: 'categoricalCrossentropy',
metrics: ['accuracy']
});
await model.fit(trainXs, trainYs, {
epochs: 50,
batchSize: 32,
validationSplit: 0.2
});
Dropout автоматически включается на этапе обучения и отключается на
этапе валидации или предсказания. Явная передача
{training: true} необходима только при нестандартных
вызовах.
rate > 0.7)
может привести к недообучению, особенно на маленьких данных.Dropout остаётся одним из самых простых и эффективных способов борьбы с переобучением, особенно в глубоких нейросетевых архитектурах. В TensorFlow.js его применение интегрировано в слои и полностью совместимо с другими методами оптимизации и регуляризации.