Jak uzyskać ciągłą produkcję o wartościach rzeczywistych z sieci neuronowej?

14

W większości przykładów sieci neuronowych, które do tej pory widziałem, sieć jest używana do klasyfikacji, a węzły są transformowane funkcją sigmoidalną. Chciałbym jednak użyć sieci neuronowej do wyprowadzenia ciągłej wartości rzeczywistej (realistycznie wyjście zwykle byłoby w zakresie od -5 do +5).

Moje pytania to:

1. Should I still scale the input features using feature scaling? What range?
2. What transformation function should I use in place of the sigmoid?

Chcę początkowo wdrożyć PyBrain, który opisuje te typy warstw .

Więc myślę, że powinienem mieć 3 warstwy na początek (warstwę wejściową, ukrytą i wyjściową), które są warstwami liniowymi? Czy to rozsądny sposób? Lub alternatywnie czy mogę „rozciągnąć” funkcję sigmoidalną w zakresie od -5 do 5?

Użytkownik
źródło
1
Pewnie możesz użyć sigmoidu . Np. Zacznij od funkcji logistycznej, pomnóż przez 10, odejmij 5 ...[,][5,5]
cbeleites niezadowolony z SX
Czy jest jakiś konkretny powód, dla którego unikasz używania dwóch ukrytych warstw? To wydaje się być najłatwiejszym sposobem na uzyskanie ciągłego wyjścia o wartości rzeczywistej z sieci neuronowej. „Każda funkcja może być przybliżona do dowolnej dokładności przez sieć z dwiema ukrytymi warstwami” (wspomniane w notatkach ze slajdu tekstowego 26 Uczenie maszynowe Mitchell: cs.cmu.edu/afs/cs.cmu.edu/project/theo-20/ www / mlbook / ch4.pdf )
Chris Simokat
@ChrisSimokat: Nie, ale większość tego, co do tej pory przeczytałem, sugeruje jedną ukrytą warstwę jako rozsądny punkt wyjścia. Czy jedna sieć ukrytych warstw nie może aproksymować żadnej funkcji?
Użytkownik
1
@ChrisSimokat: Może coś mi brakuje, ale myślałem, że pojedyncza ukryta warstwa nie równa się „pojedynczemu perceptronowi”, prawda?
Użytkownik
1
Nie, nic ci nie umknęło, ale najwyraźniej nie czytałam wystarczająco dokładnie z tego powodu.
Chris Simokat,

Odpowiedzi:

12

1 . Czy powinienem nadal skalować funkcje wejściowe za pomocą skalowania funkcji? Jaki zakres?

Skalowanie niczego nie pogarsza. Przeczytaj tę odpowiedź z sieci neuronowej Sarle FAQ: Temat: Czy powinienem normalizować / standaryzować / przeskalowywać dane? .

2 . Jakiej funkcji transformacji należy użyć zamiast sigmoidu?

Możesz użyć logistycznej sigmoid lub tanh jako funkcji aktywacji. To nie ma znaczenia Nie musisz zmieniać algorytmu uczenia się. Musisz po prostu przeskalować wyniki swojego treningu do zakresu funkcji aktywacji warstwy wyjściowej ( lub ), a kiedy ćwiczysz swoją sieć, musisz skalować wyniki swojej sieć do . Naprawdę nie musisz nic zmieniać.[ - 1 , 1 ] [ - 5 , 5 ][0,1][1,1][5,5]

alfa
źródło
Jaki jest prawidłowy sposób skalowania wyjścia sieci neuronowej do zakresu [-5,5]?
Użytkownik
3
e[a,b][c,d]eaba(dc)+c
2
Ale ponieważ sigmoid jest nieliniowy, z równomiernym rozkładem próbkującym wartość sigmoidu prawdopodobnie uzyskalibyśmy coś bliskiego 1 lub bliskiego 0. Co oznacza, że ​​musimy nauczyć się naszej sieci, aby ostrożniej wybierać wartości pośrodku. Czy sigmoid + skalowanie jest naprawdę dobrym wyborem?
Smarty77
0

Zastrzeżenie: przedstawione podejście nie jest wykonalne dla ciągłych wartości, ale uważam, że ma pewien wpływ na podejmowanie decyzji w projekcie Smarty77 porusza dobrą sprawę o wykorzystaniu przeskalowanej funkcji sigmoidalnej. Zasadniczo funkcja sigmoidalna generuje prawdopodobieństwo, które opisuje wskaźnik powodzenia próbkowania (tj. 95 ze 100 zdjęć z tymi funkcjami jest z powodzeniem „psich”). Ostateczny opisany wynik jest binarny, a szkolenie z użyciem „binarnej entropii krzyżowej” opisuje proces oddzielania diametralnie przeciwnych wyników, co z natury zniechęca do uzyskania wyników w średnim zakresie. Kontinuum danych wyjściowych służy jedynie skalowaniu na podstawie liczby próbek (tzn. Wynik 0,9761 oznacza, że ​​9761 na 10000 próbek wykazujących te lub podobne triaty to „pies”), ale każdy wynik sam w sobie musi być nadal uważany za binarny, a nie arbitralny. W związku z tym nie należy go mylić i stosować jako liczb rzeczywistych i może nie mieć tutaj zastosowania. Chociaż nie jestem pewien wykorzystania sieci, normalizowałbym sam wektor wyjściowy wrt. Można to zrobić za pomocą softmax. Będzie to również wymagało 11 wyjść liniowych (pojemników) z sieci (po jednym dla każdego wyjścia od -5 do +5), po jednym dla każdej klasy. Zapewni to wartość pewności dla każdego „bin” będącego poprawną odpowiedzią. Tę architekturę można by wyszkolić przy użyciu kodowania „na gorąco”, przy czym cyfra 1 wskazuje prawidłowy przedział. Wynik można interpretować na różne sposoby, na przykład chciwą strategię lub probabilistyczne próbkowanie. Aby jednak przekształcić go w zmienną ciągłą, pewność każdego indeksu można wykorzystać jako wagę do umieszczenia znacznika na linii liczbowej (podobnie do zachowania jednostki sigmoidalnej), ale uwypukla to również podstawowy problem: jeśli sieć jest dość pewna, wynik wynosi -2 lub +3, ale absolutnie pewne, że to nic innego, czy +1 jest realnym wynikiem? Dziękuję za uwagę. Powodzenia w twoim projekcie.

Robert Hildreth
źródło