Регуляризация — ключевой метод предотвращения переобучения нейронных сетей. Она добавляет штрафы к функции потерь, сдерживая слишком большие значения весов и стимулируя модель к более устойчивым решениям. В библиотеке Synaptic на JavaScript можно реализовать регуляризацию вручную, так как встроенной поддержки L1 и L2 нет, но структура библиотеки позволяет гибко управлять весами и обучением сети.
L1-регуляризация (Lasso)
L2-регуляризация (Ridge)
Выбор коэффициента регуляризации λ (lambda) определяет силу штрафа. Малые значения дают мягкое влияние, большие — сильное, что может привести к недообучению.
Synaptic строит нейронные сети через объекты Network, Layer и Neuron. Прямой поддержки L1/L2 нет, поэтому регуляризация реализуется через модификацию весов после обратного распространения ошибки.
const synaptic = require('synaptic');
const { Layer, Network, Trainer } = synaptic;
// Простая сеть с одним скрытым слоем
const inputLayer = new Layer(2);
const hiddenLayer = new Layer(3);
const outputLayer = new Layer(1);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
const myNetwork = new Network({
input: inputLayer,
hidden: [hiddenLayer],
output: outputLayer
});
function applyL1Regularization(network, lambda) {
network.layers.input.list.concat(
...network.layers.hidden.map(layer => layer.list),
network.layers.output.list
).forEach(neuron => {
Object.keys(neuron.connections.projected).forEach(key => {
const conn = neuron.connections.projected[key];
const gradient = conn.weight > 0 ? 1 : -1;
conn.weight -= lambda * gradient;
});
});
}
function applyL2Regularization(network, lambda) {
network.layers.input.list.concat(
...network.layers.hidden.map(layer => layer.list),
network.layers.output.list
).forEach(neuron => {
Object.keys(neuron.connections.projected).forEach(key => {
const conn = neuron.connections.projected[key];
conn.weight -= lambda * conn.weight;
});
});
}
const trainer = new Trainer(myNetwork);
for (let i = 0; i < 1000; i++) {
trainer.train([{ input: [0, 0], output: [0] },
{ input: [0, 1], output: [1] },
{ input: [1, 0], output: [1] },
{ input: [1, 1], output: [0] }],
{ rate: 0.1, iterations: 1, error: 0.005, shuffle: true });
// Применяем L2 регуляризацию после каждого шага обучения
applyL2Regularization(myNetwork, 0.01);
}
weight_decay, поэтому регуляризация реализуется
через прямое вмешательство в веса.Регуляризация L1 и L2 в Synaptic позволяет контролировать переобучение и улучшать обобщающую способность сети, создавая более стабильные и предсказуемые модели. Правильная настройка коэффициентов λ и интеграция с циклом обучения — ключ к успешной работе.