Backpropagation i SSN typu RBF

0

Witam,
od pewnego czasu zaciekawiły mnie sieci neuronowe, szczególnie sieci typu RBF (radial basis functions). Niestety ten typ nie należy do najlepiej opisanych w literaturze (szczególnie tej polskiej) no i mam problem ze zrozumieniem, jak douczyć taką sieć (dobór optymalnych centrów, parametrów i wag) przy pomocy metody wstecznej propagacji błędu. Czy ktoś bardziej doświadczony mógłby mi w tym pomóc - będę ogromnie wdzięczny!!! Może macie jakieś ciekawe materiały do tego lub możecie sami się wypowiedzieć - PLZ!
Na wszelki wypadek powiem, że w bierzącej wersji sieci: centra zostały wylosowane z danych wejściowych, parametr został wybrany "na oko", natomiast wagi zostały wyuczone przez rozwiązanie układu równań (operacje na macierzach). Najgorzej jest z parametrem który koniecznie powinien zostać zoptymalizowany bo przy jego niewielkich modyfikacjach błąd potrafi się zmieniać bardzo znacząco (w górę i w dół!)...
Może jeszcze powiem, że przyjąłem funkcje aktywacji Gausowską exp(suma(x-c)^2/parametr) - z tym, że parametr jest dla każdego centrum a nie dla sumy (taka drobna modyfikacja - tzn. zamiast dzielić sumę odległości euklidesowych przez parametr to zrobiłem parametr na każde centrum.
Będę ogromnie wdzięczny za jakieś wskazówki w tym temacie.
pozdrawiam,
i z góry dzięki!

0

fajny link ale niestety mało pomocny... Jeśli chodzi o Google to przeszukałem je<ort> w z dłuż </ort>i <ort>w szerz</ort> ale nie doszukałem <ort>niczeko </ort>co mogłoby jasno zobrazować sposób postępowania przy uczeniu takiej sieci metodą backpropagation... Stanąłem przy wyznaczeniu pochodnej dE/dCi,Qi,Wi (E błąd = (y-d), Ci - i-Centrum, Qi - i-parametr i Wi - i-ta Waga). Niestety nie wiem, czy teraz mam np. od centrum odejmować pochodną, czy może jeszcze ją przez coś ort!... tak samo jest z wagami i parametrem... i gdzie ta wsteczna propagacja... w sieciach sigmoidalnych wszystko jest pięknie opisane ale trochę ciężko to odwzorować w sieciach typu RBF... :(
Czy możecie pomóc ale w trochę bardziej <ort>suptelny </ort>sposób :)
Pozdrawiam

0

Na stronie http://hakger.org znajdziesz moją implementację sieci o nazwie HSynapse. Może pomoże ci zrozumieć nieścisłości. W razie problemów - pytaj na forum.

pozdrawiam

0

o jej... dzięki :) - zaraz to przeanalizuję! - Wielkie dzięki :)

0

hmm... myślałem, że będzie łatwiej z tym kodem :/ i trochę się załamałem analizując go :(.
A czy mogę dostać jakąś teoretyczną wskazówkę :P bo trochę zaczynam się gubić... :/. Gdzieś doczytałem, że należy jedynie odjąć część pochodnej funkcji błędu po wadze, centrach i parametrze odpowiednio od tych parametrów, ale to chyba nie to... (gdzie ta propagacja wsteczna - to zwyczajna metoda gradientowa...). Czy możecie mi powiedzieć co należy zrobić, gdy obliczy się już gradient dla tych parametrów?? i jeszcze mam pytanie czy po każdej zmianie parametrów należy obliczać błąd w celu ewentualnego przywrócenia parametrów?? (zdaje się, że tak przynajmniej powinno się robić właśnie w metodach gradientowych...)
Pozdrawiam,
i dziękuję z góry za pomoc!

1

Może wstawię mały opis na szybko, może trochę pomoże w analizie kodu

  1. Krótki opis klas
  • NodeBase - abstrakcyjna klasa, która reprezentuje każdy element sieci, który przekazuje sygnał

  • Link - (dziedziczy po NodeBase) - rozdziela sygnał w "zerowej" warstwie sieci i przekazuje dalej. Robi to metoda Split(double value) - argument jest sygnałem.

  • Bias - (dziedziczy po Link) - bias sieci, czyli stała wartość sygnału

  • Node- (dziedziczy po Link) - neuron.

  • ArtificialNetwork - reprezentuje sieć neuronową. Zawiera tablicę Link[]

  • Connection - reprezentuje połączenie dwóch neuronów (lub neuronu i biasu .. lub neuronu i rozdzielacza). Pole Next oznacza neuron dalszej warstwy, pole Previous - poprzedniej. W ten sposób każdy neuron może "dojść" w górę sieci lub w dół. Pole Weight jest wagą. Obiekty tej klasy również posiadają informacje o wcześniejszych zmianach wag - dzięki czemu zaimplementowałem Momentum sieci przy BP.

  1. Budowanie sieci

.. za to odpowiedzialna jest klasa NetworkGenerator - nie ma co się w nią długo wpatrywać. Klasa na podstawie informacji o warstwach tworzy odpowiednią tablicę Link[].

  1. Wsteczna propagacja.

ArtificialNetwork ma metodę BP(), która robi wsteczną propagację błędów (zauważ, że metoda jest wielokrotnie przeciążona - zależnie od potrzeb). Najpierw przepuszcza przez sieć sygnał, później czyta błędy i poprawia wagi - standardowy algorytm. Jest tu również zaimplementowane Momentum. Metoda Pulse() służy do wysłania sygnału w sieć. Sieć bieże wszystkie neuronowy wartwy pierwszej i tylko im puszcza sygnał. Te samodzielnie puszczają sygnały dalej, aż dojdzie do ostatniej warstwy (neurony wiedzą kiedy przekazać sygnał, bo wiedzą ile neuronów jest w warstwie poprzedniej - kiedy wszystkie neurony warstwy poprzedniej wyślą już sygnał - można go przekazać dalej). Z propagacją jest odwrotnie - neurony czekają na poprawki od warstwy kolejnej, aby przekazać je wyżej. Ale zasada ta sama.

Algorytm działa synchronicznie.

  1. Tracing.

Zobacz na klasę SignalTrace - służy ona do "badania" sieci - pokazuje po kolei co się dzieje. Myśle, że możesz samodzielnie przeanalizować tę klasę aby dojść jak ją użyć. W każdym razie w najbliższym wolnym czasie dodam jakiś gotowiec jak używać tej klasy (pomaga zrozumieć co się dzieje po kolei).

Jeśli chodzi o samą propagację, to prawie cała logika zawiera się w dwóch metodach klasy Node:

void Propagate(double delta,double lf,double mtm) {
void PulseBack(double d, double lf,double mtm) {

Tam są wykonywane wszelkie obliczenia.

  1. Funkcja aktywacji

.. w postaci interfejsu IActivator. Dwie metody do obsłużenia:

double Activation(double value); - wartość funkcji w punkcie
double Gradient(double value); - wartość gradientu funkcji w punkcie

Przykłady implementacji: Sigmoid, HyperbolicTangent

0

Deti, czy Twoja strona będzie jeszcze aktywna? i czy jest możliwość jeszcze zdobycie Twojego programu HSynapse? Ja się bardziej nastawiam na sieć typu MLP ale chciałbym zobaczyć jak do tego podszedłeś :)
Będę wdzięczny za wszelką pomoc.
Pozdrawiam

1

Strona niestety chwilowo padła, ale za to napisałem artykuł o sieciach nn:

http://4programmers.net/C_sharp/Gotowce/Sieci_neuronowe,_aproksymacja_i_rozpoznawanie_pisma

Jest tam też odnośnik do najnowszej wersji biblioteki oraz programów do aproksymacji funkcji oraz rozpoznawania pisma.

Miłej lektury, w razie problemów - pytaj na forum.

0

Dziękuję Ci bardzo - zaraz po zadaniu pytania znalazłem ten artykuł :D
Kawał dobrej roboty :-)
Pozdrawiam

1 użytkowników online, w tym zalogowanych: 0, gości: 1