Нейронні мережі Хопфілда і Хеммінга, Різне, Програмування, статті


Серед різних конфігурацій штучних нейронних мереж (НС) зустрічаються такі, при класифікації яких за принципом навчання, строго кажучи, не підходять ні навчання з вчителем [1], ні навчання без вчителя [2]. В таких мережах вагові коефіцієнти синап сов розраховуються тільки одного разу перед початком функціонування мережі на основі інформації про оброблюваних даних, і все навчання мережі зводиться саме до цього розрахунку. З одного боку, пред’явлення апріорної інформації можна розцінювати, як допомога учи теля, але з іншого – мережа фактично просто запам’ятовує зразки до того, як на її вхід надходять реальні дані, і не може змінювати свою поведінку, тому говорити про ланку зворотного зв’язку з “світом” (вчителем) не доводиться. З мереж з подібною логікою р абота найбільш відомі мережа Хопфілда і мережа Хеммінга, які зазвичай використовуються для організації асоціативної пам’яті. Далі мова піде саме про них. Структурна схема мережі Хопфілда приведена на рис.1. Вона складається з єдиного шару нейронів, число яких є одночасно числом входів і виходів мережі. Кожен нейрон пов’язаний синапсами зі всіма іншими нейронами, а також має один вхідний син апс, через який здійснюється введення сигналу. Вихідні сигнали, як зазвичай, утворюються на аксонах.

Рис.1 Структурна схема мережі Хопфілда Задача, розв’язувана даною мережею в якості асоціативної пам’яті, як правило, формулюється таким чином. Відомий деякий набір двійкових сигналів (Зображень, звукових оцифровок, інших даних, що описують якісь об’єкти або характеристики процесів в), які вважаються зразковими. Мережа повинна вміти з довільного неідеального сигналу, поданого на її вхід, виділити (“згадати” за частковою інформацією) відповідний зразок (якщо такий є) або “дати висновок” про те, що вхідні дані не відповідають жодному із зразків. У загальному випадку, будь-який сигнал може бути описаний вектором X = {xi: i = 0 … n-1}, n – число нейронів у мережі і розмірність вхідних і вихідних векторів. Кожен елемент xi дорівнює або +1, або -1. Позначимо вектор, опісивающі й k-ий зразок, через Xk, а його компоненти, відповідно, – xik, k = 0 … m-1, m – число зразків. Коли мережа розпізнавання (ет (Або “згадає”) який-небудь зразок на основі пред’явлених їй даних, її виходи будуть містити саме його, тобто Y = Xk, де Y – в ектор вихідних значень мережі: Y = {yi: i = 0, … n-1}. В іншому випадку, вихідний вектор не співпаде ні з одним зразковим. Якщо, наприклад, сигнали являють собою якісь зображення, то, відобразивши в графічному вигляді дані з виходу мережі, можна буде побачити картинку, повністю збігається з однією з зразкових (у разі успіху) або ж “вільну імпровізацію” мережі (у разі невдачі). На стадії ініціалізації мережі вагові коефіцієнти синапсів встановлюються таким чином [3] [4]: ​​EMBED Equation.2 (1) Тут i та j – індекси, відповідно, предсинаптичного і постсинаптичного нейронів; xik, xjk – i-ий і j-ий елементи вектора k-ого зразка. Алгоритм функціонування мережі наступний (p – номер ітерації): 1. На входи мережі подається невідомий сигнал. Фактично його введення здійснюється безпосередній установкою значень аксонів: yi (0) = xi, i = 0 … n-1, (2) тому позначення на схемі мережі вхідних синапсів у явному вигляді носить чисто умовний характер. Нуль в дужці праворуч від yi означає нульову ітерацію в циклі роботи мережі. 2. Розраховується новий стан нейронів EMBED Equation.2, j = 0 … n-1 (3) і нові значення аксонів EMBED Equation.2 (4)

Рис.2 Активаційні функції де f – активаційна функція у вигляді стрибка, приведена на рис.2. 3. Перевірка, чи змінилися вихідні значення аксонів за останню ітерацію. Якщо так – перехід до пункту 2, інакше (якщо виходи стабілізували) – кінець. При цьому вихідний вектор являє собою зразок, найкращим чином поєднується з вхідними данн ими. Як говорилося вище, іноді мережа не може провести розпізнавання і видає на виході неіснуючий образ. Це пов’язано з проблемою обмеженості можливостей мережі. Для мережі Хопфілда число запам’ятовуються образів m не повинно перевищувати величини, приблизно равн ой 0.15 (n. Крім того, якщо два образи А і Б сильно схожі, вони, можливо, будуть викликати у мережі перехресні асоціації, тобто пред’явлення на входи мережі вектора А призведе до появи на її виходах вектора Б і навпаки. Рис.3 Структурна схема мережі Хеммінга Коли немає необхідності, щоб мережа в явному вигляді видавала зразок, тобто досить, скажімо, отримувати номер зразка, асоціативну пам’ять успішно реалізує мережа Хеммінга. Дана мережа характеризується, в порівнянні з мережею Хопфілда, меншими витратами на пам’ять і обсягом обчислень, що стає очевидним з її структури (рис. 3). Мережа складається з двох шарів. Перший і другий шари мають по m нейронів, де m – число зразків. Нейрони першого шару мають по n синапсів, з’єднаних із входами мережі (утворюючими фіктивний нульовий шар). Нейрони другого шару пов’язані між собою інгібіторний ми (негативними зворотними) синаптичними зв’язками. Єдиний синапс з позитивним зворотним зв’язком для кожного нейрона з’єднаний з його ж аксонів. Ідея роботи мережі полягає в знаходженні відстані Хеммінга від тестованого образу до всіх зразків. Відстанню Хеммінга називається число відрізняються бітів у двох бінарних векторах. Мережа повинна вибрати зразок з мінімальною відстанню Хеммінга до неізв стного вхідного сигналу, в результаті чого буде активізований тільки один вихід мережі, що відповідає цьому зразку. На стадії ініціалізації ваговим коефіцієнтам першого шару і порогу активаційної функції привласнюються наступні значення: EMBED Equation.2, i = 0 … n-1, k = 0 … m-1 (5) Tk = n / 2, k = 0 … m-1 (6) Тут xik – i-ий елемент k-ого зразка. Вагові коефіцієнти гальмуючих синапсів у другому шарі беруть рівними деякої величині 0

У класі NetHN визначені такі елементи: Nin і Nout – відповідно розмірність вхідного вектора з даними і число зразків; dx і dy – розміри вхідного образу по двох координатах (Для випадку тривимірних образів необхідно додати змінну dz), dx * dy має дорівнювати Nin, ці змінні використовуються функцією завантаження даних з файлу LoadNextPattern; DX і DY – розміри вихідного шару (впливають тільки на відображення виходом шару за допомогою функції Show); обидві пари розмірів встановлюються функцією SetDxDy; Class – масив з даними про зразках, заповнюється функцією SetClasses, ця функція виконує загальну ініціалізацію мережі, яка зводиться до запам’ятовування зразкових даних. Метод Initialize проводить додаткову ініціалізацію на рівні тестованих даних (крок 1 алгоритму). Метод Cycle реалізує крок 2, а метод IsConverged перевірять, стабілізували чи стану нейронів (крок 3). З глобальних функцій – SetSigmoidAlfaHN дозволяє встановити параметр F активаційної функції, а SetLimitHN задає коефіцієнт, що лежить в межах від нуля до одиниці і визначальний частку величини 1 / m, що утворить (. На лістингу 3 приведена тестова програма для перевірки мережі. Тут конструюється мережу з другим шаром з п’яти нейронів, що виконує розпізнавання п’яти вхідних образів, які представляють собою схематичні зображення букв розміром 5 на 6 точок (см.рі с.4а). Навчання мережі фактично зводиться до завантаження і запам’ятовування ідеальних зображень, записаних у файлі “charh.img”, наведеному на лістингу 4. Потім на її вхід по черзі подаються зашумлені на 8/30 образи (см.ріс.4б) з файлу “charhh.img” з лістін га 5, які вона успішно розрізняє. Рис. 4 Зразкові і тестові образи Рис.5 Структурна схема ДАП У проект крім файлів NEURO_HN і NEUROHAM входять також SUBFUN і NEURO_FF, описані в [1]. Програма тестувалася в середовищі Borland C + + 3.1. Запропоновані класи дозволяють моделювати і більші мережі Хеммінга. Збільшення числа і складності розпізнаваних образів обмежується фактично тільки обсягом ОЗУ. Слід зазначити, що навчання мережі Хеммінга представляє найпростіший алгоритм і з усіх розглянутих до теперішнього часу алгоритмів в цьому циклі статей. Обговорення мереж, що реалізують асоціативну пам’ять, було б неповним без хоча б короткого згадування про двобічної асоціативної пам’яті (ДАП). Вона є логічним розвитком парадигми мережі Хопфілда, до якої для цього достатньо додати другий сло й. Структура ДАП представлена ​​на рис.5. Мережа здатна запам’ятовувати пари асоційованих один з одним образів. Нехай пари образів записуються у вигляді векторів Xk = {xik: i = 0 … n-1} і Yk = {yjk: j = 0 … m-1}, k = 0 … r-1, де r – число пар. Подача на вхід Первогов про шару деякого вектора P = {pi: i = 0 … n-1} викликає утворення на вході другого шару якогось іншого вектора Q = {qj: j = 0 … m-1}, який потім знову надходить на вхід першого шару. При кожному такому циклі вектора на виходах обох шарів наближаються до п аре зразкових векторів, перший з яких – X – найбільш схожий на P, який був поданий на вхід мережі на самому початку, а другий – Y – асоційований з ним. Асоціацію між векторами кодуються у ваговій матриці W (1) першого шару. Вагова матриця другого з лоя W (2) дорівнює транспонованої першої (W (1)) T. Процес навчання, також як і у випадку мережі Хопфілда, полягає в попередньому розрахунку елементів матриці W (і відповідно WT) за формулою: EMBED Equation.2 (11) Ця формула є розгорнутої записом матричного рівняння EMBED Equation.2 (12) для окремого випадку, коли образи записані у вигляді векторів, при цьому добуток двох матриць розміром відповідно [n * 1] та [1 * m] призводить до (11). У висновку можна зробити наступне узагальнення. Мережі Хопфілда, Хеммінга і ДАП дозволяють просто і ефективно вирішити задачу відтворення образів по неповній і спотвореної інформації. Невисока ємність мереж (число образів, що запам’ятовуються) пояснюється тим, чт о, мережі не просто запам’ятовують образи, а дозволяють проводити їх обощение, наприклад, за допомогою мережі Хеммінга можлива класифікація за критерієм максимальної правдоподібності [3]. Разом з тим, легкість побудови програмних і апаратних моделей роблять ці се ти привабливими для багатьох застосувань.

Література С. Короткий, Нейронні мережі: алгоритм зворотного поширення. С. Короткий, Нейронні мережі: навчання без учителя. Artificial Neural Networks: Concepts and Theory, IEEE Computer Society Press, 1992. Ф.Уоссермен, Нейрокомп’ютерні техніка, М., Мир, 1992.


  Лістинг 1
// FILE neuro_hn.h
#include “neuro.h”
// Hamming Net
class LayerHN;
class NetHN;
class NeuronHN: public Neuron
{
friend LayerHN;
friend NetHN;
public:
virtual float Sigmoid(void);
};
class LayerHN: public LayerFF
{
friend NetHN;
NeuronHN _FAR *neurons;
public:
LayerHN(unsigned nRang);
~LayerHN();
void PrintSynapses(int,int){};
void PrintAxons(int x, int y){};
};
class NetHN: public SomeNet
{
LayerHN _FAR *layers;
int Nin, Nout;
int dx, dy, DX, DY;
float _FAR * Class; // [Nout]x[Nin] {+1;-1}
unsigned char * name; / / мережі можна дати ім’я
public:
NetHN(int N, int M)
{
layers = new LayerHN(M); Nin=N; Nout=M; name=NULL;
};
~NetHN()
{
if(layers) delete layers; Nin=0; Nout=0; layers=NULL;
};
LayerHN _FAR *GetLayer(void){return layers;};
void SetClasses(float _FAR * ps) {Class=ps;};
void Initialize(float _FAR *In);
void Cycle(void);
int IsConverged(void);
int LoadNextPattern(float _FAR *In);
void SetDxDy(int x, int y, int _dx, int _dy)
{if(x*y==Nin) {dx=x; dy=y;} DX=_dx; DY=_dy;};
void SetName(unsigned char *s) {name=s;};
void Show(void);
void PrintAxons(int x, int y, int direction);
};
float SetSigmoidAlfaHN(float Al);
float SetLimitHN(float Al);
Лістинг 2
// FILE neuro_hn.cpp FOR neuro_hn.prj
#include
#include
#include
#include “neuro_hn.h”
static int SigmoidType=THRESHOLD;
static float SigmoidAlfa = 1.; / / величина порога
static float Limit=0.9; // eps=Limit*(1/Nout)
float SetSigmoidAlfaHN(float Al)
{
float a;
a=SigmoidAlfa;
SigmoidAlfa=fabs(Al);
if(SigmoidAlfa<0.01) SigmoidAlfa=0.01; return a; } float SetLimitHN(float Al) { float a; a=Limit; Limit=fabs(Al); if(Limit>=1.) Limit=0.98;
return a;
}
float NeuronHN::Sigmoid(void)
{
switch(SigmoidType)
{
case THRESHOLD:
if(state>SigmoidAlfa) return SigmoidAlfa;
else if(state<0) return 0;                       else return state;               default: return state;               }       }       LayerHN :: LayerHN (unsigned nRang)       {               status = ERROR;               if (nRang == 0) return;               neurons = new NeuronHN [nRang];               if (neurons == NULL) return;               rang = nRang;               status = OK;       }       LayerHN :: ~ LayerHN (void)       {               if (neurons) delete [] neurons;               neurons = NULL;       }       void NetHN :: Initialize (float _FAR * In)       {       float sum;        for (unsigned i = 0; i Nin;j++)
sum + = Class [i * Nin + j] * In [j]; / / число збігів …
/ / Мінус число помилок
/ / C1 = (Nin-sum) / 2 – число помилок
/ / C2 = Nin-C1; – число збігів
sum = (Nin + sum) / 2; / / sum = C2 (C1) – число збігів
layers->neurons[i].state=sum;
layers->neurons[i].axon=
layers->neurons[i].Sigmoid();
}
}
void NetHN::Cycle(void)
{
float sum;
for(unsigned i=0;iNout;j++)
if(i!=j) sum+=layers->neurons[j].axon;
sum*=((1./Nout)*Limit);
layers->neurons[i].state=
layers->neurons[i].axon-sum;
layers-> neurons [i]. state = / / розраховуємо значення
layers-> neurons [i]. Sigmoid (); / / аксонів, але …
}
for(i=0;ineurons[i].axon=
layers-> neurons [i]. state; / / … оновлюємо їх тут
}
int NetHN::IsConverged(void)
{
int sum=0;
for(unsigned i=0;ineurons[i].axon>0.) sum++;
}
if(sum==1) return 1;
else return 0;
}
int NetHN::LoadNextPattern(float _FAR *IN)
{
unsigned char buf[256];
unsigned char *s, *ps;
int i;
if(pf==NULL) return 1;
if (imgfile) / / дані розташовані двумерно
{
for(i=0;idx;j++)
{
if(buf[j]==’x’||buf[j]==’1′) IN[i*dx+j]=1.;
else IN[i*dx+j]=-1.;
}
}
if(fgets(buf,256,pf)==NULL) return 2;
return 0;
}
/ / Дані у вигляді рядка: 1 символ – 1 елемент
if(fgets(buf,250,pf)==NULL) return 2;
for(i=0;i2*DX;i++)
out_char(1+i,1,GRAFCHAR_HORIZONTALLINE,15);
out_char(1+i,1,GRAFCHAR_UPPERRIGHTCORNER,15);
for(j=0;jDX;i++)
if(layers->neurons[j*DX+i].axon>fmax)
fmax=layers->neurons[j*DX+i].axon;
for(j=0;j2*DX;i++)
{
if(fmax)
{
k=(int)(((layers->neurons[j*DX+i/2].axon)
/fmax)*5.);
}
else k=0;
if(k<0) k=0; if(k>=5) k=4;
out_char(1+i, 2+j, sym[k], 15);
}
out_char(1+i, 2+j,GRAFCHAR_VERTICALLINE,15);
}
out_char(0,j+2,GRAFCHAR_BOTTOMLEFTCORNER,15);
for(i=0;i<2*DX;i++) out_char(i+1,j+2,GRAFCHAR_HORIZONTALLINE,15); out_char(1+i,j+2,GRAFCHAR_BOTTOMRIGHTCORNER,15); } void NetHN::PrintAxons(int x, int y, int direction) { unsigned char buf[20]; for(unsigned i=0;ineurons[i].axon);
out_str(x+8*i*direction,y+i*(!direction),buf,11);
}
}
Лістинг 3
// FILE neuroham.cpp FOR neuro_hn.prj
#include
#include
#include “neuro_hn.h”
# Define INS 30 / / число елементів у вхідних даних
# Define OUTS 5 / / число виходів (зразків)
# Define TEST 5 / / число тестових (зашумленних) образів
main()
{
int i,j,k=13;
unsigned char buf[20];
float _FAR *In;
float _FAR * cl;
In = new float [INS]; / / масив для введення даних
cl = new float [OUTS * INS]; / / сховище зразків
NetHN Hn (INS, OUTS); / / створення мережі
SetLimitHN(0.5);
SetSigmoidAlfaHN (INS); / / установка розміру порога
Hn.SetDxDy (5,6, OUTS, 1); / / вхідні вектора – [5 * 6]
Hn.OpenPatternFile(“charh.img”);
for (i = 0; i> OUTS; i + +) / / завантаження зразків
{
Hn.LoadNextPattern(&cl[i*INS]);
}
Hn.SetClasses (cl); / / ініціалізація ваг
Hn.ClosePatternFile();
ClearScreen();
Hn.SetName(“Hamming”);
Hn.OpenPatternFile(“charhh.img”);
for(i=0;i

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*