Używam sieci neuronowej w R, aby zbudować NN z 14 wejściami i jednym wyjściem. Sieć buduję / trenuję kilka razy przy użyciu tych samych danych treningowych i tych samych architektury / ustawień sieciowych.
Po wytworzeniu każdej sieci używam jej do samodzielnego zestawu danych testowych do obliczania niektórych przewidywanych wartości. Zauważyłem, że istnieje duża wariancja w każdej iteracji przewidywanych danych, mimo że wszystkie dane wejściowe (zarówno dane szkoleniowe, jak i dane testowe) pozostają takie same za każdym razem, gdy buduję sieć.
Rozumiem, że za każdym razem będą występować różnice w wagach wytwarzanych w ramach NN i że żadne dwie sieci neuronowe nie będą identyczne, ale co mogę spróbować stworzyć sieci, które są bardziej spójne w każdym pociągu, biorąc pod uwagę identyczne dane?
Odpowiedzi:
Zasadniczo można uzyskać większą stabilność, zwiększając liczbę ukrytych węzłów i stosując odpowiedni rozkład masy (zwany także karą kalenicową).
W szczególności zaleciłbym użycie tego
caret
pakietu, aby lepiej zrozumieć twoją dokładność (a nawet niepewność co do dokładności). Również ostrożnie jest toavNNet
, że zespół uczy się z wielu sieci neuronowych, aby zmniejszyć efekt początkowych nasion. Osobiście nie widziałem ogromnej poprawy w użyciu,avNNet
ale może rozwiązać twoje pierwotne pytanie.Dopilnuję również, aby wszystkie twoje dane były odpowiednio uwarunkowane. Czy ortogonalizowałeś je, a następnie ponownie przeskalowałeś? Caret może również wykonać to wstępne przetwarzanie za pośrednictwem swojej
pcaNNet
funkcji.Na koniec możesz rozważyć rzutowanie w niektórych połączeniach pomijania warstw. Musisz jednak upewnić się, że w danych nie ma żadnych wartości odstających / punktów dźwigni, aby wypaczyć te połączenia.
źródło
nnet
początkowych wagach wszystkie są inicjowane do jednolitej liczby losowej od -0,7 do 0,7, jeśli dobrze pamiętam. I możesz kontrolować wielkość w parametrze. Szczerze mówiąc, miałemnnet
dużo szczęścia z pakietem i nigdy nie wypróbowałem żadnej innej opcji. Powodzenia!Nie pracowałem z R, więc mogę jedynie podać więcej ogólnych wskazówek.
Czy sprawdziłeś, czy algorytm jest zbieżny? Jednym z możliwych wyjaśnień może być to, że różne zestawy parametrów znajdują się gdzieś w połowie tej samej wartości optymalnej.
Jeśli algorytm zawsze jest zbieżny, ale z innym lokalnym optimum, istnieje wiele heurystyk, których można by uniknąć. Jedną prostą strategią przy użyciu stochastycznego spadku gradientu (SGD) byłoby użycie mniejszych partii i większego pędu . Mniejsze rozmiary partii skutecznie wprowadzają hałas do treningu, co może pomóc uniknąć lokalnych optymów. O wiele bardziej wyrafinowaną strategią byłoby inicjowanie wag za pomocą autoencoderów .
źródło
nnet
od podstawy R, wykorzystuje metodę optymalizacji BFGS z R naoptim
. Faktycznie oblicza gradienty, aby uzyskać obraz powierzchni. W jego implementacji nie ma przetwarzania wsadowego ani parametru o stałym momencie. Powiedziawszy to wszystko, łatwo może się nie zbiegać; zwłaszcza ze śmieciami.