Лекция №3. Нейронная сеть Хопфилда

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

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

Посмотрим, как выглядят сети Хопфилда на нашей видео-лекции:

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

x=[x1,x2,...,xN],

где xi равняется -1 или 1.

Результатом обучения сети Хопфилда будет матрица, которая отражает веса взаимодействия нейронов. В сети Хопфилда все нейроны взаимодействуют со всеми. В начале обучения все веса принимают нулевые значения. Далее для всех i и j, которые меняются от 1 до N, мы осуществляем следующую процедуру:

Для всех образов выполняем корректировку весов:

wij=wij + xixj,

далее положим
wii=0

и нормируем
wij:=wij/N.

Все, наша сеть обучена!

Процедура распознавания образов осуществляется следующим алгоритмом. Пусть мы ищем образ

Y=[y1,y2,...,yN],

  1. Цикл по j от 1 до N:
  2. Положим d = 0
  3. Вложенный цикл по i от 1 до N:
  4. d = d + wijyi
  5. Конец вложенного цикла
  6. Если d > 0, то положить zj = 1, иначе zj = -1.
  7. Конец внешнего цикла
  8. Мы получили вектор:
    Z=[z1,z2,...,zN],
    Если вектор Z содержится во множестве исходных образов, то считаем, что алгоритм нашел образ Z, который соответствует исходному образу Y.
  9. Положим Y = Z
  10. Переход к шагу 1.

Если наш алгоритм не может найти образ, то значит, что сеть Хопфилда не смогла "вспомнить" такой образ.

Посмотрим на видео как работает сеть Хопфилда:

Исходный текст этой программы доступен по адресу AI-HopfieldNET.

Программа написана на C#, поскольку для нее существенную роль играет графика. Приведем код, который собственно реализует работу сети Хопфилда.

Copy Source | Copy HTML
  1. // Обучение сети Хопфилда
  2. void Learning()
  3. {
  4.     for (int i =  0; i < N; i++)
  5.     {
  6.         for (int j =  0; j < N; j++)
  7.         {
  8.             if (i == j)
  9.             {
  10.                 continue;
  11.             }
  12.             for (int m =  0; m < M; m++)
  13.             {
  14.                 // корректировка весов
  15.                 w[i, j] += Boxes[m][i] * Boxes[m][j];
  16.             }
  17.             w[i, j] /= N;
  18.         }
  19.     }
  20. }
  21. // восстановление образа
  22. public TBox Find(TBox BS, int T = 1000)
  23. {
  24.     TBox B = new TBox(BS);
  25.     TBox B2 = new TBox(B);
  26.     for (int t =  0; t < T; t++)
  27.     {
  28.         for (int j =  0; j < N; j++)
  29.         {
  30.             double d =  0;
  31.             for (int i =  0; i < N; i++)
  32.             {
  33.                 d += w[j, i] * B[i];
  34.             }
  35.             if (d >  0)
  36.             {
  37.                 B2[j] = 1;
  38.             }
  39.             else
  40.             {
  41.                 B2[j] = -1;
  42.             }
  43.         }
  44.         B = new TBox(B2);
  45.         if (Boxes.Find(B))
  46.         {
  47.             return B;
  48.         }
  49.     }
  50.     return null;
  51. }

Видим, что собственно работа с сетью Хопфилда довольно проста.

Home | Лекции | Python | Видео | Скачать | Ссылки
Copyright (c) 2017, Roman Shamin
132
32350
48