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

Регуляризация — один из ключевых инструментов для предотвращения переобучения моделей машинного обучения. В TensorFlow.js поддерживаются два основных типа регуляризации весов: L1 и L2, которые реализуются через специальные параметры в слоях и оптимизаторах. Каждая из этих техник накладывает определённые ограничения на величины весов, что улучшает обобщающую способность модели.


Принцип L1 регуляризации

L1 регуляризация добавляет к функции потерь сумму абсолютных значений весов модели. Математически это выражается так:

[ L_{total} = L_{original} + _i |w_i|]

где:

  • (L_{original}) — исходная функция потерь (например, meanSquaredError),
  • (w_i) — веса модели,
  • () — коэффициент регуляризации, управляющий силой штрафа.

Особенности L1 регуляризации:

  • Сильная склонность к разреженности весов (many weights become exactly zero), что полезно при отборе признаков.
  • Может использоваться для моделей с высокой размерностью входных данных, когда важно выделить ключевые признаки.

В TensorFlow.js L1 регуляризацию можно задать через аргумент kernelRegularizer при создании слоёв:

const model = tf.sequential();
model.add(tf.layers.dense({
  units: 64,
  inputShape: [100],
  kernelRegularizer: tf.regularizers.l1({l1: 0.01})
}));

Здесь l1: 0.01 — коэффициент (), определяющий величину штрафа.


Принцип L2 регуляризации

L2 регуляризация добавляет к функции потерь сумму квадратов весов:

[ L_{total} = L_{original} + _i w_i^2]

Особенности L2 регуляризации:

  • Старается сделать веса малыми, но редко обнуляет их полностью.
  • Часто приводит к более стабильному обучению и сглаживает влияние отдельных признаков.
  • Обеспечивает плавность функции потерь, что полезно для градиентных методов оптимизации.

Пример использования L2 регуляризации в TensorFlow.js:

const model = tf.sequential();
model.add(tf.layers.dense({
  units: 64,
  inputShape: [100],
  kernelRegularizer: tf.regularizers.l2({l2: 0.01})
}));

Комбинированное использование L1 и L2 (Elastic Net)

Иногда применяют комбинацию L1 и L2 для объединения преимуществ обеих регуляризаций:

[ L_{total} = L_{original} + _1 _i |w_i| + _2 _i w_i^2]

В TensorFlow.js это реализуется через l1l2 регуляризатор:

const model = tf.sequential();
model.add(tf.layers.dense({
  units: 64,
  inputShape: [100],
  kernelRegularizer: tf.regularizers.l1l2({l1: 0.01, l2: 0.01})
}));

Комбинированная регуляризация позволяет одновременно уменьшить количество незначимых весов и сгладить оставшиеся, улучшая обобщение модели.


Применение регуляризации к bias и activity

TensorFlow.js предоставляет возможность регуляризовать не только веса (kernelRegularizer), но и смещения (bias) и выходные значения слоя (activity):

model.add(tf.layers.dense({
  units: 64,
  kernelRegularizer: tf.regularizers.l2({l2: 0.01}),
  biasRegularizer: tf.regularizers.l1({l1: 0.005}),
  activityRegularizer: tf.regularizers.l2({l2: 0.001})
}));
  • biasRegularizer ограничивает величину смещений, что иногда полезно для моделей с небольшим количеством входов.
  • activityRegularizer накладывает штраф на активацию слоя, предотвращая чрезмерную экспрессию нейронов.

Настройка коэффициента регуляризации

Выбор коэффициента () критичен: слишком маленький — регуляризация неэффективна, слишком большой — модель недообучается. Часто используют поиск по сетке (grid search) или перекрёстную проверку (cross-validation) для определения оптимального значения. В TensorFlow.js коэффициент указывается в момент создания регуляризатора (l1, l2), но можно динамически изменять его через кастомные callback функции при обучении.


Интеграция с оптимизаторами

Регуляризация напрямую влияет на градиенты, которые применяет оптимизатор. Например, при использовании Adam или SGD обновление весов учитывает регуляризационный штраф:

model.compile({
  optimizer: tf.train.adam(0.001),
  loss: 'meanSquaredError'
});

Во время обратного распространения ошибки градиенты включают дополнительные слагаемые от регуляризации, что позволяет снижать вероятность переобучения.


Практические советы

  • Выбор между L1 и L2 зависит от цели: L1 для разреженности, L2 для сглаживания весов.
  • Комбинированная регуляризация полезна при высокоразмерных данных с потенциальной корреляцией признаков.
  • Регуляризация activity может использоваться в глубоких нейронных сетях для контроля активаций и предотвращения взрыва градиентов.
  • Для больших моделей часто используют L2 регуляризацию на всех слоях, а L1 только на первых слоях для отбора признаков.

Регуляризация в TensorFlow.js предоставляет гибкий и мощный механизм управления сложностью модели, позволяя создавать устойчивые и обобщающие нейронные сети прямо в браузере или на Node.js.