Autor Wątek: Sterowanie armatką (ssn-ann: algorytm wstecznej propagacji błędów)  (Przeczytany 6794 razy)

Offline Marcin Baszcz...

  • Użytkownik

# Styczeń 15, 2009, 11:02:43
Witam wszystkich, baardzo dawno mnie tu nie było ;)  Przejdę do sedna sprawy:
Mam do napisania program, w którym to armatka ma trafić w klocek (znajdujący się naprzeciwko). Armatka zawsze znajduję się w tej samej pozycji. Jej wystrzał jest reprezentowany przez 2 parametry, są to: kąt oraz siła strzału. Klocek natomiast znajduje się naprzeciwko jego pozycja x jest stała, pozycja y jest natomiast losowa.

Moja sieć w takim układzie ma na wejściu pozycje y klocka, oraz na wyjściu dwie dane (siła + kąt).

Zastosowany układ sieci: 1, 3, 2 to jest:
jedno wejście, 3 neurony w warstwie ukrytej, 2 neurony w warstwie wyjściowej (2 wyjścia).

Stworzyłem prostą implementację algorytmu, która działa poprawnie (testowałem ją do nauki i rozpoznawania pewnych obiektów).
Konstruktor sieci ma określone parametry:
warstwy (opisuje ile jest warstw): 1,3,2
współczynnik uczenia: 0.1
bias: true
funkcja aktywacji: sigmoidalna unipolarna (ale mam do dyspozycji tez bipolarną)

Problem jest natury takiej że jeśli dam na do treningu dane typu:
Wejście (Y): 20
Wyjście (kąt 45, siła 45);
Sieć po treningu zwraca wartości z zakresu funkcji aktywacji... (0-1 / -1 1) - co jest oczywiste ale dla mnie niedopuszczalne (potrzebuję konkretny kąt - siłę).
Mój algorytm niestety nie posiada możliwości wstawienia innej funkcji aktywacji dla warstwy wyjściowej ponieważ nie znalazłem nigdzie przykładów jak coś takiego zaimplementować (jeśli ktoś wie jak napisać algorytm wstecznej propagacji błędów w którym to warstwa ukryta będzie mieć inną funkcję aktywacji od wyjściowej to bardzo proszę o pomoc: mile wskazane również konkretne przykłady / adresy).

Próbowałem różnych "trików" np przy nauce podzielić kąt przez 100 a przy wyjściu mnożyć go jednakowo... niby mieszczę się dzięki temu w zakresie funkcji aktywacji i sieć powinna zwracać to co potrzeba... ale tak nie jest.
Problem nie jest skomplikowany. Za wszelkie sugestie będę wdzięczny.




Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline grrr

  • Użytkownik

# Styczeń 15, 2009, 11:40:26
Prawodpodobnie masz poprawną sieć (skoro testowałeś), ale jej źle używasz. Przypuszczam, że testy były mniej-więcej takie:
- uczysz rozpoznawania literki A. Dzielisz obrazek na ileś klocków (neuronów) i dajesz im wartość 0 lub 1 (w zależności od tego, jaki w danej kratce jest kolor)
- następnie robisz sieć i dajesz jej na wejście wartość 20... na wyjściu też chcesz wielkości skalarnych, nie binarnych...

Musisz:
-skwantyzować wejście: przykładowo zrobić 10 neuronów wejściowych dla 10 różnych zakresów Y i odpowiedni ustawiać na 1, reszta na zero (w uproszczeniu)
-skwantyzować wyjście: zrobić n neuronów wyjściowych dla siły(to samo, kwantyzacja) i wybierać odpowiedni neuron wyjściowy (np o największej wartości); to samo dla kąta (neurony wyjściowe dla siły i dla kąta mogą być w tej samej sieci, oczywiście w tej samej warstwie, tylko to nie mogą być te same neurony, ale to oczywiste).

Reasumując, podam przykład:
- na wejściu masz 20, więc zapalisz neuron wejściowy nr 5 (na 15 mozliwych)
- na wyjściu szukasz neuronu najbardziej pobudzonego dla kąta i dla siły...
- musisz mieć sporo danych (im więcej neuronów wejściowych i wyjściowych, tym prawdopodobnie więcej danych, ale za to zakres wyjścia "węższy").
No, chyba że plotę głupoty...
Acha i był już podobny temat na forum, poszukaj, tam było dłuższa na ten temat dyskusja.
Pozdrawiam

Offline revo

  • Użytkownik

# Styczeń 15, 2009, 11:57:31
Mniejwięcej taki problem został opisany w Perełkach Programownia Gier, tom 2, rozdział 3.14. Jeżeli uda Ci się go zobaczyć to może coś pomoże ;)

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 12:06:43
Kombinacje straszeczne. Nie prościej po prostu rozwiązać sobie zwykłe równanie kwadratowe? :)

Offline grrr

  • Użytkownik

# Styczeń 15, 2009, 12:46:39
Kombinacje straszeczne. Nie prościej po prostu rozwiązać sobie zwykłe równanie kwadratowe? :)
Za to znacznie mniejsze walory edukacyjne...

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 13:17:31
Kombinacje straszeczne. Nie prościej po prostu rozwiązać sobie zwykłe równanie kwadratowe? :)
Za to znacznie mniejsze walory edukacyjne...
Tylko że jakie walory edukacyjne ma nauka czegoś, co i tak nie działa? ;)

Offline grrr

  • Użytkownik

# Styczeń 15, 2009, 13:53:52
Kombinacje straszeczne. Nie prościej po prostu rozwiązać sobie zwykłe równanie kwadratowe? :)
Za to znacznie mniejsze walory edukacyjne...
Tylko że jakie walory edukacyjne ma nauka czegoś, co i tak nie działa? ;)
Eeeeetam, czasem SN działają (choć tutaj rzeczywiście, nie są dobrym rozwiązaniem)  Ale uwaga słuszna ;)
K++

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 14:23:00
Cytuj
Eeeeetam, czasem SN działają (choć tutaj rzeczywiście, nie są dobrym rozwiązaniem)  Ale uwaga słuszna ;)
Z doświadczenia: nie jestem w stanie przypomnieć sobie żadnego problemu, który sieci neuronowe rozwiązywały by lepiej niż dobra i prosta heurystyka. :)

Offline grrr

  • Użytkownik

# Styczeń 15, 2009, 16:09:08
Prosty przykład: jacy klienci rezygnują z naszego konta, a jacy do nas przychodzą (wsteczna propagacja reguł z sieci) - ładnie można znaleźć grupy klientów jakim coś nie pasuje (nie każdy może być wkurzony na wysykość opłat, może być wkurzony na to, że na Podlasiu zamykane są placówki, albo i na jedno i na drugie) i reakcja na to... A żeby było ciekawiej, to podstawowe sieci to jeden algorytm, trochę wiedzy co i jak się tym robi, a można całkiem niezłe poszaleć...

Jeśli znamy reguły rządzące problemem, używamy heurystyki. Jesli nie, to mamy problem, a najlepszy sposób jego rozwiązania to SN. Nie zawsze mamy pod ręką równanie kwadratowe...

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 16:36:39
Cytuj
Prosty przykład: jacy klienci rezygnują z naszego konta, a jacy do nas przychodzą (wsteczna propagacja reguł z sieci) - ładnie można znaleźć grupy klientów jakim coś nie pasuje (nie każdy może być wkurzony na wysykość opłat, może być wkurzony na to, że na Podlasiu zamykane są placówki, albo i na jedno i na drugie) i reakcja na to...
To jest zwykły problem optymalizacyjny, który ma niewiele wspólnego z sieciami neuronowymi (pomijając te w głowie dyrektora banku). Wystarczy stworzyć sensowny model problemu i sprowadzić go do jakiegoś innego znanego problemu (albo pobawić się w rozwiązanie go samemu). Jeśli nawet wyjdzie, że trafiliśmy na problem komiwojażera, czy inny dziwoląg, to jeśli już z pomocą mogą przyjść algorytmy genetyczne, nie sieci.

Cytuj
A żeby było ciekawiej, to podstawowe sieci to jeden algorytm, trochę wiedzy co i jak się tym robi, a można całkiem niezłe poszaleć...
Wiadomo. Problem w tym, że nie mamy pojęcia czego te sieci się właściwie nauczyły, jak dokładnie działają (ktoś chętny na analizę zasady działania sieci wielowarstwowej?), a co gorsza, raczej nie udowodnimy analitycznie poprawności działania wygenerowanej sieci.

Cytuj
Jeśli znamy reguły rządzące problemem, używamy heurystyki. Jesli nie, to mamy problem, a najlepszy sposób jego rozwiązania to SN. Nie zawsze mamy pod ręką równanie kwadratowe...
Jeśli nie znamy, to przeprowadzamy szereg eksperymentów (albo bierzemy dane, którymi nakarmiłbyś sieć), tworzymy model analityczny problemu, a potem problem rozwiązujemy. Wtedy dopiero mamy jako taką gwarancję, że będzie to działać dla różnych danych wejściowych, o ile nie pominęliśmy czegoś w modelu albo gdzieś się nie pomyliliśmy.


Proponuję inny przykład zadania. Wejście: rytm serca, częstotliwość oddechów i cokolwiek jeszcze da się zmierzyć automatycznie u pacjenta oraz sygnały usypiania i budzenia. Wyjście: skład mieszanki powietrza i środków, które trzymają w uśpieniu, ale go przy życiu podczas operacji. Kto jest na tyle szalony, chciałby żeby takim procesem podczas jego operacji sterowała sieć neuronowa, a nie model matematyczny opracowany z ekspertami anestezjologii - ręka w górę. ;)

Offline grrr

  • Użytkownik

# Styczeń 15, 2009, 17:33:00
To jest zwykły problem optymalizacyjny, który ma niewiele wspólnego z sieciami neuronowymi (pomijając te w głowie dyrektora banku). Wystarczy stworzyć sensowny model problemu i sprowadzić go do jakiegoś innego znanego problemu (albo pobawić się w rozwiązanie go samemu). Jeśli nawet wyjdzie, że trafiliśmy na problem komiwojażera, czy inny dziwoląg, to jeśli już z pomocą mogą przyjść algorytmy genetyczne, nie sieci.
Trochę się rozpędziłeś... Algorytmy genetyczne, to raczej znalezienie wektor danych wejściowych, który (na przykład) da nam najmniejszą wartość pewnej ZNANEJ NAM funkcji analitycznej. Sieci neuronowe robią coś odwrotnego: znajdują funkcje LOGICZNE (dla każdego wektora wyjściowego). Czyli mamy (usuwając wagi neuronów słabo pobudzonych) Out1=(In0||(In3&&!In17)). Dodatkowo jest mocno odporna na zaburzone dane, co nie jest takie proste w implementacji w komiwojażerze... Zresztą proste rozpoznawanie literek, które jest w każde książce nie jest takie łatwe do rozwiązania na zasadzie "sprowadzić go do jakiegoś innego znanego problemu".
Cytuj
Problem w tym, że nie mamy pojęcia czego te sieci się właściwie nauczyły
Czemu nie? A przykładowo wsteczna propagacja reguł?
Cytuj
jak dokładnie działają (ktoś chętny na analizę zasady działania sieci wielowarstwowej?)
Czy to jakieś strasznie trudne? Ja się przy tym relaksuję :)
Cytuj
a co gorsza, raczej nie udowodnimy analitycznie poprawności działania wygenerowanej sieci.
No nie... Ale możemy sprawdzić, czy sieć się nauczyła danych wejściowych. Zresztą ciężko mówić o "poprawności" w sieciach, bo zwykle sporo tam interpolacji. Ale możemy obserwować błedy na wyjściu w czasie uczenia sieci wsteczną propagacją błędów. Coś jak "wygląda dobrze, to znaczy że działa dobrze".
Cytuj
Jeśli nie znamy, to przeprowadzamy szereg eksperymentów (albo bierzemy dane, którymi nakarmiłbyś sieć), tworzymy model analityczny problemu, a potem problem rozwiązujemy.
Oczywiście, jeśli jesteśmy na genialni :)
Cytuj
(...)ręka w górę.
Ciekawi mnie zbieranie danych wejściowych... Poddusznie pacjentów i patrzenie co z tego wyniknie?

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 19:20:39
Cytuj
Algorytmy genetyczne, to raczej znalezienie wektor danych wejściowych, który (na przykład) da nam najmniejszą wartość pewnej ZNANEJ NAM funkcji analitycznej.
Czy czujesz się funkcją analityczną? Nie? A jakoś "algorytm genetyczny" Ciebie znalazł. ;)


A tak serio, algorytmy genetyczne możemy stosować dla każdego problemu, w którym:
- potrafimy wydzielić zbiór danych wejściowych,
- potrafimy oceniać wyniki produkowane przez ten zbiór (wystarczy porównanie które lepsze, które gorsze),
- potrafimy przeprowadzić operację krzyżowania danych wejściowych (opcjonalnie - jeżeli nie potrafimy, to możemy zawsze jeszcze zrobić błądzenie losowe),
- potrafimy przeprowadzić mutacje danych wejściowych,

Sam problem nie musi być żadną funkcją analityczną i bez problemu można zastosować algorytmy genetyczne np. do poszukiwania rozwiązania problemu komiwojażera. :)

Cytuj
Zresztą proste rozpoznawanie literek, które jest w każde książce nie jest takie łatwe do rozwiązania na zasadzie "sprowadzić go do jakiegoś innego znanego problemu".
Nie jest? Pierwszy strzał: metoda najmniejszych kwadratów. ;) Zresztą, większość znanych mi algorytmów rozpoznawania obrazów bazuje na heurystykach próbujących wyciągnąć z obrazu jakąś topologię, czy reprezentację wektorową, dzieki czemu jest to bardziej odporne na zabużenia i zniekształcenia niż proste zastosowanie sieci neuronowych (np. jak nauczyć sieć rozpoznawać litery obrócone pod dowolnym kątem, zwłaszcza jesli chcemy rozróżniac znaki 2, 5, Z, N i S). :)

Cytuj
Czemu nie? A przykładowo wsteczna propagacja reguł?
Mógłbyś wyjasnić? Jak dla mnie działanie sieci wielowarstwowych jest typowym działaniem "black box" - mamy listę wag i połączeń, ale nic a nic nam to nie mówi o samym algorytmie wnioskowania.

Cytuj
No nie... Ale możemy sprawdzić, czy sieć się nauczyła danych wejściowych.
Takie tylko sprawdzenie to podstawowy błąd, który nie gwarantuje żadnej sensowności działania sieci (wystarczająco rozbudowana sieć zawsze jest w stanie się nauczyć danych perfekt, ale nie będzie umiała tego uogólnić). W przypadku sieci dane przykładowe musimy zawsze podzielić na grupę uczącą i testową. Tej pierwszej używamy do uczenia sieci, a na tej drugiej testujemy, czy to co otrzymaliśmy ma jakiś większy sens (ale nie wolno nam uczyć sieci danymi z grupy testowej - ma to sama zgadnąć). Inaczej możemy skończyć jak bodajże Amerykanie budujący system rozpoznawania czołgów na obrazach satelitarnych - system nauczył sie rozpoznawać perfekcyjnie, ale jak przyszło co do czego to nie umiał praktycznie nic. Koniec końców wyszło, że wszystkie zdjęcia testowe z czołgami były robione nocą (albo dniem, nie pamiętam) i sieć zamiast czołgów się nauczyła rozpoznawać dzień i noc (co szczególnym osiągnięciem nie jest). :)

Przy okazji wychodzi jeszcze jedna wada sieci: za dobrze nauczona sieć traci możliwość uogólniania - będzie odpowiadała dobrze tylko na przypadki użyte do uczenia, ale na przypadki których sieć nie widziała na oczy będzie zwracała wyniki bez sensu. Zresztą, sieci same z siebie mają i tak kiepskie możliwości uogólniania - jeśli nauczymy sieć rozpoznawać literkę A, oraz tą samą literkę przesuniętą o 10 pikseli, to raczej marne szanse, że sieć rozpozna literę A przesuniętą o 5 pikseli (z obrotami będzie jeszcze gorzej). :)

Cytuj
Oczywiście, jeśli jesteśmy na genialni :)
Dlatego modele często opracowuje się z udziałem ekspertów z danej dziedziny... :)

Cytuj
Ciekawi mnie zbieranie danych wejściowych... Poddusznie pacjentów i patrzenie co z tego wyniknie?
...między innymi właśnie dlatego, że często przeprowadzenie eksperymentów nie bardzo wchodzi w grę. :)

Offline Marcin Baszcz...

  • Użytkownik

# Styczeń 15, 2009, 19:47:04
Krzysiek K: gdybym chcial to uzylbym funkcji i wyliczyl te dane bez problemu - ale nie w tym rzecz... postawiono przedemna takie zadanie a nie inne...
Pozatym zapewniam Cie ze moj przyklad ze strzalem moge tak skomplikowac ze zadnym rownaniem nie osiagniesz lepszych wartosci niz ktos inny siecia neuronowa. Dodajmy wiatr i pare innych zjawisk a problem stanie sie cholernie trudnym do rozwiazania - czy nawet niemozliwym (metodami klasycznymi).

Mam do dyspozycji perelki programowania gier ktore traktuja o takim problemie (zreszta te ksiazki chyba sa w google books) jednakze w czysty teoretyczny sposob (co dajemy na wejscie a co nie itp). Konkrety sa na plycie do ktorej nie mam dostepu... Przedstawiona metoda w tej ksiazce korzysta tez z innej metody uczenia.

Mi niezalezy na sugestiach co dac na wejscie - wyjscie, ile powinno byc epok (po semestrze metod sztucznych inteligencji nabralem nieco wprawy). Korzystajac z gotowych rozwiazan (np Matlab) latwo ustawic funkcje wyjscia jako linowa - jeden parametr i po sprawie.
Jak natomist tego dokonac implementujac algorytm wstecznej propagacji bledow na wlasna reke?

Na stronie mamy opisamy sam algorytm:
http://home.agh.edu.pl/~vlsi/AI/backp_t/backprop.html
We wzorach jest zastosowna jedna blizej nieokreslona funkcja aktywacji u mnie moze to byc chocby tangens hiperboliczny... W takim ukladzie jest wszystko w porzadku (ale nie mam danych wyjsciowych w takim zakresie jakim bym chcial -1 - 1 != 30 ;) ).
Probowalem zrobic cos takiego:
-w warstwach ukrytych funkcja aktywacji: tangens hiperboliczny (tanh)
-w warstwie wyjsciowej funkcja liniowa (czyli przepisanie tego co dostalismy)
-pochodna z funkcji liniowej: 0
-pochodna z funkcji tanh: 1-(tanh(value)*tanh(value));
Teraz jak zerkniecie na zdjecia, ktore znajduja sie na podlinkowanej stronie mozecie sobie wyobrazic jak probowalem sobie poradzic z obecna niedogodnoscia - niestety nieskutecznie... wprowadzenie czegos na warstwie ostatniej niszczy dzialanie algorytmu uczacego.


PS
Wiem ze algorytmy genetyczne, systemy eksperckie maja rowniez ogromne mozliwosci - nie mialem jednak z nimi doczynienia (niezainteresowaly mnie jeszcze same)  a na uczelni dopiero bede je miec... Problem musze koniecznie rozwiazac ta metoda (szkoda bylo by sie poddac).
PS2
Pomimo waszej dyskusji sieci wydaja sie najlepszym rozwiazaniem bo so powszechnie stosowane przy aproksymacji funkcji...
« Ostatnia zmiana: Styczeń 15, 2009, 19:53:12 wysłana przez Marcin Baszczewski »

Offline Krzysiek K.

  • Redaktor
    • DevKK.net

# Styczeń 15, 2009, 19:53:41
Cytuj
-pochodna z funkcji liniowej: 0
Tylko w przypadku gdy dana funkcja liniowa jest funkcją stałą - wtedy rzeczywiście nic sieci nie idzie nauczyć, skoro ostatnia warstwa zupełnie ignoruje warstwy poprzednie. :)

Offline Marcin Baszcz...

  • Użytkownik

# Styczeń 15, 2009, 21:31:03
Z tego co pamietam sprawdzalem tez i wartosc 1 dla tej pochodnej by te dane "mialy lad"...