PCkurier - poradnik menedżera IT  
Szukaj:
    
Pomoc
 w Archiwum  w Wiadomościach
 
  Akademia   IT.Forum   IT Track
 
Strona główna
Wiadomości
Nowy numer
Archiwum
Prenumerata
Kurs HTML
Redakcja
REKLAMA
Zasoby WWW
Info
Pytamy
Czy korzystasz z komunikatorów do celów służbowych?
Tak Nie
Polecamy
Konfiguracja i zarządzanie
Urządzenia pamięci masowej
Koniec ery faksów
Środowisko drukowania iPrint
Komponenty i obiekty
Środowisko drukowania NDPS
Czekając na walec
Globalna gmina
Informatyzacja w parterze
Globalna gmina
Łódzki początek...
Globalna gmina
Wielki przekręt
Fałszerstwa księgowe
Krucjata KPWiG
Fałszerstwa księgowe
Dystans do distance learning
E-szkolenia
Wielość w jednym
Routery wielofunkcyjne
Wydajemy
AEC Forum
Cad/Cam forum
CRN
Enter
Tele.Net Forum
 
Wybierz dział i/lub numer, a następnie rok lub podaj ID artykułu
Dział Numer Rok   ID
 
PCkurier 15/2000 >> DLA PRAKTYKÓW >> ALGORYTMY

Przykład zastosowania sieci neuronowych

W sieci

Autor: Janusz Gregorczyk

Z teorią obliczeń sieciowych, dziedziną dość jeszcze młodą, wiązane są nadzieje na rozwikłanie problemów, dla których zadowalające rozwiązania algorytmiczne nie istnieją lub nie są znane. Dotyczy to w szczególności takich zagadnień, jak analiza i przetwarzanie sygnałów, rozpoznawnie obrazów i mowy, problemy optymalizacji. W tym artykule przedstawimy jeden z prostszych typów sieci neuronowych i jego zastosowanie w najprostszym programie OCR.

Choć terminy "sztuczna inteligencja" czy "klasyfikacja wzorców" mogą sprawiać wrażenie bardzo skomplikowanych, zaprogramowanie prostej (lecz użytecznej) sieci neuronowej nie jest trudne nawet dla początkującego programisty. Oczywiście, nim przejdziemy do zbudowania pierwszej sieci, musimy wyjaśnić kilka podstawowych pojęć. Już sam termin "sieć neuronowa" sugeruje obecność w strukturze sieci komórek zbliżonych funkcjonowaniem do komórek biologicznego układu nerwowego. Oczywiście w stosunku do biologicznej rzeczywistości przyjmuje się wiele uproszczeń.

Model neuronu

Najprostszy model jednostki neuronowej (neuronu) ' przedstawiony pierwotnie przez McCullocha i Pittsa, a rozszerzony przez innych badaczy ' składa się z ustalonej liczby wejść i jednego wyjścia. Model taki, podobnie jak prawdziwa komórka nerwowa, poprzez wejścia otrzymuje z otoczenia pewien sygnał, który przetwarza i na wyjściu generuje odpowiedź. Wartość sygnału wyjściowego zależy od pobudzenia, które jest sumą ważoną sygnałów wejściowych. Obecność wag pozwala przypisać poszczególnym wejściom różne znaczenie, a ich modyfikacja jest podstawą procesu uczenia się sieci.

Zwykle od wartości pobudzenia odejmuje się pewną wartość progową (dla uproszczenia próg możemy traktować jako dodatkowe wejście o wadze 1,0) i tak otrzymaną wartość przetwarza się przy użyciu funkcji progowej (zwanej też funkcją przejścia lub funkcją aktywacji). Zadaniem tej funkcji jest normalizacja poziomu sygnału, najczęściej w przedziale <0, 1> lub <-1, 1>. Funkcja przejścia jest z reguły ciągła, by umożliwić uczenie sieci często stosowaną metodą propagacji wstecznej.

Najczęściej wykorzystywane funkcje aktywacji to m.in.:

  • funkcja sigmoidalna
    f(x) = 1/(1+exp(-x)),
    
    
  • tangens hiperboliczny
    f(x) = tanh(x),
    
    
  • funkcja Gaussa
    f(x) = exp(-x*x).
    
    
Struktura sieci

Oczywiście pojedyncza jednostka sieci nie jest jeszcze zdolna do wykonania użytecznych obliczeń. Potęga sieci leży w strukturze połączeń między jednostkami. Często spotykana i szczególnie prosta w implementacji jest sieć o strukturze warstwowej (multi-layered network), w której połączone są neurony kolejnych warstw, a sygnał przechodzi od wejścia do wyjścia sieci, poruszając się tylko w jednym kierunku (określa się to terminem feedforward). W praktyce nie stosuje się sieci mającej więcej niż trzy warstwy. Najczęściej przyjmuje się pełną strukturę połączeń między kolejnymi warstwami (każdy z każdym), gdyż brak połączenia można modelować ustawieniem odpowiedniej wagi na zero.

Symulator sieci w działaniu

Sieci warstwowe stosuje się do klasyfikacji wzorców, tzn. wszędzie tam, gdzie każdemu sygnałowi wejściowemu chcemy przypisać określony stan wyjść. Niejako przy okazji uwidaczniają się tutaj największe zalety sieci neuronowych: sieć nie tylko jest do pewnego stopnia odporna na szum (tj. zakłócenia), ale często potrafi także sensownie ekstrapolować, prawidłowo klasyfikując niespotkane wcześniej wzorce.

Jak działa sieć? Wektor wejściowy przekazywany jest do pierwszej z warstw i dla każdej jednostki tej warstwy obliczany jest sygnał wyjściowy przekazywany dalej. Algorytm ten powtarza się dla kolejnych warstw aż do uzyskania sygnału na wyjściu sieci. By ten wyjściowy sygnał odpowiadał naszym potrzebom, niezbędny jest trening sieci.

Proces uczenia

Kluczem do "nauczenia" sieci rozwiązywania danego problemu jest odpowiedni dobór wag wejściowych. Dobór ten można zrealizować na wiele sposobów. W przypadku tzw. "uczenia z nauczycielem" (gdy znana jest poprawna odpowiedź) powszechnie stosowany jest algorytm wstecznej propagacji błędu.

W metodzie tej, jak wskazuje jej nazwa, błąd obliczony dla warstwy wyjściowej jest przekazywany wstecz, w głąb sieci, aż do wejścia. Wagi każdorazowo modyfikuje się tak, by minimalizować wyznaczony błąd. W każdej iteracji procesu nauczania można wyodrębnić następujące etapy:

1. Określamy błąd jednostki j warstwy wyjściowej jako:

Err[j] = X'[j] * (CEL[j] ­ X[j])

gdzie:

CEL [j] ­ pożądana wartość na wyjściu j;

X[j] ­ wartość otrzymana;

X'[j] ­ pierwsza pochodna funkcji przejścia w punkcie X[j].

2. Określamy błąd dla jednostki j w warstwie ukrytej l wg wzoru:

Err[l, j] = X'[l, j] * SUMk(Err[l + 1, k] * WAGA[l + 1, k, j])

gdzie:

k ' zmienia się od 1 do liczby jednostek warstwy (l+1);

Err[l, j] ­ błąd przypisany jednostce j warstwy l;

X'[l, j] ­ pierwsza pochodna funkcji przejścia w punkcie X[l, j];

WAGA[l, k, j] ­ waga wejścia j jednostki k warstwy l.

3. Modyfikujemy wagi wejściowe każdego neuronu:

WAGA[l, j] = WAGA[l, j] + eta * SUMk(Err[l, j] * X[l ­ 1, k]) + alfa *  dWAGA[l, j],

gdzie:

eta ­ czynnik (stała) uczenia;

alfa ­ czynnik tłumienia;

dWAGA ­ zmiana wagi w czasie.

Proces uczenia sieci polega na cyklicznej prezentacji zestawu par wzorzec'odpowiedź i każdorazowej modyfikacji wag aż do uzyskania pożądanej precyzji. Należy zawsze pamiętać, że konkretna sieć może nie być w stanie nauczyć się prawidłowego rozpoznawania wszystkich wzorców. Dla efektywności uczenia niezwykle istotny jest odpowiedni dobór współczynników eta i alfa. Przy wyższej wartości eta sieć uczy się szybciej, ale mniej dokładnie. Przy niższej wartości eta sieć uczy się wolniej, ale bardziej skutecznie. Wartość alfa odpowiada za wytłumienie niepożądanych oscylacji. Odpowiedni dobór alfa zwykle znacznie przyspiesza uczenie.

Program przykładowy

Zastosowanie sieci neuronowych przedstawimy na przykładzie prostego programu OCR (kody źródłowe zamieszczamy na naszej stronie WWW). Choć nie rozpoznaje on ciągłego tekstu, a jedynie pojedyncze znaki (symbole), stanowi na pewno ciekawą ilustrację przedstawionych zagadnień. Po zapoznaniu się z interfejsem klasy NeuralNetwork czytelnicy będą mogli wykorzystać ją do klasyfikacji wzorców wejściowych innych niż znaki.

Zajrzyj
Obszerna lista dokumentacji i oprogramowania
Stuttgarter Neural Network Simulator
­ jeden z najlepszych darmowych symulatorów sieci
Neural Networks at your Fingertips
­ przykłady wykorzystania sieci neuronowych, kod źródłowy w jezyku C
EasyNN - prosty w użyciu, okienkowy symulator
Grupa dyskusyjna poświęcona sieciom neuronowym.

W programie napisanym w C++ wyodrębniłem dla przejrzystości trzy moduły: klasy Neuron, NeuralLayer oraz NeuralNetwork.

Klasa Neuron jest implementacją przedstawionego wyżej modelu jednostki neuronowej. Jej konstruktor przyjmuje jeden parametr typu całkowitego określający liczbę wejść. Najważniejszą metodą jest propagate() obliczająca wartość sygnału wyjściowego. W zależności od wartości zmiennej activationFunction , stosowaną funkcją aktywacji jest funkcja liniowa lub sigmoidalna.

Klasa NeuralLayer przedstawia warstwę sieci. Konstruktor obiektu tej klasy wymaga określenia liczby jednostek oraz liczby wejść każdej z jednostek. Podobnie jak w klasie Neuron, za przetwarzanie sygnału odpowiada metoda propagate(). Oprócz tego klasa ma kilka metod ułatwiających operacje na jednostkach i umożliwiających dostęp do tych jednostek.

Klasą bezpośrednio stosowaną "na zewnątrz" jest NeuralNetwork, będąca reprezentacją sieci neuronowej jako wektora warstw. Prywatne metody computeError() i adjustWeights() są odpowiedzialne za wyznaczenie i wsteczną propagację błędu oraz za modyfikację wag. Przy konstrukcji sieci określamy jedynie liczbę wejść, a kolejne warstwy dodajemy metodą addLayer(). Wektor wejściowy oraz pożądany stan wyjść ustalają metody setInput(double*) oraz setTarget (double*). Odpowiedź sieci uzyskamy, wywołując metodę getOutput(double*).

Moduł OCR.cpp realizuje postawione przed nim zadanie w możliwie najprostszy sposób: uczy sieć zestawu wzorców (cyfr arabskich) wczytanych z pliku pattern.dat, a następnie testuje ją na podobnym, lecz pełnym szumów zestawie z pliku test.dat. Wynik analizy każdego wzorca prezentowany jest na ekranie. Zachęcam do porównania zawartości obu plików z danymi i ich modyfikacji.

Wynik dzialania programu przykładowego


Nawigacja
Poprzedni artykuł z działu Następny artykuł z działu
Poprzedni artykuł z numeru Następny artykuł z numeru
Artykuł z archiwum wybrany losowo

Najświeższe artykuły na ten temat
23/2002 - Wskaźnikiem szybciej - Programowanie w C#
22/2002 - Graficzne C (cz. 2) - Programowanie grafiki
21/2002 - Graficzne C (cz. 1) - Programowanie grafiki
20/2002 - Zend 2.0 - nowe jądro PHP - Języki skryptowe
19/2002 - Łatwe programowanie - GTK+ i GNOME
14/2002 - Krótsza droga do informacji - Standard do opisu zasobów internetowych
11/2002 - Akcelerowanie przycisków - Własne komponenty w środowisku .NET
Poprzednie artykuły na ten temat

Jeśli masz uwagi lub opinie, którymi chcesz podzielić się z innymi, wpisz je do tego formularza
Pseudonim *
Hasło *
Tytuł komentarza
Treść
Ocena 1 2 3 4 5 6 7 8 9 10
*) Jeśli nie masz hasła, to najpierw się zarejestruj, jeśli zapomniałeś hasła, to Ci je przypomnimy
Proponujemy
Polscy przedsiębiorcy muszą podchodzić "Z wyczuciem do web services" Na razie technologia ta jest słabo rozpowszechniona i wciąż na etapie dojrzewania, więc inwestowanie w nią jest dość ryzykowne. Warto jednak śledzić, co się w tej dziedzinie zmienia. W Poradniku menedżera IT piszemy, jak uruchamia się web services, przedstawiamy przykłady działających usług i podajemy, jak obliczać zwrot z inwestycji w tę technologię.
Organizujemy
Internet dla firm
Warszawa, 5 XII 2002 r.
Patronujemy
Profesjonalne szkolenia informatyczne
PCkurier patronuje organizowanym przez CE EduSoft szkoleniom informatycznym. Dla naszych prenumeratorów przewidziane są 10-procentowe zniżki na wybrane kursy
Wiadomości | Nowy numer | Archiwum | Akademia | IT.Forum | IT Track
Prenumerata | Redakcja | Reklama | Zasoby WWW | Kurs HTML
Lupus sp. z o.o. | Polityka prywatności | Wszelkie prawa zastrzeżone | Info | webmaster@pckurier.pl