Sieci neuronowe Hopfielda

PL
Data dodania: 2011-09-18, Autor: biohazard, Dodał: Karol, Wyświetleń: 759

Sztuczna sieć neuronowa jest skomputeryzowaną strukturą powstałą dzięki obserwacji biologicznego systemu nerwowego. Jest wiele różnych sieci neuronowych, od trywialnie prostych do bardzo skomplikowanych. Jednowarstwowa sieć neuronowa Hopfielda jest siecią mało skomplikowaną. Nadaje się zatem do zobrazowania podstawowych założeń sieci neuronowych.

Do Sieci Hopfielda potrzebne są:

  • ortogonalne sygnały wzorcowe dla których budujemy sieć,
  • macierz określająca wagi połączeń między neuronami,
  • wektory podawane na wejście,
  • funkcja dyskretyzująca wyniki,
  • znajomość podstaw operacji na macierzach.

Jak większość pamięta z lekcji biologii, neurony przekazują między sobą informację poprzez impulsy elektryczne. My zastąpimy go tzw. wagami między poszczególnymi połączeniami neuronowymi [rys nr 1], które są zależne od sygnałów dla których sieć została zaprojektowana. Część z połączeń otrzyma wagi dodatnie, pozostałe ujemne.

rys nr 1

Naszą sieć projektujemy dla dwóch wektorów: A = (1,0,1,0) i B = (0,1,0,1). Dlaczego akurat tych dwóch? Można użyć jakichkolwiek wektorów, o ile są one ortogonalne.

Kolejnym krokiem jest stworzenie macierzy wag poszczególnych połączeń. Aby to zrobić zapisujemy nasze wektory bipolarnie, czyli w obu wektorach zamieniamy zera na minus jedynki, co daje: P = (1,-1,1,-1) i Q = (-1,1,-1,1). Łączymy tak powstałe wektory w macierz X = 4x2, a następnie ją transponujemy. Ostatecznie mnożymy macierze X i Xt. W macierzy wynikowej zerujemy główną przekątną, co doprowadza nas do macierzy wag W [rys nr 2].

rys nr 2

Wagę połączenia np. między neuronem nr 1 i 3 (W13 na rys nr 2) obliczamy wyznaczając przecięcie pierwszego wiersza i trzeciej kolumny macierzy wag. W wyniku otrzymujemy 2.

Ciąg wyjściowy uzyskuje się mnożąc ciąg wejściowy, przez kolejne kolumny macierzy wag. Dla przykładu podajmy na wejście ciąg A = (1,0,1,0). Mnożymy jego wyrazy przez pierwszą kolumnę macierzy W, czyli: 1x0 + 0x(-2) + 1x2 + 0x(-2) = 2. Tak samo czynimy z kolejnymi kolumnami. Na wyjście otrzymamy ciąg (2,-4,2,-4).

W tym miejscu należy określić funkcję dyskretyzującą wyniki.

f(x)={0, jeśli x<0 ; 1, jeśli x>=0).

Z założenia, sieć powinna prawidłowo przetworzyć sygnały dla których została zaprojektowana. Sygnał wyjściowy będzie równy (f(2),f(-4),f(2),f(-4)) = (1,0,1,0) = A. Tak samo postępujemy badając ciąg B = (0,1,0,1).

Zastanówmy się co się stanie jeśli przedstawimy sieci wektor C = (0,1,0,0)? Wówczas poszczególne aktywacje dadzą wektor (-2,0,-2,2), co funkcja dyskretyzująca zamieni na (0,1,0,1), czyli wektor B! Znaczy to, że gdyby podczas transmisji informacji nastąpiło po drodze nieznaczne przekłamanie, nasza sieć potrafiłaby odtworzyć pierwotny sygnał. Na tej zasadzie działają programy typu OCR, do rozpoznawania znaków, itd.

Prawidłowy rezultat można osiągnąć tylko kiedy odległość Hamminga (czyli suma różnych par bitów) między wektorem wejściowym a wektorami wzorcowymi jest różna. Wtedy wystarczy zastosować tzw. synchroniczne uzupełnianie danych wejściowych - sieć przetwarza niezmienny ciąg liczb. Kiedy odległości Hamminga są równe, należy użyć asynchronicznego uzupełniania.

Asynchronicznym uzupełnianie występuje, kiedy sieć Hopfielda jest tworzona rekurencyjnie poprzez podanie na wejście sygnałów wyjściowych będących wynikiem poprzednich obliczeń [rys nr 3].

rys nr 3

Niech ciąg wejściowy jest równy E = (1,0,0,1), którego odległość między A i B jest jednakowa. Przy synchronicznym uzupełnianiu, otrzymalibyśmy wynik F = (0,1,1,0), czyli oscylowalibyśmy między wektorami A i B.

Spójrzmy na tabelę:

krok  wektor wejściowy wartości kolumny  wartość  wektor wyjściowy  info
1     1001          0 -2 2 -2     -3 < 0   0001               Kolumna nr jeden zamieniona na 0
2     0001          -2 0 -2 2     2 > 0    0101               Kolumna nr dwa zamieniona na 1
3     0101          2 -2 0 -2     -4 < 0   0101               Kolumna nr trzy podtrzymana na 0
4     0101          -2 2 -2 0     2 > 0    0101               Kolumna nr cztery podtrzymana na 1
5     0101          0 -2 2 -2     -4 < 0   0101               Kolumna nr jeden stabilna = 0
6     0101          -2 0 -2 2     2 > 0    0101               Kolumna nr dwa stabilna = 1
7     0101          2 -2 0 -2     -4 < 0   0101               Kolumna nr trzy stabilna = 0
8     0101          -2 2 -2 0     2 > 0    0101               Kolumna nr cztery stabilna = 1;
                                                                   stabilny wektor wyjściowy: 0101

Na wejście dajemy wektor E. Obliczamy wartość pierwszej kolumny i jeśli różni się od wektora wejściowego, zmieniamy ją i podajemy na start nowy wektor. Powtarzamy to, aż otrzymany na wyjściu wektor będzie stabilny, czyli kiedy żadna z kolumn nie ulegnie zamianie.

Widać w powyższym przykładzie, że nasza sieć po przetworzeniu wektora E podała na wyjście wektor B = (0,1,0,1), czyli sygnał przestał oscylować między wektorami wzorcowymi A oraz B.

Sieci neuronowe potrafią rozwiązać problemy, dla których nie istnieje znany wzór lub nie ma kompletnych danych. Dlatego stosuje się je do rozpoznawania obrazów, oczyszczania dźwięków z szumu, odczytywania zeskanowanego tekstu i wielu innych problemów.

 


Aby dodawać komentarze musisz być zalogowany!


Kontakt

Jeśli chcesz się z nami skontaktować napisz na adres: info(at)binboy.org lub odwiedź nasz profil na Facebooku!

O Nas

Serwis binboy.org to kopalnia wiedzy dla wszystkich z branży IT, w szczególności dla programistów i webmasterów. To duży zbiór kursów programowania, tutoriali, darmowych ebooków, setki kodów źródłowych itp.

Bądź w kontakcie

Panel użytkownika

Zaloguj się do panelu użytkownika.
Nie masz konta? Zarejestruj się!
Zapomniałeś hasła?