Polytech-soft.com

ПК журнал
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Сеть хопфилда пример

Применение нейронной сети Хопфилда для формирования ассоциативной памяти

Золотин Игорь Андреевич
Национальный исследовательский
университет «МИЭТ», г. Москва
E-mail: goldin7777@gmail.com

Аннотация. Данная статья посвящена вопросу распознавания образов при помощи нейросетевых технологий. В частности, анализ применения нейронной сети Хопфилда для формирования ассоциативной памяти.

Ключевые слова: нейронная сеть, ассоциативная память.

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

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

Рис. 1.1 Пример сети Хопфилда.

Каждый нейрон может находиться в одном их двух состояний: , где +1 соответствует «возбуждению» нейрона, а -1 «торможению».

Нелинейный, пороговый характер функционирования нейрона отражает дискретность его состояний. В нейрофизиологии такой принцип известен, как «Все или ничего». Динамика состояния во времени i-го нейрона в сети из N нейронов описывается дискретной динамической системой:

где Hi,j – матрица весовых коэффициентов, описывающих взаимодействие дендритов i-го нейрона с аксонами j-го нейрона.

Алгоритм обучения сети Хопфилда существенно отличается от алгоритма обратного распространения ошибки. Вместо последовательного приближения к нужному состоянию с промежуточной коррекцией весов, все коэффициенты рассчитываются по одной формуле и за один шаг, после этого сеть будет готова к работе. Вычисление коэффициентов подчиняется правилу: для всех запомненных образов xi матрица весов Hi,j должна удовлетворять уравнению: xi = Hi,jxi.

Обучение сети Хопфилда выходным образам ς in μ сводится к вычислению значений элементов матрицы Hi,j. Формально можно описать процесс обучения следующим образом: пусть необходимо обучить нейронную сеть распознавать M образов, обозначенных in μ,μ = 1. M> Входной образ представляет собой: где ς’ шум, наложенный на исходный образ ς in μ Фактически обучение нейронной сети – определение нормы в пространстве образов . Тогда очистку входного образа от шума можно описать как минимизацию этого выражения.

Важной характеристикой нейронной сети является отношение числа ключевых образов M, которые могут быть запомнены к числу нейронов сети N:α = M/N. Для сети Хопфилда значение α не больше 0.15.

Вычисление квадратной матрицы размера для ключевых образов производится по правилу Хебба:

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

Для сетей Хопфилда характерны ограничения:

Относительно небольшое число запоминаемых образов (порядка 0.15n где n – число входов).

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

Результаты и комментарии к ним.

Пример реализации нейронной сети Хопфилда, формирующей ассоциативную память представлен ниже.

Распознаем образы букв: «К», «П», «Т». Представим их в виде «битовых полей» размером 7х7. Имеем три эталонных образа:

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

На вход подается измененная форма:

Спустя 94 итерации эталонная форма определена:

Очевидно, что измененный образ буквы «К» был с успехом распознан. Если повторить распознавание несколько раз, то можно заметить, что каждый раз количество итераций для определения образа разное. Это связано с тем, что нейрон для обновления при каждом цикле выбирается случайным образом.

Теперь на вход приходит образ, похожий одновременно на буквы «П» и «Т».

Однако запустив ее заново, можно увидеть, что за 116 итераций в новом опыте буква все-таки распозналась. Это оказалась «П», так как исходный образ был похож на нее больше, чем на «Т»:

На основании проведенных исследований необходимо отметить, с одной стороны отсутствие проблем с обучением сети Хопфилда при наличии априорной информации о классах объектов, а с другой – достижение устойчивого состояния не гарантирует правильный отклик сети из-за того, что сеть может сойтись к ложным аттракторам (состояние нейронной сети Хопфилда в таком случае является устойчивым, но не дает правильного восстановления образа, при этом сеть может выдать ложный образ, который обычно представляет собой комбинацию фрагментов нескольких образов).

Тархов Д.А. Нейронные сети. Модели и алгоритмы/ Д.А. Тархов – М.: Радиотехника, 2005. – 256 стр.

Richard M.D., Lippman R.P., Neural network classifiers estimate Bayesian discriminant function, Neural Computation Concepts and Theory, 1991, vol 3, pp 461-482.

Хайкин С. Нейронные сети: полный курс, 2-е изд., испр.: Пер. с англ./ Саймон Хайкин. – М.: ООО «И.Д. Вильямс», 2006. – 1104 стр.

Specht, D. The General Regression Neural Network — Rediscovered. Neural Networks, 1993, V.6, pp.1033-1034.

Комарцова Л.Г., Максимов А.В., Нейрокомпьютеры/ Л.Г. Комарцова — М.: Изд-во МГТУ им. Баумана, 2004. – 400 стр.

Нейронные сети Хопфилда и Хэмминга

Сети, рассмотренные на предыдущих лекциях, не имели обратных связей , т. е. связей, идущих от выходов сетей к их входам. Отсутствие обратной связи гарантирует безусловную устойчивость сетей. (Они не могут войти в режим, когда выход беспрерывно блуждает от состояния к состоянию и не пригоден для использования.) Но это весьма желательное качество достигается не бесплатно: сети без обратных связей обладают более ограниченными возможностями по сравнению с сетями с обратными связями . Так как сети с обратными связями имеют пути, передающие сигналы от выходов к входам, то отклик таких сетей является динамическим, т. е. после приложения нового входа вычисляется выход и, передаваясь по сети обратной связи , модифицирует вход. Затем выход повторно вычисляется, и процесс повторяется снова и снова. Для устойчивой сети последовательные итерации приводят к все меньшим изменениям выхода, пока в конце концов выход не становится постоянным. Для многих сетей процесс никогда не заканчивается, такие сети называют неустойчивыми. Неустойчивые сети обладают интересными свойствами и изучались в качестве примера хаотических систем. Однако такой большой предмет, как хаос, находится за пределами этого курса. Вместо этого мы сконцентрируем свое внимание на устойчивых сетях, т. е. на тех, которые в завершении процесса дают постоянный выход . Проблема устойчивости ставила в тупик первых исследователей. Никто не мог предсказать, какие из сетей будут устойчивыми, а какие будут находиться в постоянном изменении. Более того, проблема представлялась столь трудной, что многие исследователи были настроены пессимистически относительно возможности ее решения. К счастью, была получена теорема, описавшая подмножество сетей с обратными связями , выходы которых в конце концов достигают устойчивого состояния. Это замечательное достижение открыло дорогу дальнейшим исследованиям, и сегодня многие ученые занимаются исследованием сложного поведения и возможностей этих систем. Дж. Хопфилд сделал важный вклад как в теорию, так и в применение систем с обратными связями . Поэтому некоторые из конфигураций известны как сети Хопфилда .

Читать еще:  Большая нагрузка на сеть

Конфигурации сетей с обратными связями

Рассмотренный нами ранее персептрон относится к классу сетей с направленным потоком распространения информации и не содержит обратных связей . На этапе функционирования каждый нейрон выполняет свою функцию — передачу возбуждения другим нейронам — ровно один раз. Динамика состояний нейронов является неитерационной.

Несколько более сложной является динамика в сети Кохонена. Конкурентное соревнование нейронов достигается путем итераций, в процессе которых информация многократно передается между нейронами.

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

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

Остановимся на важном частном случае нейросетевой архитектуры, для которой свойства устойчивости подробно исследованы. На рис. 8.1 показана сеть с обратными связями , состоящая из двух слоев. Способ представления несколько отличается от использованного в работе Хопфилда и других сходных, но эквивалентен им с функциональной точки зрения, а также хорошо связан с сетями, рассмотренными на предыдущих лекциях. Нулевой слой, как и на предыдущих рисунках, не выполняет вычислительной функции, а лишь распределяет выходы сети обратно на входы. Каждый нейрон первого слоя вычисляет взвешенную сумму своих входов, давая сигнал NET , который затем с помощью нелинейной функции F преобразуется в сигнал OUT. Эти операции сходны с нейронами других сетей.

Нейронная сеть Хопфилда на пальцах

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

Введение

Для начала, необходимо определить, что такое нейрон. В биологии нейрон — специализированная клетка, из которой состоит нервная система. Биологический нейрон имеет строение, показанное на рис.1.

Рис.1 Схема нейрона

Нейронную сеть можно ввести как совокупность нейронов и их взаимосвязей. Следовательно, для того, чтобы определить искусственную (не биологическую) нейронную сеть необходимо:

  1. Задать архитектуру сети;
  2. Определить динамику отдельных элементов сети — нейронов;
  3. Определить правила, по которым нейроны будут взаимодействовать между собой;
  4. Описать алгоритм обучения, т.е. формирования связей для решения поставленной задачи.

В качестве архитектуры нейронной сети будет использоваться сеть Хопфилда. Данная модель, видимо, является наиболее распространенной математической моделью в нейронауке. Это обусловлено ее простотой и наглядность. Сеть Хопфилда показывает, каким образом может быть организована память в сети из элементов, которые не являются очень надежными. Экспериментальные данные показывают, что при увеличении количества вышедших из строя нейронов до 50%, вероятность правильного ответа крайне близка к 100%. Даже поверхностное сопоставление нейронной сети (например, мозга) и Фон-Неймановской ЭВМ показывает, насколько сильно различаются эти объекты: к примеру, частота изменения состояний нейронов («тактовая частота») не превышает 200Гц, тогда как частота изменения состояния элементов современного процессора может достигать нескольких ГГц (Гц).
Формальное описание сети Хопфилда

Читать еще:  Как нагрузить сеть

Сеть состоит из N искусственных нейронов, аксон каждого нейрона связан с дендритами остальных нейронов, образуя обратную связь. Архитектура сети изображена на рис. 2.

Рис.2 Архитектура нейронной сети Хопфилда

Каждый нейрон может находиться в одном из 2-х состояний:

где — состояние нейрона в момент . «Возбуждению» нейрона соответствует , а «торможению» . Дискретность состояний нейрона отражает нелинейный, пороговый характер его функционирования и известный в нейрофизиологи как принцип «все или ничего».

Динамика состояния во времени -ого нейрона в сети из нейронов описывается дискретной динамической системой:

где — матрица весовых коэффициентов, описывающих взаимодействие дендритов -ого нейрона с аксонами -ого нейрона.

Стоит отметить, что и случай не рассматриваются.

Обучение и устойчивость к шуму

Обучение сети Хопфилда выходным образам сводится к вычислению значений элементов матрицы . Формально можно описать процесс обучения следующим образом: пусть необходимо обучить нейронную сеть распознавать образов, обозначенных . Входной образ представляет собой: где — шум, наложенный на исходный образ .
Фактически, обучение нейронной сети — определение нормы в пространстве образов . Тогда, очистка входного образа от шума можно описать как минимизацию этого выражения.

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

Вычисление квадратной матрицы размера для ключевых образов производится по правилу Хебба:

где означает -ый элемент образа .

Стоит отметить, что в силу коммутативности операции умножения, соблюдается равенство

Входной образ, который предъявляется для распознавания соответствует начальным данным для системы, служащий начальным условием для динамической системы (2):

Уравнений (1), (2), (3), (4) достаточно для определения искусственной нейронной сети Хопфилда и можно перейти к ее реализации.

Реализация нейронной сети Хопфилда

Реализация нейронной сети Хопфилда, определенной выше будет производиться на языке C++. Для упрощения экспериментов, добавим основные определения типов, напрямую связанных с видом нейрона и его передаточной функции в класс simple_neuron, а производные определим далее.

Самыми основными типами, напрямую связанными с нейроном являются:

  1. тип весовых коэффициентов (выбран float);
  2. тип, описывающий состояния нейрона (введен перечислимый тип с 2 допустимыми значениями).

На основе этих типов можно ввести остальные базовые типы:

  1. тип, описывающий состояние сети в момент (выбран стандартный контейнер vector);
  2. тип, описывающий матрицу весовых коэффициентов связей нейронов (выбран контейнер vector контейнеров vector).

Обучение сети, или, вычисление элементов матрицы в соответствии с (3) производится функцией learn_neuro_net, принимающей на вход список обучающих образов и возвращающей объект типа link_coeffs_t. Значения вычисляются только для нижнетреугольных элементов. Значения верхнетреугольных элементов вычисляются в соответствии с (4). Общий вид метода learn_neuro_net показан в листинге 2.

Обновление состояний нейронов реализовано с помощью функтора neuro_net_system. Аргументом метода _do функтора является начальное состояние , являющееся распознаваемых образом (в соответствии с (5)) — ссылка на объект типа neurons_line.

Метод функтора модифицирует передаваемый объект типа neurons_line до состояния нейронной сети в момент времени . Значение жестко не фиксировано и определяется выражением:

т.е., когда состояние каждого нейрона не изменилось за 1 «такт».

Для вычисления (2) применены 2 алгоритма STL:

  1. std::inner_product для вычисления суммы произведений весовых коэффициентов и состояний нейронов (т.е. вычисление (2) для определенного );
  2. std::transform для вычисления новых значений для каждого нейрона (т.е. вычисление пункта выше для каждого возможного )

Исходный код функтора neurons_net_system и метода calculate класса simple_neuron показан в листинге 3.

Для вывода в консоль входных и выходных образов создан тип neurons_line_print_descriptor, который хранит ссылку на образ и формат форматирования (ширину и высоту прямоугольника, в который будет вписан образ). Для этого типа переопределен оператор Листинг 4. Вывод в поток состояния нейронной сети

Пример работы нейронной сети

Для проверки работоспособности реализации, нейронная сеть была обучена 2 ключевым образам:


Рис.3 Ключевые образы

На вход подавались искаженные образы. Нейронная сеть корректно распознала исходные образы. Искаженные образы и распознанные образы показаны на рис.4, 5


Рис.4 Распознавание образа 1


Рис.5 Распознавание образа 2

Запуск программы производится из командной строки строчкой вида: AppName WIDTH HEIGHT SOURCE_FILE [LEARNE_FILE_N], где:

В репозитории проект CMake, из которого можно сгенерировать проект Visual Studio (VS2015 компилирует проект успешно) или обычные Unix Makefile’ы.

  1. Г.Г. Малинецкий. Математические основы синергетики. Москва, URSS, 2009.
  2. Статья «Нейронная_сеть_Хопфилда» на Википедии.

Нейронная сеть Хопфилда.

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

Итак, сразу же поговорим об основных задачах, которые призвана решать нейронная сеть Хопфилда. И основным ее применением является восстановление образца, ранее сохраненного сетью, по подаваемому на ее вход искаженному образцу. Может это определение не выглядит не совсем понятным, но сейчас все встанет на свои места =) Пусть мы хотим сохранить при помощи сети Хопфилда цифры от нуля до девяти (о процессе сохранения мы поговорим чуть позже, пока не будем останавливаться на этом моменте). Рассмотрим, например, цифру 2, представленную в следующем виде:

Пусть сеть уже обучена, то есть эту цифру как и остальные мы сохранили в памяти. Тогда если мы подадим искаженный вариант сохраненной цифры на вход, сеть должна выдать нам правильное изображение сети (то которое мы сохранили при обучении, без искажений). К примеру, подаваемый на вход образец может иметь следующий вид:

Вот, собственно, в этом и состоит задача нейронной сети Хопфилда ) Давайте теперь обсудим структуру сети и непосредственно процесс обучения – запоминания образцов.

Сеть Хопфилда является однослойной – если не брать в расчет входные элементы. Каждый из нейронов связан со всеми остальными, но не воздействует на себя самого. В итоге получаем:

Здесь мы рассмотрели сеть с четырьмя нейронами.

Нейроны могут принимать два разных значения, но в отличие от ранее рассмотренных сетей, нейроны сети Хопфилда могут находиться в состояниях -1 и 1 (а не 0 и 1). Конечно, можно использовать и уже ставшую привычной систему состояний (двоичную – 0 и 1), но для сетей Хопфилда более традиционной является такая функция активности:

Комбинированный ввод вычисляется по формуле:

Здесь – состояние нейрона с номером i. Если комбинированный ввод элемента оказывается отрицательным, то состояние элемента становится -1, напротив, когда комбинированный ввод положительный – состояние элемента +1. Если же , то нейрон не изменяет своего состояния, то есть сохраняет предыдущее.

Со структурой сети вроде разобрались, перейдем к процессу обучения.

Обучение нейронной сети Хопфилда значительно отличается от привычных алгоритмов обучения (например, обучение по принципу обратного распространения ошибки). В случае сети Хопфилда процедура обучения для одного входного образца (процедура сохранения образца) представляет из себя просто расчет весовых коэффициентов по определенной формуле:

Где – это матрица весов, – входной образец, а – транспонированный вектор (получается из исходного вектора заменой строк на столбцы). Если мы хотим сохранить несколько образцов (k), то необходимо произвести вычисления по этой формуле для каждого из образцов по отдельности, а затем сложить полученные матрицы .

Возможно сейчас еще нет полного понимания работы данных сетей, но мы обязательно разберем какой-нибудь практический пример, и тогда все точно встанет на свои места =)

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

Итак, сеть обучена, осталось понять как же она должна работать. В данном случае все довольно просто. Пусть мы подаем на вход искаженный элемент (например, цифру 2, которую мы уже обсуждали). В результате работы сети состояния нейронов начинают изменяться. И нам остается только ждать пока сеть перейдет в устойчивое состояние – то есть в результате последующих обновлений ни один из нейронов не будет изменять свое состояние.В результате всех этих процессов мы получим сохраненный (неискаженный) вариант подаваемого на вход образца (вектора). Вот, собственно, и все )

Еще одним моментом, на котором нельзя не остановиться является вопрос, касающийся устойчивости сети, то есть ее способности остановиться на каком-то конечном состоянии (нейроны неустойчивой сети просто будут бесконечно менять свои состояния). Мы в этой статье ограничимся рассмотрением сетей, работающих в асинхронном режиме (это означает, что в каждый момент времени меняется состояние только одного нейрона). Введем понятие функции энергии системы:

При изменении состояния нейрона j на энергия изменится на величину:

Под знаком суммы у нас тут комбинированный ввод элемента j. Таким образом, если комбинированный ввод положительный, то и изменение состояния нейрона j положительное ( 0″ title=»Rendered by QuickLaTeX.com» height=»18″ w />). Аналогично, если , то и . Поэтому изменение энергии всегда будет отрицательным (энергия будет уменьшаться в процессе работы сети), что и гарантирует нам то, что сеть является устойчивой.

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

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

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

Определяем весовую матрицу по формуле

Не забываем о том, что нам надо обнулить диагональные элементы матрицы:

Весовые значения мы рассчитали, давайте подадим на вход вектор и посмотрим, как поведут себя нейроны нашей сети.

Комбинированный ввод первого нейрона будет равен:

Поскольку > 0, то нейрон 1 будет находиться в состоянии +1.

Для второго нейрона:

Нейрон 2 окажется в состоянии -1.

Таким образом, мы получили такой вектор: , что соответствует тому образцу, который мы запоминали в первой части примера. Как видите, наша сеть работает! =) Если теперь еще раз произвести расчет состояний нейронов в соответствии с теми состояниями, которые они приняли после прохождения вектора по взвешенным связям, то мы увидим, что состояния не изменится, то есть сеть оказалась в устойчивом положении.

На рассмотрении этого примера мы и закончим сегодняшнюю статью. Надеюсь материал окажется понятным и полезным )

Похожие статьи:

Понравилась статья? Поделись с друзьями!

Интересная статься, спасибо, аж захотелось поэкспериментировать. Повторил Ваш пример. Результат оказался верным, но долго не мог понять, почему промежуточные результаты не совпадают. А потом заметил, что у Вас в рассчете net2 опечатка, в самом начале не 1, а -1 поидее должно быть.

Да, спасибо, поправил.

Результат забыли поправить)

Почти в каждой подобной статье ну ооочень не хватает кода к каждой формуле, а в конце – работающий простой исходник

Очень хотелось бы такой пример, но с двумерными матрицами

Реализовал пример на С++, работает. Но если модель масштабировать, то выдает какую-то дичь.

Ссылка на основную публикацию
Adblock
detector