Jak używać uszkodzonych wyświetlaczy, czyli parę słów o klasyfikacji danych i sieciach neuronowych

21.01.2010 - Piotr Lipiński
TrudnośćTrudność

Wyobraźmy sobie cyfry wyświetlane na specjalnym wyświetlaczu będącym matrycą 7 x 7 punktów (rysunek 1), składającą się z 7 wierszy zawierających po 7 punktów każdy, której punkty mogą być zapalone (kolor czarny) lub zgaszone (kolor biały). Rysunek 1 przedstawia przykładowy obraz możliwy do wyświetlenia na takim wyświetlaczu. Stan wyświetlacza możemy więc opisać podając stany ("zapalony" lub "zgaszony") wszystkich 7 x 7 = 49 punktów matrycy. Przyjmijmy, że stan każdego punktu matrycy będziemy oznaczać liczbami 0 lub 1, gdzie 0 będzie oznaczać punkt zgaszony, zaś 1 punkt zapalony. Przyjmijmy też, że stan wyświetlacza będziemy opisywać podając kolejno stany wszystkich punktów matrycy w kolejności od dołu do góry i od lewej do prawej. Wówczas stan wyświetlacza możemy utożsamiać z ciągiem 49 liczb binarnych (na przykład stan wyświetlacza z rysunku 1 możemy utożsamić z ciągiem 0111100 0000010 0000010 0111100 0100000 0100000 0111110).

 

Rys 1. Cyfra 5 wyświetlana na wyświetlaczu będącym matrycą 7 x 7 punktów.

 

Naszym celem jest nauczenie komputera rozpoznawania cyfr wyświetlanych na takim wyświetlaczu, czyli zwracania na wyjściu programu cyfry odpowiadającej wprowadzonemu na wejściu programu stanowi wyświetlacza. Pozornie wydaje się, że nie jest to trudne zadanie, wystarczy bowiem zapisać w pamięci wszystkie interesujące nas stany wyświetlacza, czyli stany odpowiadające wszystkim możliwym cyfrom (a jest ich tylko 10), a następnie porównywać wprowadzane na wejściu programu stany wyświetlacza z zapisanymi w pamięci stanami wzorcowymi.

Co się jednak stanie kiedy wyświetlacz ulegnie awarii polegającej na tym, że jeden lub więcej punktów matrycy nie będzie się zapalać (przepalenie punktów matrycy) ? Wówczas wszystkie cyfry będą wyświetlane w zmienionej postaci (rysunek 2), więc nasze rozwiązanie oparte na porównywaniu stanu wyświetlacza z zapisanymi w pamięci stanami wzorcowymi nie będzie umożliwiać poprawnego rozpoznawania wyświetlanych cyfr. Naturalnie, moglibyśmy uaktualniać zapisane w pamięci wzorce cyfr, ale musielibyśmy wtedy stale kontrolować poprawność działania wyświetlacza i aktualizować wzorce cyfr za każdym razem kiedy jakiś punkt matrycy uległby uszkodzeniu. Rozwiązanie takie nie sprawdziłoby się też w przypadku kiedy uszkodzone punkty jednak od czasu do czasu zapalałyby się. Zaproponujemy więc inne bardziej uniwersalne rozwiązanie wykorzystujące sztuczną sieć neuronową.

 

Rys 2. Cyfra 5 wyświetlana na wyświetlaczu z uszkodzonymi (przepalonymi) punktami w przedostatniej kolumnie matrycy.

 

Sztuczna sieć neuronowa składa się z pewnej liczby połączonych ze sobą sztucznych neuronów (rysunek 3). Każdy neuron posiada pewną liczbę wejść i jedno wyjście. Działanie neuronu polega na przekształceniu wartości podanych na wejściach w wartość zwracaną na wyjściu. Przekształcenie takie opisywane jest następującym wzorem:

y = f(w0 x0 + w1 x1 + w2 x2 + …+ wn xn),

gdzie

-     y oznacza wartość wyjścia neuronu,

-     n oznacza liczbę wejść neuronu,

-     x1, x2, …, xn oznaczają wartości podane na kolejnych wejściach neuronu,

-     w1, w2, …, wn oznaczają ustalone wagi przypisane kolejnym wejściom neuronu,

-     x0, w0 oznacza odpowiednio wartość dodatkowego abstrakcyjnego wejścia sztucznego neuronu, która zawsze jest równa 1, oraz ustaloną przypisaną mu wagę,

-     f oznacza ustaloną funkcję aktywacji sztucznego neuronu, na przykład liniową funkcję aktywacji określoną wzorem f(x) = x lub sigmoidalną funkcję aktywacji określoną wzorem f(x) = (1 + e-x)-1. 


Neurony w sieci neuronowej są ułożone w warstwy, w taki sposób, że wyjścia neuronów warstwy niższej są wejściami neuronów warstwy wyższej (rysunek 3). Wejścia neuronów pierwszej warstwy to wejścia całej sieci neuronowej, zaś wyjścia neuronów ostatniej warstwy to wyjścia całej sieci neuronowej. Działanie całej sieci neuronowej polega na wprowadzeniu na wejścia sieci neuronowej podanych wartości, obliczeniu wartości wyjść neuronów pierwszej warstwy, przekazaniu ich na wejścia neuronów kolejnej warstwy, obliczeniu wartości wyjść neuronów kolejnej warstwy i powtarzaniu tych czynności aż do obliczenia wartości wyjść neuronów ostatniej warstwy, czyli wyjść sieci neuronowej.

 

Rys 3. Sztuczna sieć neuronowa składająca się z 7 neuronów umieszczonych trzech warstwach i połączonych ze sobą. Czarne strzałki na dole oznaczają wejścia sieci neuronowej. Czarna strzałka na górze oznacza wyjście sieci neuronowej.

 

Chociaż działanie sieci neuronowej wydaje się dość proste, trudnym zagadnieniem jest samo konstruowanie sieci neuronowej, czyli określenie jej architektury (ustalenie liczby wejść i wyjść sieci neuronowej, ustalenie liczby warstw neuronów, ustalenie liczby neuronów w każdej warstwie, ustalenie połączeń między neuronami, ustalenie funkcji aktywacji dla każdego neuronu) oraz określenie wag dla każdego neuronu. Architekturę sieci neuronowej ustala się najczęściej eksperymentalnie sprawdzając różne możliwości. Natomiast wagi neuronów ustala się automatycznie w procesie uczenia sieci neuronowej, który polega na wprowadzaniu na wejścia sieci neuronowej wcześniej przygotowanych danych wejściowych, obliczaniu wartości wyjść sieci neuronowej, porównywaniu ich z wartościami pożądanymi przygotowanymi wcześniej, korekcie wartości wag neuronów i powtarzaniu tych czynności tak długo aż dla wcześniej przygotowanych danych wejściowych sieć neuronowa zacznie zwracać na swoich wyjściach wartości zbliżone do pożądanych. Istnieje kilka różnych algorytmów uczenia sieci neuronowych, jednym z bardziej popularnych jest algorytm propagacji wstecznej błędu.

Wracając do rozpoznawania cyfr wyświetlanych na wyświetlaczu, zaproponujemy rozwiązanie wykorzystujące sieć neuronową o 49 wejściach, na których będziemy wprowadzać stan wyświetlacza (49 liczb binarnych), i o 10 wyjściach, które będą odpowiadać współczynnikowi podobieństwa wprowadzonego stanu wyświetlacza do kolejnych stanów wzorcowych (10 wzorców cyfr). Rysunek 4 przedstawia architekturę takiej sieci neuronowej. Zastosujemy liniowe funkcje aktywacji wszystkich neuronów.

 

Rys 4. Sztuczna sieć neuronowa składająca się z dwóch warstw neuronów, 49 neuronów wejściowych i 10 neuronów wyjściowych, przeznaczona do rozpoznawania cyfr wyświetlanych na matrycy 7 x 7 punktów.

 

Proces uczenia sieci neuronowej polega tutaj na wielokrotnym wprowadzaniu na wejścia sieci neuronowej wzorcowych stanów wyświetlacza i korekcie wag neuronów (początkowo ustawionych losowo), tak aby sieć neuronowa zwracała poprawne odpowiedzi na swoich wyjściach dla wprowadzanych na swoich wejściach wzorców.

Rysunek 5 przedstawia ogólny schemat algorytmu uczenia sieci neuronowej. Dane wprowadzane na wejścia sieci neuronowej i przygotowane wcześniej poprawne odpowiedzi spodziewane na wyjściach dla tych danych stanowią tak zwane dane uczące. W rozpatrywanym przypadku rozpoznawania cyfr wyświetlanych na wyświetlaczu, dane uczące składają się z 10 próbek (jedna próbka odpowiada jednej cyfrze), a każda próbka zawiera wzorcowy stan wyświetlacza (ciąg 49 liczb binarnych) oraz poprawną odpowiedź sieci neuronowej (ciąg 10 liczb binarnych). Proces uczenia sieci neuronowej rozpoczyna się od losowego ustawienia wag neuronów. Następnie, w pętli, wybierana jest losowo próbka danych s ze zbioru danych uczących. Na wejście sieci neuronowej wprowadzane są dane wejściowe s.wejscie zawarte w wybranej próbce danych i obliczana jest odpowiedź sieci neuronowej y. Odpowiedź y porównywana jest ze spodziewaną poprawną odpowiedzią sieci neuronowej t = s.wyjscie zawartą w wybranej próbce danych i obliczany jest błąd sieci (jeżeli sieć neuronowa ma tylko jeden neuron wyjściowy, to błędem jest wartość bezwzględna różnicy |y – t|, w przeciwnym przypadku, błędem jest suma wartości bezwzględnych takich różnic dla wszystkich neuronów wyjściowych). Po obliczeniu błędu, kolejno dla każdej warstwy neuronów poczynając od przedostatniej, dla każdego neuronu i każdej jego wagi, obliczane są wartości, o które należy zmniejszyć lub zwiększyć poszczególne wagi, aby sieć neuronowa zwróciła odpowiedź bliższą poprawnej. Dokładny sposób obliczania tych wartości przekracza ramy tego artykułu, wymaga zastosowania analizy matematycznej i rachunku pochodnych (tzw. metoda gradientowa), zainteresowani czytelnicy mogą znaleźć szczegółowy opis tych obliczeń w literaturze (szukając opisu algorytmu propagacji wstecznej błędu). Ostatecznie wszystkie wagi wszystkich neuronów są aktualizowane i całość obliczeń w pętli jest powtarzana dopóki sieć neuronowa nie potrafi poprawnie przetworzyć wszystkich próbek danych lub nie zostało osiągnięte inne kryterium końca algorytmu (np. związane z ograniczeniem czasu uczenia lub liczbą iteracji pętli).

 

losowa inicjalizacja wag sieci

powtórz

wybierz losowo próbkę danych s ze zbioru danych uczących

       y = wynik sieci neuronowej dla wejścia s.wejscie

       t = spodziewana poprawna odpowiedź s.wyjscie

       obliczenie błędu – różnic między y i t

       dla każdej warstwy neuronów począwszy od góry

obliczenie D dla wag połączeń między neuronami
danej warstwy, a warstwy następnej

       aktualizacja wag w sieci na podstawie obliczonych D 

dopóki wszystkie próbki nie są przetwarzane poprawnie
lub nie zostało osiągnięte inne kryterium końca algorytmu

Rys 5. Ogólny schemat algorytmu uczenia sieci neuronowej.

 

Nauczona sieć neuronowa powinna nie tylko zwracać poprawne wyniki dla wprowadzanych wzorcowych stanów wyświetlacza, ale także dla stanów do nich zbliżonych, powinna więc być odporna na zaburzenia obrazów wynikające z uszkodzenia niektórych punktów matrycy. Sprawdźmy działanie naszej sieci neuronowej. Tabela 1 przedstawia wyniki kilku przeprowadzonych eksperymentów. Pierwsza kolumna przedstawia obraz wyświetlany na wyświetlaczu, druga kolumna zawiera wartości otrzymane na wyjściach sieci neuronowej i ostateczną klasyfikację.

 

Tabela 1. Wyniki działania nauczonej sieci neuronowej dla kilku przeprowadzonych eksperymentów.

h="133" height="133">

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,99

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,00

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 2

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,97

  wyjście 3: 0,01

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,01

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 2 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,99

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,00

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 3 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,97

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,00

  wyjście 7: 0,02

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 3 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,99

  wyjście 6: 0,00

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 5 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,96

  wyjście 6: 0,00

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,22

Ostatecznie – wzorzec cyfry 5 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,00

  wyjście 7: 0,99

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 7 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,01

  wyjście 2: 0,00

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,00

  wyjście 6: 0,00

  wyjście 7: 0,96

  wyjście 8: 0,00

  wyjście 9: 0,00

Ostatecznie – wzorzec cyfry 7 

Wartości na wyjściach sieci:

  wyjście 0: 0,00

  wyjście 1: 0,00

  wyjście 2: 0,00

  wyjście 3: 0,00

  wyjście 4: 0,00

  wyjście 5: 0,45

  wyjście 6: 0,00

  wyjście 7: 0,00

  wyjście 8: 0,00

  wyjście 9: 0,55

Ostatecznie – wzorzec cyfry 9 

 

 

 

Rzeczywiście, nauczona sieć neuronowa poprawnie rozpoznaje nie tylko wzorcowe obrazy cyfr, ale także obrazy mocno zaburzone. Warto zauważyć, że decyzje sieci neuronowej są w większości przypadków jednoznaczne, dla pierwszych 8 przykładów sieć neuronowa wskazała mocne podobieństwo obrazu tylko do jednego ze wzorców. Ostatni przykład pokazuje, że nie musi tak być zawsze – sieć neuronowa wskazała duże podobieństwo ostatniego obrazu zarówno do cyfry 5 jak i do cyfry 9.

 

Dodatkowe uwagi:

1. Dostępnych jest wiele gotowych pakietów oprogramowania umożliwiających konstruowanie i uczenie sieci neuronowych. Szczególnie interesujące są (dostępne w internecie):

- pakiet SNNS (Stuttgart Neural Network Simulator) napisany w C++

- pakiety JOONE i Neuroph napisane w Javie

- pakiety Netlab lub SOMToolbox (troche inny rodzaj sieci neuronowych) przeznaczone dla Matlaba

Trzy pierwsze pakiety można uruchomić w trybie interaktywnym jako gotowe oprogramowanie lub użyć jako biblioteki we własnych programach.

2. Dostępnych jest też wiele gotowych implementacji algorytmów uczenia sieci neuronowych, zwłaszcza algorytmu propagacji wstecznej błędu, na przykład:

- projekt BP – implementacja w C++ (http://www.codeproject.com/KB/recipes/BP.aspx)

- projekt BackProp1 – implementacja w Java (http://sourceforge.net/projects/backprop1)

3. Oprócz klasycznych wielowarstwowych sieci neuronowych przedstawionych w tym artykule, istnieje wiele innych rodzajów sieci neuronowych, takich jak sieci samoorganizujące się Kohonena czy rosnący gaz neuronowy. Ciekawe demo działania takich sieci neuronowych, DemoGNG, można znaleźć na stronie internetowej uniwersytetu w Bochum http://www.neuroinformatik.ruhr-uni-bochum.de/VDM/research/gsn/DemoGNG/GNG.html.

 

Zadania dla czytelnika:

1. Punkty przedstawianego w artykule wyświetlacza mogą być tylko w dwóch stanach ("zapalony" lub "zgaszony"). Jak zmieni się prezentowane rozwiązanie jeśli dopuścimy różne stopnie świecenia punktów (zamiast dwóch kolorów, białego i czarnego, dopuścimy także odcienie szarości) ?

2. Zaproponuj architekturę sieci neuronowej służącej do rozpoznawania liter alfabetu angielskiego wyświetlanych na wyświetlaczu będącym matrycą 8 x 8 punktów.

3. Zaproponuj architekturę sieci neuronowej, spróbuj też ustalić wagi dla jej neuronów, która dla dwóch wartości logicznych p i q będzie zwracać wartość p XOR q.

4. Na co należy zwrócić uwagę przygotowując dane uczące dla sieci neuronowej ?

 

 

Piotr Lipiński
Instytut Informatyki Uniwersytetu Wrocławskiego
lipinski@ii.uni.wroc.pl
5
Twoja ocena: Brak Ocena: 5 (2 ocen)

Copyright © 2008-2010 Wrocławski Portal Informatyczny

design: rafalpolito.com