Задача восстановления паттернов сетью Хопфилда

Сеть Хопфилда представляет собой разновидность рекуррентной нейронной сети, способной хранить и восстанавливать определённые паттерны информации. В библиотеке 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;
}

Особенности динамики сети Хопфилда:

  • Сеть стремится к состояниям с минимальной энергией.
  • Каждое обновление нейрона снижает энергию сети, что гарантирует сходимость.
  • При наличии слишком большого числа паттернов возможны ложные минимумы энергии, что приводит к ошибочному восстановлению.

Ограничения и оптимизация

  • Ёмкость сети: для сети с (N) нейронами можно хранить примерно (0.15 N) паттернов без значительной потери точности.
  • Скорость сходимости: асинхронное обновление обычно более стабильно, но требует больше итераций.
  • Искажения: при сильном шуме входного паттерна сеть может сойтись в неправильный паттерн. Для повышения устойчивости используют нормализацию весов и пороговые функции активации.

Применение сети Хопфилда

  • Распознавание образов: восстановление искажённых бинарных изображений.
  • Ассоциативная память: хранение и быстрый поиск паттернов.
  • Оптимизационные задачи: минимизация энергии сети может применяться в задачах комбинаторной оптимизации (например, задача коммивояжёра).

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