Wsteczna propagacja - rozpaczliwe pomocy!

0

Witam. Piszę sieć neuronową ze wsteczną propagacją korzystając z pomocy kilku podobnych postów na tym forum i podanych tam źródeł ale kilka kwestii wymaga według mnie uściślenia.

  1. Błąd warstwy ukrytej. Był już taki temat na forum i odpowiedzi pozwoliły mi wreszcie zrozumieć o co "kaman" ale jednej kwestii nie rozumiem - czy błąd dla warstwy ukrytej wyliczam ze starymi wagami warstwy wyjściowej, czy najpierw mam je zmodyfikować i dopiero wtedy zająć się warstwą ukrytą? pÓÓÓÓki co moja warstwa wyjściowa wylicza sobie ten błąd mnożąc błąd swojego wyjścia przez wszystkie wagi po kolei i zapisując wynik w tablicy, następnie tablice ze wszystkich neuronów wyjściowych są zbierane i wartości z tych samych pozycji są dodawane i tak powstałe "cosie" są rozsyłane do odpowiednich neuronów warstwy ukrytej. i to jest drugi problem - czy te wyliczone "cosie" to są wartości odpowiedzi oczekiwanych od warstwy ukrytej czy może jest to od razu wyliczony błąd tej warstwy? Nigdzie nie mogę się tego dowiedzieć...

  2. Obliczanie zmian wag. Według wzorów jakie znalazłem wygląda tak:

wartość danej wagi + ((współczynnik uczenia * błąd wyjścia tego neuronu) * wartość jaka ostatnio była na tym wejściu do którego obliczamy nową wagę).

I tu jest moje drugie pytanie - wyliczona wartość jest nową wagą, czy raczej mam ją dodać / odjąć od obecnej wartości?

  1. Obliczanie błędu. Takie proste że "ścisłowcom" nawet nie przyjdzie do głowy że można się zastanawiać co tu od czego jest odejmowane? odpowiedź oczekiwana od otrzymanej czy na odwrót? No ja się właśnie zastanawiam bo niby taki szczegół a jednak ma znaczenie ponoć ;-P

Z góry dziękuje za nie złoszczenie się na nooba i odpowiedzi na te niebagatelne pytania.

0

No! ludzie! czy ja zadałem takie trudne pytania że nikt nie zna odpowiedzi, czy raczej tak "gópie", że nikomu nawet nie chce się poświęcić tych kilku minut na naskrobanie jakichś wskazówek? :-(
Bardzo was proszę o pomoc. [???] [glowa]

0

A ja z kolei zachęcam do samodzielnego, eksperymentalnego rozwiazania problemow

Najpierw stworz sobie jakis duzy plik ktory przechowuje wyniki jakiegos problemu np XOR (czy ilosc wejsc o wartosci 1.0 jest nieparzysta).
Czyli zbior par (wejscie, wynik), np:
1.0 1.0 1.0 1.0 0.0
0.0 1.0 0.0 0.0 1.0
0.0 1.0 1.0 1.1 1.0
Ostatnia kolumna jest wynikiem XOR-owania po wcześniejszych kolumnach.
Oczywiscie najlepiej by ten plik nie byl trywialnie maly (czyli mial duzo "wierszy" i "kolumn"), zeby problem nie byl trywialny.

Pytania które zadałeś nie dają aż tak dużo możliwości ewentualnych postaci kodu - uruchom różne zmodyfikowane wersje programu i sprawdź która się uczy. Ja implementowałem algorytm uczenia z różnych źródeł, na pierwszy rzut oka byl poprawny, nie od razu jednak działał, ale metodami właśnie testowania, prób i błędów znalazłem w nim wszystkie usterki.

0

Nie pamiętam dokładnie, ale polecam tą stronę: http://www.neuron.kylos.pl/pliki/uczenie/uczenie3.html

Otwórz stronę w przeglądarce gdzie działa applet Javy - masz tam symulację krok po kroku. Na tej podstawie możesz dojść co i jak ze wzorami.

0

Widzisz, cały problem w tym, że to jest dużo (biorąc pod uwagę wymagane ilości kodu) różnych możliwości. Za dużo żeby je testować choćby ze względu na kapryśność sieci w trakcie nauki a przecież tylko jedna z tych kombinacji jest prawidłowa.

Proszę więc chociaż o odpowiedź na jedno z pytań. W miarę możliwości nie na drugie bo już sprawdziłem z ołówkiem i kartką w ręku, że wyniki z tego wzoru są liczbami zbliżonymi do obecnych wag więc na zdrowy rozum są to nowe wagi, nie modyfikatory które trzeba odjąć/dodać.

Ale naprawdę powstrzymajcie się od rad typu "dojdź do tego sam". Wszystko co związane z budową i działaniem sieci neuronowych zrozumiałem sam, i tylko we wstecznej propagacji potrzebuję pomocy ponieważ jest to praktycznie czysta matematyka której nie tyle nie rozumiem co nigdy nie widziałem. Wzory które znalazłem zawierały naprawdę niesamowite znaczki które też odczytałem sam ale czytać definicje to nie to samo co mieć kogoś kto to wytłumaczy. Dlatego właśnie piszę tu na forum. I przecież nie proszę o "gotowca"!

ps. Deti, byłem na tej stronie jak tylko podałeś jej adres w innym temacie o wstecznej propagacji. Był bardzo pomocny i dziękuję, ale te pytania to to co pozostało dla mnie niewyjaśnione po przeczytaniu jej zawartości.

0

Jestem już dzisiaj zmęczony, ale jeśli dobrze rozumiem pytania, to:

  1. Zawsze w algorytmie korekcji wag patrzysz na "poprzednie" wartości wag. Gdy wzór je modyfikuje zapisujesz nowe wartości wag gdzieś tymczasowo w pamięci, cały czas gdy zajdzie taka potrzeba odwołując się do "starszych". Aktualizacja wag jest dokonywana jednorazowo, gdy uzyskasz już cały wektor nowych wag.

  2. blad = to_co_powinno_byc - to_co_siec_wyplula.
    Mozna to intuicyjnie wytlumaczyc tak: gdy blad > 0, to znaczy ze siec powinna lekko zwiekszyc wskazania dla aktualnego wejscia.

0

Dziękuje! to już w zasadzie wyczerpuje moje wątpliwości :-)

Gdyby pojawił się jeszcze jakiś typowo matematyczny problem to jeszcze napiszę ale na razie jest już dobrze...

Jeszcze raz wielkie dzięki

0

OK. Zrobiłem kilka eksperymentów i wychodzi na to, że te "cosie" o które pytam w pierwszym poście to są już obliczone błędy dla wyjść neuronów warstwy poprzedniej - tak gdyby ktoś kiedyś potrzebował - ale mogę się jeszcze mylić. W razie czego dam jeszcze znać...

0
Serratus napisał(a)

Witam. Piszę sieć neuronową ze wsteczną propagacją korzystając z pomocy kilku podobnych postów na tym forum i podanych tam źródeł ale kilka kwestii wymaga według mnie uściślenia.

  1. Błąd warstwy ukrytej. Był już taki temat na forum i odpowiedzi pozwoliły mi wreszcie zrozumieć o co "kaman" ale jednej kwestii nie rozumiem - czy błąd dla warstwy ukrytej wyliczam ze starymi wagami warstwy wyjściowej, czy najpierw mam je zmodyfikować i dopiero wtedy zająć się warstwą ukrytą? pÓÓÓÓki co moja warstwa wyjściowa wylicza sobie ten błąd mnożąc błąd swojego wyjścia przez wszystkie wagi po kolei i zapisując wynik w tablicy, następnie tablice ze wszystkich neuronów wyjściowych są zbierane i wartości z tych samych pozycji są dodawane i tak powstałe "cosie" są rozsyłane do odpowiednich neuronów warstwy ukrytej. i to jest drugi problem - czy te wyliczone "cosie" to są wartości odpowiedzi oczekiwanych od warstwy ukrytej czy może jest to od razu wyliczony błąd tej warstwy? Nigdzie nie mogę się tego dowiedzieć...

  2. Obliczanie zmian wag. Według wzorów jakie znalazłem wygląda tak:

wartość danej wagi + ((współczynnik uczenia * błąd wyjścia tego neuronu) * wartość jaka ostatnio była na tym wejściu do którego obliczamy nową wagę).

I tu jest moje drugie pytanie - wyliczona wartość jest nową wagą, czy raczej mam ją dodać / odjąć od obecnej wartości?

  1. Obliczanie błędu. Takie proste że "ścisłowcom" nawet nie przyjdzie do głowy że można się zastanawiać co tu od czego jest odejmowane? odpowiedź oczekiwana od otrzymanej czy na odwrót? No ja się właśnie zastanawiam bo niby taki szczegół a jednak ma znaczenie ponoć ;-P

Z góry dziękuje za nie złoszczenie się na nooba i odpowiedzi na te niebagatelne pytania.

ad. 1) obliczasz je ze "starymi" wagami - czy miałeś w szkole pochodne? Jak tak to może spróbuj rozpisać sobie pochodną po funkcji błędu po każdej wadze :).
ad. 2) ojjj.... nawet nie wiem co powiedzieć O_o <- może j.w. tzn. jeszcze raz polecam spróbować obliczyć pochodną dE/dw
ad. 3) Nie ma żadnego znaczenia... błąd (E) = 1/2*(y-d)2 = 1/2*(d-y)2 -> jedyne co się zmieni to to, że będziesz musiał dać dodatkowy minus w tym drugim przypadku (tzn. ten minus będzie wynikał z pochodnej czyli j.w. :)).

0

No niestety. Z pochodną może być problem bo to co piszę to w zasadzie sam szkielet z aktywacją liniową, ale jak się zabiorę za implementację innych funkcji aktywacji to się tym pobawię.

Dzięki.

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