Siec neuronowa z dużą ilością wejść

0

Witam,

Mam sieć neuronową w której pierwsza warstwa ma 784 neurony druga ( ukryta 30) i wyjściowa 10;
Wyniki dla warstwy wyjściowej są zawsze takie same dla różnych danych testowych.
Dzieje się tak ponieważ do mojej funkcji aktywacyjnej (sigmoidalnej) jako parametr X wprowadzana jest zawsze bardzo duża wartość (z przedziału 40 - 60). Taka wielka wartość spowodowana jest dużą ilością wejść przez co suma pomnożona przez wagi jest dość spora, dlatego praktycznie każdy wzorzec powoduje taki sam wynik na wyjściu. Tą dużą wartość próbowałem obniżyć biasem dając wartości bias = -50 wówczas wartość jest z przedziału -10 do 10 jednak wydaje mi się że to nie jest dobre podejście.

W czym popełniam błąd?

Na początku myślałem że algorytm wstecznej propagacji po pewnym czasie nauki zamieni niektóre wagi na wartości ujemne co po pewnym czasie obniży takie duże wyniki jednak tak się nie dzieje.

Jeżeli ktoś zna dobry artykuł rozpoznawania liczb z bazy MNIST korzystając z backpropagation bardzo byłbym wdzięczny?
Ponoć algorytm jest łatwy ale potrafi dać w kość

1

Manipulacja biasem to raczej nie najlepszy pomysł - szczególnie, że bias-u jako takiego w ogóle nie powinno się stosować (powinna być sama waga bez biasu - w końcu po co mnożyć za każdym razem wagę przez (stałą) 1.0 jeśli i tak wyjdzie wartość wagi...).
Rozwiązaniem Twojego problemu może być losowanie wag ze znacznie mniejszego zakresu. W każdej warstwie zakres ten powinien być dostosowany do ilości wejść oraz wartości inputów oraz rodzaju funkcji aktywacji.
Zwróć uwagę, że funkcja sigmoidalna przyjmuje wartości bliskie 1 już dla wartości większych od 5.0 a wartości bliskie 0 dla wartości mniejszych od -5.0. Dla X = 5.0 wynik funkcji wynosi 0,9933 (X to oczywiście suma wag przemnożona przez wejścia).
Oznacza to, że pochodna dla tej funkcji dla X > 5 lub X < -5 jest prawie że zerowa (a w niższych warstwach ten efekt jest mocniejszy) a to oznacza, że sieć będzie bardzo źle się uczyć (jeśli w ogóle) -> w końcu nauka polega na odjęciu jakiejś części pochodnej a gdy pochodna jest równa lub bliska 0 to trochę lipa...

Inne rozwiązanie to zmiana funkcji aktywacji np. na sin(x) lub cos(x).

A tak z ciekawości to w czym to implementujesz?

0

Problem rozwiązany wagi losowałem z zakresu od 0-1 a teraz odjąłem od każdej wylosowanej -0.5 tak aby były także wagi ujemne przez co wyjścia z neuronów stały się umiarkowanie, odpowiednie dla funkcji sigmoidalnej. Sieć uczy się idealnie podczas procesu nauki zmieniam współczynnik uczenia. Oczywiście stosując bias nie mnożę go przez wagę bo po co dodatkowe obciążenie dla algorytmu. Przy nauczaniu 10 tys próbek na 50 próbnych cyfr rozpoznał wszystkie, teraz go uczę danymi 60tys zdjęć powielając tą naukę 3 krotnie jednak przy moim kompie muszę czekać na to 15h, zobaczymy co z tego wyjdzie. Algorytm pisany w aplikacji konsolowej c#. Jak na początek nie jest źle oczywiście przerzucam się na cuda lub delphi. Ponoć pod .net jest biblioteka dla cuda może ktoś korzystał i powie mi czy warto w to brnąć?

Tak dodatkowo spytam poszukuję jakichś artykułów wyjaśniających działanie deep learning (metodę uczenia głębokich sieci wyjaśnioną łopatologicznie).
Za wszelką pomoc serdecznie dziękuję ;)

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