Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Sieć neuronowa-algorytm obsługujący[?]

bipolunipol 28 Gru 2011 23:23 4623 18
  • #1 28 Gru 2011 23:23
    bipolunipol
    Poziom 19  

    Witam

    Piszę algorytm sieci neuronowej:
    2 neurony wejściowe
    7 neuronów w warstwie ukrytej
    1 neuron wyjściowy

    sieć wygląda tak:

    Sieć neuronowa-algorytm obsługujący[?]

    jest to sieć MLP,

    i symulacja nauczonej sieci wygląda tak:

    1 neuron przetwarzanie:
    a = x1 * w1 - sygnał z 1 wagi
    b = x2* w2 -sygnał z 2 wagi
    c = a+b - suma obu sygnałów
    swy1 = c / pierwiastek (1+c^2) -i mam sygnał przetw. na wy 1 neuronu (funkcja sigmoidy)

    i tak postępuje dla kolejnych neuronów - ostatecznie mam 5 zmiennych z sygnałem:
    swy1 -od 1 neuronu; swy2 -od drugiego n.; swy3 ; swy4; swy5

    potem robię sumę sygnałów swyx przemnożonych przez wagi: w11 do w15:

    suma = (swy1*w11) + (swy2*w12) + (swy3*w13) + (swy4*w14) + (swy5*w15)

    następnie przepuszczam przez funkcję i otrzymuję y:
    y = suma / pierwiastek (1+suma^2)


    Czy powyższy pseudokod jest poprawny?

    Jak w takim razie zapisać algorytm uczący sieć? Czytałem, że dla ostatniego neuronu do korekcji wag stosuje się regułę delty, natomiast dla warstw ukrytych - wstecznej propagacji błędów. Jak to wygląda algorytmistycznie - w pseudokodzie?

    Dziękuję za odpowiedzi...

    0 18
  • Pomocny post
    #2 29 Gru 2011 02:28
    skynet_2
    Poziom 26  

    "algorytmistycznie" - nie ma takiego słowa

    Bipolarna funkcja sigmoidalna ma postać: $$f(x) = \tanh(\beta * x),\ dla\ \beta = 1$$, β to ostrość funkcji aktywacji, zazwyczaj β >= 1
    natomiast twoja: $$f(x) = \frac{x}{\sqrt(1+x^2)}$$, wyniki funkcji troche się różnią, może to powodować dziwne problemy przy uczeniu sieci.

    Pseudokod który podałeś jest poprawny, ale mogłeś go opisać trochę prościej, tj. dla jednego neuronu $$y = f(\sum_{i=0}^{n}x_{i}w_{i})$$ gdzie f jest funkcją aktywacji, x wejściem, w wagą, natomiast n to liczna wejść.

    Neurony sigmoidalne w procesie uczenia wymagają pierwszej pochodnej funkcji aktywacji czyli dla bipolarnej funkcji sigmoidalnej$$f^{,}(x)= \beta (1 - f(x)^2)$$, obliczanie nowej wagi:$$w_{i} = w_{i} + n*(d - y) * f^{,}(s)*x_{i}$$, gdzie:
    d to oczekiwana odpowiedź
    y to obliczona odpowiedź neuronu
    s obliczona suma wszystkich wejść i wag
    n współczynnik uczenia mniejszy niż 0.9

    Algorytm wstecznej propagacji błędów dla jednego neuronu na wyjściu, dla twojej sieci:
    $$Q_{warstwa,neuron}$$
    - oblicz błąd na wyjściu ostatniego neuronu, $$Q_{20}$$, 2 - warstwa, 0 - numer neuronu
    - pomnóż ten błąd z osobna przez każdą wagę w ostatnim neuronie, otrzymane wartości to błędy na neuronach w warstwie poprzedniej, czyli jak masz 5 neuronów to otrzymasz:
    $$Q_{10} = Q_{20} * w_{20}$$
    $$Q_{11} = Q_{20} * w_{21}$$
    $$Q_{12} = Q_{20} * w_{22}$$
    $$Q_{13} = Q_{20} * w_{23}$$
    $$Q_{14} = Q_{20} * w_{24}$$
    - mając błędy na każdym neuronie popraw wagi, do poprawienia wag potrzebujesz d, ale przecież Q = d - y

    W przypadku gdy masz 3 warstwy, lub na ostatniej masz 2 neurony wyjściowe, to musisz wyliczyć błędy na wyjściach neuronów na warstwie poprzedniej dla każdego neuronu na aktualnej warstwie, tutaj masz pokazane o co chodzi: http://galaxy.agh.edu.pl/~vlsi/AI/backp_t/backprop.html

    Jeżeli używasz C++ to tutaj masz funkcje aktywacji i ich pochodne tych funkcji: https://www.elektroda.pl/rtvforum/viewtopic.php?p=10269197#10269197

    0
  • #3 29 Gru 2011 13:53
    bipolunipol
    Poziom 19  

    Bardzo dziękuję za odp.

    Czyli:

    A. PROCES NORMALNEGO DZIAŁANIA NAUCZONEJ SIECI:

    1 neuron:

    s1 = (x1*w1) + (x2*w2) ->suma przemn.przez wagi sygn.
    swy1 = tanh * s1 ->wynik (B założyłem =1)

    2 neuron:

    s2 = (x1*w3) + (x2*w4)
    swy2 = tanh * s2

    3 neuron:

    s3 = (x1*w5) + (x2*w6)
    swy3 = tanh * s3

    4 neuron:

    swy4 = tanh (x1*w5 + x2*w6)

    5 neuron

    swy5 = tanh (x1*w5 + x2*w6)


    Teraz robię sumę swyx, mnożę przez wagi i po przepuszczeniu przez funkcję otrzymuje y:

    y = (swy1*w11+swy2*w12+swy3*w13+swy4*w14+swy5*w15) tanh


    i proces powtarzam (sieć nauczona) w pętli np. Do...Loop



    B.PROCES NAUKI SIECI

    załóżmy, że z sieci zamierzam zrobić bramkę AND, czyli ciągiem uczącym
    są zależności:
    ___________________
    x1 x2 y

    1 1 1
    0 0 0
    1 0 0
    0 1 0

    ___________________

    ALGORYTM NAUKI SIECI dla wiersza 1 ciągu uczącego:

    -najpierw obliczam wynik dla obecnych wartości wag:

    1 neuron:

    s1 = (x1*w1) + (x2*w2) ->suma przemn.przez wagi sygn.
    swy1 = tanh * s1 ->wynik (B założyłem =1)

    2 neuron:

    s2 = (x1*w3) + (x2*w4)
    swy2 = tanh * s2

    3 neuron:

    s3 = (x1*w5) + (x2*w6)
    swy3 = tanh * s3

    4 neuron:

    swy4 = tanh (x1*w5 + x2*w6)

    5 neuron

    swy5 = tanh (x1*w5 + x2*w6)

    y = (swy1*w11+swy2*w12+swy3*w13+swy4*w14+swy5*w15) tanh

    i w tym momencie mogę obliczyć nowe wartości wag ostatniego neuronu: w11do w15 (1 wiersz ciągu, wynik prawdziwy z tabeli -1 ; B=1):

    w11 = w11 + 0,4*(1-y)* [1*(1-(tanh*(1*S))^2)]*swy1
    w12 = w12 + 0,4*(1-y)* [1*(1-(tanh*(1*S))^2)]*swy2
    w13 = w13 + 0,4*(1-y)* [1*(1-(tanh*(1*S))^2)]*swy3
    w14 = w14 + 0,4*(1-y)* [1*(1-(tanh*(1*S))^2)]*swy4
    w15 = w15 + 0,4*(1-y)* [1*(1-(tanh*(1*S))^2)]*swy5

    WSTECZNA PROPAGACJA BŁĘDÓW:

    -błąd na wyjściu = d-y
    czyli dla 1 wiersza w ciągu uczącym - d=1

    ostatecznie, przyjmując Q dla 1 wiersza ciągu:
    Q=błąd = (1-y)

    Następnie:

    -mnożę przez każdą wagę obliczoną deltę
    Q1 = w11 *(1-y)
    Q2 = w12 *(1-y)
    Q3 = w13 *(1-y)
    Q4 = w14 *(1-y)
    Q5 = w15 *(1-y)

    - i poprawiam wagi:

    prawdą jest, że:
    ______
    Q=d-y
    d=Q+y

    -------
    Więc:


    w1 = w1 + 0,4*(Q1+y-y)* [1*(1-(tanh*(1*S))^2)]*x1
    w2 = w2 + 0,4*Q2* [1*(1-(tanh*(1*S))^2)]*x2
    itd.....


    i powtarzam ten proces x razy w pętli dla różnych losowych wierszy ciągu uczącego, aż odpowiedź będzie prawidłowa?


    --Czy obliczenia są poprawne, czy namieszałem gdzieś?

    Pyt.0 - czy: s obliczona suma wszystkich wejść i wag to jest suma sygnałów na wszelkich wejściach + suma wartości wag neuronu?
    Pyt.1 - czy należy i jak przeprowadzać proces normalizacji?
    Pyt.2 - czy sieć będzie miała podobne możliwości, jak zamiast MLP, zastosuje wszystkie neurony liniowe, bez żadnych funkcji, przez które przechodzą dane w czasie agregacji?

    Dodano po 28 [minuty]:


    ---------------------------------
    Jeżeli chodzi o różnice między 2 funkcjami.

    Sieć neuronowa-algorytm obsługujący[?]

    Są jak widać niewielkie - czy nie można zastosować tej mojej? Bo aby wyliczyć tangens hiperboliczny w mikroprocesorze, potrzeba dużo pamięci - więcej niż w przypadku wykonania działania do funkcji podanej przeze mnie, a muszę w tym wypadku jak najmocniej ograniczać zużycie pamięci...

    0
  • Pomocny post
    #4 29 Gru 2011 14:25
    skynet_2
    Poziom 26  

    Twój ciąg uczący to nie jest bramka AND, powinno być:

    Kod: text
    Zaloguj się, aby zobaczyć kod

    btw. to funkcję AND powinien zrealizować jeden neuron :)

    ad. "ALGORYTM NAUKI SIECI dla wiersza 1 ciągu uczącego:"
    Korekcji wag "w11 do w15" nie robisz na początku, gdyż obliczając błędy dla warstwy poprzedniej nie miałbyś oryginalnych wag.

    ad. "WSTECZNA PROPAGACJA BŁĘDÓW:"
    Chyba wygląda w porządku.
    Postaraj się nie mieszać danych z wzorami, bo bardzo łatwo się gdzieś walnąć.

    pyt.0 nie, s jest to suma wszystkich wejść uprzednio pomnożonych przez odpowiednie wagi.
    pyt.1 chodzi o to aby sygnały wejściowe nie były większe od 1 i mniejsze od -1 lub 0 w zależności od sieci, przy czym ja nie miałem z tym problemów.
    pyt.2 tylko tu powstaje problem jak to coś uczyć, gdyż algorytm wstecznej propagacji błędów dotyczy głównie neuronów sigmoidalnych.

    Co do funkcji, kombinuj ale musisz sprawdzić czy wyliczona pochodna się zgadza, jeżeli będzie inna to neuron może mieć tendencje do krążenia w pobliżu rozwiązania.

    A tak ogólnie to postaraj się to robić wolniej, mi zajęło ok miesiąca zrozumienie wzorów jak i sposobu ich wyprowadzenia, najpierw spróbuj zasymulować perceptron, później neuron sigmoidalny i na koniec wsteczną propagację błędów.

    Możesz mierzyć błąd dla całej epoki np. $$Q_{epoki}=\frac{\sum^{n}_{i = 0} (Q_{i})^{2}}{n}$$, gdzie i to numer aktualnego ciągu wektora uczącego, n ilość tych ciągów n długość ciągu uczącego, Q błąd na wyjściu.
    Q całej epoki podczas uczenia powinno się zmniejszać.

    _edit:poprawiłem wzór na błąd epoki, Qi powinno być do 2 potęgi
    _edit:i to numer aktualnego wektora uczącego, nie ciągu, wektor to jednorazowa porcja danych, s to długość ciągu, nie ilość ciągów

    0
  • #5 29 Gru 2011 14:53
    bipolunipol
    Poziom 19  

    skynet_2 napisał:
    Twój ciąg uczący to nie jest bramka AND, powinno być:

    oczywiście że to nie była bramka AND - tabelę poprawiłem 2 minuty po zapisaniu wiadomości - zamiast zer przy 2 bitach nie równych 1 były logiczne 1 :D

    skynet_2 napisał:
    btw. to funkcję AND powinien zrealizować jeden neuron

    to przykład służący tylko do nauki obsługi sieci z warstwą ukrytą



    Dzisiaj przetestuję działanie sieci na podstawie powyższych wzorów i zobaczę czy będzie prawidłowo się uczyła i zachowywała w czasie egzaminów...

    0
  • #6 30 Gru 2011 02:53
    bipolunipol
    Poziom 19  

    -jakie najlepiej ustalić początkowe wartości wag i z jakiego zakresu?

    0
  • Pomocny post
    #7 30 Gru 2011 04:39
    skynet_2
    Poziom 26  

    Ponieważ używasz funkcji bipolarnych, wartości początkowe ustaw losowo w przedziale <-0.1, 0.1>.

    0
  • #8 30 Gru 2011 23:23
    bipolunipol
    Poziom 19  

    Mam jeszcze pytanie: czy jest może jakiś dobry program, za pomocą którego taką sieć mógłbym symulować (oraz inne zupełnie algorytmy)- jakieś uniwersalne narzędzie (najlepiej po polsku)? Matlab, Scilab, Octave raczej odpadają - trzeba mocno wgłębiać się w sposób obsługi programu, i jego polecenia / strukturę języka programowania danego programu itp. Może są jakieś prostsze narzędzia do testowania algorytmów i innych obliczeń [typu Matlab, ale prostsze]? Próbowałem dla testów pisać w Qbasic-u ale jest starym programem pod Dos i praca z nim w środowisku Windows jest uciążliwa...

    0
  • #9 31 Gru 2011 19:38
    bipolunipol
    Poziom 19  

    skynet_2 napisał:
    wartości początkowe ustaw losowo w przedziale <-0.1, 0.1>

    ale chyba bez 0 - tj
    <-0.1 , 0.1> / 0

    bo gdy ustawię 0 to sygnały przechodzące przez 0 wagi zostaną zlikwidowane?

    0
  • #11 31 Gru 2011 21:55
    bipolunipol
    Poziom 19  

    jaki praktycznie współczynnik uczenia się stosuje, żeby sieć nie uczyła się zbyt wolno ale też, żeby nie ucząc się za szybko z dużym współczynnikiem, nie "miotała się"? 0,4 - wystarczy?

    Dodano po 12 [minuty]:

    czyli najpierw wykonuję korektę wag dla warstwy ukrytej, tj. w1-w10 [alg. wstecznej propagacji], a dopiero potem obliczam wagi na pods. błędu wyjściowego dla neuronu ostatniego - tj. wagi w11-w15?

    0
  • #12 31 Gru 2011 23:04
    skynet_2
    Poziom 26  

    Współczynnik uczenia dopiera się w zależności od potrzeb, zazwyczaj w czasie uczenia się go powoli zmniejsza, najpierw obliczasz błędy na warstwach ukrytych, a później wykonujesz korektę wag dla całej sieci.

    0
  • #13 06 Sty 2012 20:28
    bipolunipol
    Poziom 19  

    Napisałem taki program w VB 6.0 Czy jest poprawny? Zasada działania zgodna ze wcześniejszymi informacjami, rysunkami (tj. 2n. we, 5n. war. ukrytej i 1 n. wy)

    X1-zmienna wejściowa
    X2 - zmienna wejściowa
    d - oczekiwany wynik
    y - wyjście (przypisane do zmiennej Text3 - pola wynikowego)
    q - błąd
    swy (x) - wyjścia neuronów warstwy ukrytej
    w(x) - waga x


    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Dodano po 7 [minuty]:

    i działająca testowa aplikacja. Czy dobrze sieć się zachowuje ?
    (aplikacja w załączniku)

    0
  • #14 07 Sty 2012 01:44
    skynet_2
    Poziom 26  

    Niestety nie znam Basica, co do programu to powinieneś liczyć błąd na całą epokę, jeżeli błąd będzie malał to wszystko jest ok, natomiast wektor uczący wektory uczące[czyli dane wejściowe i poprawne wyjście] wczytywać np. z listy.

    Jeżeli przyjąłeś n = 0,15 to potrzebujesz 50<>4k epok aż neuron będzie poprawnie odpowiadał na zadany sygnał, wpisując ręczenie zajmie to bardzo dużo czasu.

    0
  • #15 07 Sty 2012 17:32
    bipolunipol
    Poziom 19  

    Załóżmy że ciągów uczących jest 20.

    Czy błąd dla całej epoki liczy się następująco?:

    Zmienne:

    LC - licznik ciągu uczącego, Q-błąd na wyjściu; Qepoki - błąd całej epoki

    ~~~~~~~~~~~~~~~~~~~~~~

    Do

    //ALGORYTMY SSN - DZIAŁANIA I NAUKI...//
    Część algorytmu obliczająca QEPOKI:

    1. Zwiększam licznik ciągu uczącego [nazwę go: LC]
    LC = LC + 1
    2. Mnożę błąd na wy[Q] przez aktualny nr ciągu uczącego[LC], dodaję wynik do zmiennej [Qepoki] po czym mnożę całą tą zmienną przez 20 czyli przez całkowitą liczbę tych ciągów.

    Qepoki = (Qepoki + Q * LC) / 20

    Loop


    i błąd powinien maleć.. Czy przedstawiony algorytm jest poprawny? Jaką wartość błędu można przyjąć, która wskazuje, że SSN została już max. nauczona?



    Dodano po 5 [minuty]:

    skynet_2 napisał:
    Jeżeli przyjąłeś n = 0,15 to potrzebujesz 50<>4k epok aż neuron będzie poprawnie odpowiadał na zadany sygnał, wpisując ręczenie zajmie to bardzo dużo czasu.


    W programie jest n = 0.4. Jak obliczyć ile cykli uczących mniej więcej potrzeba dla takiego współczynnika?

    0
  • #16 08 Sty 2012 04:19
    skynet_2
    Poziom 26  

    bipolunipol napisał:
    Mnożę błąd na wy[Q] przez aktualny nr ciągu uczącego[LC]
    skąd to mnożenie?
    bipolunipol napisał:
    po czym mnożę całą tą zmienną przez 20 czyli przez całkowitą liczbę tych ciągów.
    chyba miałeś na myśli "dzielę".

    Pomyliłem się w nazewnictwie i tu przepraszam:
    wektor uczący - to jednorazowa porcja danych czyli dane wejściowe i oczekiwane wyjście
    ciąg uczący - składa się z wektorów uczących.
    poprawiłem posty: 10318650 i 10360141

    Powinno to wyglądać tak:
    $$Q_{epoki}=\frac{\sum^{n}_{i = 0} (Q_{i})^{2}}{n}$$
    czyli:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    0
  • #17 20 Lut 2012 23:14
    bipolunipol
    Poziom 19  

    Mam jeszcze pytanie:

    Na wejście sieci podaję 5 pomiarów. Ulegają procesowi normalizacji, albowiem ich zakres wynosi 0-1023, czyli aby zawierały się w zakresie 0-1, muszę je podzielić przez 1023; dla wartości np. 265 wartość wejściowa po normalizacji będzie wynosiła 256/1023=~0.25

    Wyjściem będą 2 neurony oznaczone jako - Prawda/ Nieprawda.

    W zależności od wartości zmiennych wejściowych - na wyjściu otrzymuję Prawdę / Fałsz (Jeżeli liczba WY w neuronie Prawda jest większa niż w neuronie Fałsz - oznacza to wynik całościowy: Prawda ; podobnie jeżeli jest większa liczba w neuronie Fałsz niż w Prawda - wynikiem interpretowanym przez program jest Fałsz).

    Sieć neuronowa-algorytm obsługujący[?]

    *Zastanawia mnie, ile neuronów musi znaleźć się w warstwie ukrytej, aby sieć nie była zbyt "tępa" lub nie uczyła się rozwiązań na pamięć? Czy dobrym rozwiązaniem jest 6 neuronów ukrytych? Czy może dać mniej- np. 4?

    Każdy ciąg uczący będzie zawierał 10 wierszy. Owy ciąg uczący będzie co jakiś czas modyfikowany, bowiem będę oczekiwał innych odpowiedzi dla innych wartości wejściowych. Ciąg uczący większy być nie może, ze względów czasowych.

    Czy w procesie nauki dobrym rozwiązaniem jest losowanie za każdym razem danego wiersza z ciągu uczącego? Takich losowań danego wiersza z ciągu ze względów czasowych planuję około ~~ 1000. Czy nie jest to za mała wartość?
    Czy to ma szansę dobrze działać?

    Przykład pewnego ciągu uczącego: [5 WE i oczekiwana odp. na WY]
    Sieć neuronowa-algorytm obsługujący[?]

    Dodano po 1 [godziny] 43 [minuty]:


    Dodano po 20 [minuty]:

    ---------------
    Czy w procesie nauki, każdą wagę mam pojedynczo przeliczyć i uruchomić sieć w celu zobaczenia obecnej odpowiedzi, czy wszystkie wagi zmieniam na nowe jednocześnie i dopiero jak zmienię, to uruchamiam sieć, by zobaczyć obecną odpowiedź?

    Dodano po 57 [minuty]:

    ------------------
    Jak będzie wyglądał algorytm wstecznej propagacji błędów dla 2 neuronów na wyjściu?

    0
  • #18 25 Lut 2012 12:35
    bipolunipol
    Poziom 19  

    Gdy mam dwa neurony na wyjściu, obliczam na każdym błąd, następnie mnożę ten błąd przez odpowiednie wagi dotyczące danego neuronu. Potem , aby obliczyć w warstwie ukrytej nowe wagi, to błędy pochodzące z tych 2 ostatnich neuronów po prostu dodaję, tak?

    0
  • #19 12 Lip 2013 14:19
    maktabi
    Poziom 1  

    Witam
    Chciałbym skromnie się zapytać czy udało się koledze bipolunipol rozwiązać problem z dwoma wyjściami. Byłbym wdzięczny za kawałek kodu szczególnie interesuje mnie miejsce aktualizacji wag wejściowych błędem obliczonym na dwóch wyjściach.

    0