Сеть Хопфилда представляет собой разновидность рекуррентной нейронной
сети, способной хранить и восстанавливать определённые паттерны
информации. В библиотеке Synaptic она реализована с помощью класса
Network, который позволяет создавать как простые, так и
многослойные структуры с обратными связями.
Ключевой особенностью сети Хопфилда является ассоциативная память: при подаче на вход искажённого или неполного паттерна сеть способна привести своё состояние к ближайшему сохранённому паттерну. Это достигается за счёт симметричных весов между нейронами и динамики обновления состояний до стабилизации.
Синтаксис библиотеки Synaptic позволяет создавать сеть Хопфилда следующим образом:
const { Layer, Network } = require('synaptic');
// Определение входного и скрытого слоя
let inputLayer = new Layer(4);
let outputLayer = new Layer(4);
// Соединение нейронов рекуррентными связями
inputLayer.project(outputLayer);
outputLayer.project(inputLayer);
// Создание сети
let hopfieldNetwork = new Network({
input: inputLayer,
hidden: [],
output: outputLayer
});
Примечание: Для сети Хопфилда обычно используют один слой нейронов, но библиотека Synaptic позволяет явно задавать вход и выход для удобства работы с методами обучения.
Паттерны задаются как массивы бинарных значений (0 и
1) или чисел -1 и 1. В Synaptic
обучение сети Хопфилда можно реализовать вручную, используя
правило Хебба:
function trainHopfield(network, patterns) {
let neurons = network.layers.input.list;
let N = neurons.length;
// Инициализация весов нулями
let weights = Array.from({ length: N }, () => Array(N).fill(0));
// Применение правила Хебба
patterns.forEach(pattern => {
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
if (i !== j) {
weights[i][j] += (2 * pattern[i] - 1) * (2 * pattern[j] - 1);
}
}
}
});
// Присвоение весов нейронам
for (let i = 0; i < N; i++) {
for (let j = 0; j < N; j++) {
neurons[i].connections.projected[j].weight = weights[i][j] / N;
}
}
}
Ключевой момент: веса симметричны (w_ij = w_ji), и
диагональные элементы обычно равны нулю, чтобы исключить самовлияние
нейронов.
После обучения сеть способна корректировать искажённые входные данные до ближайшего паттерна. Обновление нейронов может быть синхронным или асинхронным.
Пример асинхронного обновления:
function recallPattern(network, inputPattern, iterations = 10) {
let neurons = network.layers.input.list;
let state = inputPattern.slice();
for (let k = 0; k < iterations; k++) {
for (let i = 0; i < neurons.length; i++) {
let sum = 0;
for (let j = 0; j < neurons.length; j++) {
if (i !== j) {
sum += neurons[j].activate(state[j]) * neurons[i].connections.projected[j].weight;
}
}
state[i] = sum >= 0 ? 1 : 0;
}
}
return state;
}
Особенности динамики сети Хопфилда:
Синтаксис и возможности библиотеки Synaptic позволяют интегрировать сети Хопфилда в более сложные архитектуры, комбинировать с многослойными перцептронами и другими нейронными сетями, расширяя функциональность ассоциативной памяти и обучения.