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

Тем не менее, они обеспечивают настолько иную и альтернативную точку зрения на системы обучения по сравнению с текущим состоянием глубокого обучения, что их стоит понять, во всяком случае, ради этого.

Давайте узнаем, как они работают.

Базовая сеть Хопфилда и как она работает

По своей сути сеть Хопфилда - это модель, которая может восстанавливать данные после того, как в них были загружены поврежденные версии тех же данных.

Мы можем описать это как сеть узлов - или единиц, или нейронов, - связанных ссылками. Каждый объект имеет одно из двух состояний в любой момент времени, и мы предполагаем, что эти состояния могут быть +1 или -1. Мы можем перечислить состояние каждой единицы в данный момент времени в векторе V.

Ссылки представляют собой связи между единицами, и они симметричны. Другими словами, связь между узлом-i и узлом-j идентична, в каком бы направлении вы ни пошли на графике. В частности, идентичным является число, представляющее силу связи между каждым блоком. Мы можем перечислить эти числа в матрице W.

Если у нас есть сеть, подобная показанной на рис. 1, мы можем описать ее с помощью:

Как мы строим W? Мы делаем это, сначала замечаем, что между узлом и им самим нет связи, поэтому мы делаем это явным, обнуляя waa, wbb, wcc, wdd. Мы также знаем, что ссылки - или веса - симметричны, например, wab = wba. Итак, W имеет нулевую диагональ и симметрично. Остальные элементы заполняются следующим образом: wab = Va · Vb. Результатом является матрица W. Оказывается, это разумный выбор для веса соединения, поскольку он соответствует правилу Хебба, которое мы еще увидим позже.

Теперь, когда мы построили матрицу весов, нам нужно определить правило для определения состояний каждого узла. Поскольку у нас есть бинарные состояния, мы можем использовать этот закон:

Используя матрицу весов, определенную выше, мы получаем аналогично:

Теперь мы можем интуитивно понять, как на самом деле работают сети Хопфилда.

Допустим, у нас есть поврежденная версия V, и мы назовем ее V ’= [1 -1 -1 -1], так что последний бит был перевернут. Мы можем инициализировать состояние сети с помощью V ’.

Мы можем продолжить обновление состояний сети в соответствии с правилами, которые мы установили ранее. Для Va у нас будет:

Va = f (wab · Vb + wac · Vc + wad · Vd) = +1

Обратите внимание, что wab · Vb и wac · Vc имеют положительный вклад в x, несмотря на Vb и Vc имеет значение -1, при этом Va становится равным +1, в то время как поврежденный бит вносит вклад в противоположном направлении. Другими словами, создавая W как раньше, мы заставляем узлы переходить в противоположные состояния, когда предполагается, что они имеют противоположный знак, и переходить в одно и то же состояние, когда они должны быть равны. Противоположные состояния отталкивают друг друга, в то время как одни и те же состояния вместо этого притягиваются. Это одна из формулировок правила Хебба.

Правило Хебба. Нейроны, которые срабатывают вместе, соединяются вместе.

Аналогично:
Vb = f (wba · Va + wbc · Vc + wbd · Vd) = -1
Vc = f (wca · Va + wcb · Vb + wcd · Vd) =
-1
Теперь поврежденный бит:
Vd = f (wda · Va + wdc · Vc + wdb · Vb) = + 1

И Va = +1 привлекает узел d как положительный, имея wda · Va ›0, в то время как Vc = Vd = -1 отталкивающий узел d, давая общий положительный вклад wdc · Vc + wdb · Vd › 0.

Узлы, которые изначально были одинаковыми, становятся одинаковыми, узлы, которые изначально имели противоположный знак, отталкиваются друг от друга, чтобы быть противоположными.

Оригинальный V восстановлен волшебным образом!

Но * почему * работает?

До сих пор мы видели, что как только мы полностью определим сеть - ее W - с вектором состояния V, который мы хотим восстановить после повреждения, мы можем сделать это, просто обновив состояния сети.

Другими словами, после инициализации состояний сети с помощью V ’ мы позволяем сети развиваться по законам, которые мы определили ранее, и она будет сходиться к состояниям, которые мы изначально хотели. Не только это, но он останется там независимо от того, сколько обновлений мы будем делать.

Давайте выясним почему.

Мы можем определить функцию, которая зависит от состояний графика и матрицы W. Мы назовем эту функцию функцией Energy, связанной с состояниями сети, и обозначим ее:

Результат # 1

Если узел Vi изменит свое состояние с +1 на -1 или наоборот, мы получим следующее:

Теперь:
Если Vi изменилось с -1 на +1, то dVi = +2
Что означает x должно быть положительным,
И, в свою очередь, дельта энергии должна быть отрицательной.

Это означает, что если мы обновляем сеть в соответствии с нашими правилами, функция энергии всегда будет уменьшаться, она монотонно уменьшается и будет пытаться достичь своей самой низкой точки.

Результат №2

Но есть ли самая низкая точка или энергия будет продолжать уменьшаться до отрицательной бесконечности?

Другими словами, мы пытаемся выяснить, может ли дельта энергии равняться нулю.
Чтобы иметь dEi = 0, нам нужно, например, чтобы dVi = 0 , что верно только тогда, когда Vi (k-1) '= Vi (k)', где Vi (k-1) ' является состоянием узла перед update и Vi (k) ' после обновления.

Предположим, у нас есть Vi (k-1) '= +1, мы хотим Vi (k)' = +1, или аналогично
xi (k) ›0.
Это:

Но когда Vj (k-1) ’= Vj, тогда xi (k) всегда положительно!

В одном снимке мы показали, что когда состояния принимают исходное значение (неповрежденное значение), функция Energy больше не изменяется. Другими словами, dVi = 0 и узел не будет обновляться до других значений - конфигурация считается стабильной.

Таким образом, мы доказали, что энергия всегда уменьшается, пока сеть не достигнет стабильной конфигурации состояний узлов. Более того, стабильная конфигурация - это конфигурация, которая соответствует восстановленному вектору состояния, локальному минимуму функции энергии.

Некоторые детали реализации здесь не затрагиваются, но основная рабочая сеть Хопфилда находится в этом блокноте Jupyter, который я подготовил здесь.