Библиотека Synaptic предоставляет гибкий инструмент для работы с нейронными сетями в JavaScript. Одной из важных возможностей при обучении сложных моделей является замораживание весов отдельных слоёв, что позволяет контролировать процесс обучения и предотвращать нежелательные изменения уже обученных компонентов сети.
В Synaptic любая сеть строится из объектов Layer и Neuron. Каждый слой содержит набор нейронов, у которых есть веса, смещения и функции активации. При стандартном обучении веса обновляются на каждом шаге обратного распространения ошибки:
var Layer = synaptic.Layer;
var Network = synaptic.Network;
var inputLayer = new Layer(3);
var hiddenLayer = new Layer(4);
var outputLayer = new Layer(2);
inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);
В этом примере создаётся простая трёхслойная сеть: входной слой с 3 нейронами, скрытый слой с 4 нейронами и выходной слой с 2 нейронами. По умолчанию все веса между слоями свободны и поддаются изменению во время обучения.
Замораживание весов применяется в следующих случаях:
Synaptic не имеет встроенной функции “freeze layer”, но замораживание можно реализовать вручную через переопределение метода обновления весов или управление обучением на уровне нейронов.
Каждый нейрон содержит массив connections,
содержащий объекты с весами и методами их изменения. Можно
переопределить метод activate или propagate
так, чтобы веса слоя не изменялись:
hiddenLayer.list.forEach(neuron => {
neuron.propagate = function() {
// Отключение обратного распространения для этого нейрона
};
});
В этом случае сигнал проходит через слой, но корректировка весов не выполняется. Такой способ удобен для заморозки отдельных нейронов или всего слоя.
Другой подход заключается в сохранении исходных весов и возвращении их после каждой итерации обучения:
// Сохраняем исходные веса
var frozenWeights = hiddenLayer.list.map(neuron => neuron.connections.projected.map(conn => conn.weight));
trainer.train(trainingSet, {
iterations: 1000,
rate: 0.1,
schedule: {
every: 10,
do: function() {
// Восстанавливаем веса после обновления
hiddenLayer.list.forEach((neuron, i) => {
neuron.connections.projected.forEach((conn, j) => {
conn.weight = frozenWeights[i][j];
});
});
}
}
});
Этот метод позволяет продолжать обучение других слоёв, не затрагивая замороженный.
Замораживание слоёв особенно полезно при:
learning rate) для остальных слоёв,
чтобы компенсировать изменённую динамику сети.Контроль за весами отдельных слоёв предоставляет гибкость в обучении сложных сетей в Synaptic. Комбинирование замораживания с динамическим управлением скоростью обучения и структурой сети позволяет создавать более точные и устойчивые модели, адаптированные под конкретные задачи.