wsteczna propagacja błędów - dziwne wyniki dla XOR

0

Witam

Zbudowałem sieć neuronową w C#, jednak mam pewne problemy.

Wszystko wydawało się, że ładnie działa - jednak czasem sieć dawała dziwne rezultaty uczenia.

Postanowiłem więc narysować to na "Form'ie" , wykresy przedstawiają:

  • oś x - kolejne "epoki"
  • oś y - błąd

Każda linia przedstawia błąd dla pojedynczego wektoru uczącego.

W większości przypadków, wyniki wyglądają następująco:

(przy zachowanej kolejności podawania wzorców):
user image

(przy losowej kolejności pokazywania wzorców):
user image

..Jednak sieć za Chiny nie chce się nauczyć funkcji XOR:

user image

Dane dla xor:

  • współczynnik uczenia 0.9 (próbowałem różne)
  • współczynnik dla momentum 0,6 (próbowałem od 0 do 1)
  • neuronów wejściowych: 2
  • neuronów wyjściowych: 1
  • neuronów ukrytych: 2

Liczba epok: od 100 do kilku tysięcy - nie przyniosło rezultatu.

Co robie źle .. czy ktoś patrząc na wykres jest w stanie odpowiedzieć na to pytanie? (wiem, że powinien pokazać kod, jak obliczam itd, ale chyba za dużo by to zajęło).

Będę wdzięczny za jakąkolwiek pomoc.

0

Za mało danych by to stwierdzić!
Jaką masz funkcję aktywacji?
Wszystkie neuronu powinny mieć 3 współczynniki opisujące ich stan wiedzy (2 odpowiadające za wejścia i 1 za offset).
Pewnie zapomniałeś o offsecie.

Inne równoważne podejście zamiast offsetu to dodatkowe wejścia ze stałym sygnałem równym 1.

0

Użyłem biasu o wartości 1 - to samo, błąd sieci RMS po wszystkich wektorach z ciągu wzorca zdaje się dążyć do 0.5 dla XOR .. co dziwne dla innych funkcji (różnych), z różną ilością wejść/wyjść/neuronów - ładnie spada.

Funkcja sigmoidalna, 1/(1+e^-x)

0

Bez kodu to nadal wróżenie z fusów.

0

Jeżeli używasz sieci neuronowej jednowarstwowej, nie możesz nauczyć jej funkcji XOR.

Dowód:
Sieć jednowarstwowa, która "liczyłaby" XOR, miałaby dwa wejścia (bo XOR ma dwa argumenty) i jedno wyjście (XOR daje jeden wynik), w ten sposób:
user image

Naszym zadaniem jest ustawić odpowiednie wagi a oraz b (co jest celem uczenia sieci). Dla każdego działania mamy podane wejścia i wyjście - trzeba tylko znaleźć odpowiednie wagi.

Podstawiając pod wejścia (neurony) x oraz y kolejne wartości [(0,0), (0,1), (1,0), (1,1)] otrzymujemy:
\left {<br> \begin{matrix}<br> 0a+0b=0 \<br> 1a+0b=1 \<br> 0a+1b=1 \<br> 1a+1b=0<br> \end{matrix}

Upraszczając:
\left {<br> \begin{matrix}<br> 0=0 \<br> a=1 \<br> b=1 \<br> a+b=0<br> \end{matrix}

Dochodzimy do sprzeczności:
\left {<br> \begin{matrix}<br> a+b=0 \<br> a=1,\ b=1 \Rightarrow a+b=2<br> \end{matrix}

Dowiedliśmy niemożności nauczenia sieci jednowarstwowej funkcji XOR.
Jak ją nauczyć? Użyj sieci wielowarstwowej.

PS. funkcje OR, AND i podobne mają możliwość odnalezienia wag a oraz b - dlatego błędy tych funkcji schodzą do zera.

0

tak, ale on ma dwie warstwy, napisał "neuronów ukrytych 2".

0

neurony (tutaj, dla prostoty - perceptrony) powinny Ci wyjsc nauczone w ten sposob, lub lustrzany:
user image
i to jest absolutne minimum zeby osiagnac XOR'a
biorac pod uwage ze Twoja siec jest 5neurony/3warstwy nie powinno byc problemu z nauka i klasyfikacja..

moze masz jakis blad przy wylicaniu wag i neurony nie potrafia negatywnie reagowac (por. neuron lewy - reakcja pozytywna, neuron prawy - negatywna)? tzn. wszystkie f.dyskr. wychodza postaci wynik = ( suma > x ) i nie potrafia osiagnac wynik = ( suma < x ) ? ...wagi masz signed prawda?

moze masz blad w organizacji i warstwa pierwsza oraz ostatnia tylko 'formatuja' wejscie (np. warstwa1 rozpoznaje czy pixel bialy/czarny, warstwaN kwantuje wynik do z [0..1] do {0, 1} ? wtedy defacto Twoja siec bylaby jednowarstwowa, patrz post dwa w gore..

btw. osobiscie, sadze ze warto na poczatku zabawy przeskalowac sobie osie sygnalow z 0..1 na -1..1. jakos skala (-1=nie, 1=tak, 0=niewiem) bardziej do mnie przemawia niz (0=nie, 1=tak, 1/2=niewiem) chyba ze mowimy o bayesie :]

0

No i problem rozwiązany - okazało się, że moja implementacja back-propagation poprawiały wagi za wyjątkiem wagi do biasu.
Teraz ładnie działa.

0

zechciałbyś wrzucić kod ?

0

zechciałbyś wrzucić kod ?

http://tinyurl.com/ygg9vn2

Szczegóły na stronie www.hakger.org --> HSynapse

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