Клиппинг градиентов — метод предотвращения проблемы взрывных градиентов при обучении нейронных сетей. В глубоких моделях, особенно с рекуррентными связями, значения градиентов могут резко увеличиваться, что ведёт к нестабильному обучению и потере контроля над весами. Основная идея клиппинга заключается в ограничении значения градиентов до заранее определённого порога.
Клиппинг градиентов реализуется путём проверки нормы градиента и его масштабирования, если она превышает заданное значение:
В Keras.js клиппинг градиентов применяется на этапе компиляции модели через оптимизаторы.
Keras.js поддерживает основные типы клиппинга:
clipvalue — обрезка по абсолютному значению компоненты градиента:
const optimizer = new KerasJS.optimizers.SGD({
learningRate: 0.01,
clipValue: 1.0
});
Каждый элемент градиента обрезается: ( g_i = ((g_i, ), -) ).
clipnorm — обрезка по норме градиента:
const optimizer = new KerasJS.optimizers.Adam({
learningRate: 0.001,
clipNorm: 5.0
});
Если норма градиента превышает clipNorm, он
масштабируется, сохраняя направление, но уменьшая длину.
Важно: одновременно использовать
clipvalue и clipnorm можно, но рекомендуется
применять только один метод, чтобы избежать непредсказуемого
поведения.
Клиппинг градиентов особенно полезен в следующих случаях:
Пример компиляции модели с клиппингом:
const model = new KerasJS.Model({
filepath: 'model.json',
gpu: true
});
const optimizer = new KerasJS.optimizers.Adam({
learningRate: 0.001,
clipNorm: 1.0
});
model.compile({
optimizer: optimizer,
loss: 'meanSquaredError',
metrics: ['accuracy']
});
Выбор порогового значения градиентов зависит от архитектуры сети и данных:
Keras.js позволяет извлекать градиенты для анализа:
const grads = model.getGradients(inputData, targetData);
console.log('Max gradient value:', Math.max(...grads));
console.log('Gradient norm:', Math.sqrt(grads.reduce((sum, g) => sum + g * g, 0)));
Регулярная проверка нормы градиентов помогает корректировать порог клиппинга и предотвращать как взрыв, так и исчезновение градиентов.
clipnorm, так как это сохраняет пропорции всех компонент
градиента.clipvalue.