wielowarstwowa architektura perceptronu (MLP): kryteria wyboru liczby warstw ukrytych i rozmiaru warstwy ukrytej?

104

Jeśli mamy 10 wektorów własnych, to możemy mieć 10 węzłów neuronowych w warstwie wejściowej. Jeśli mamy 5 klas wyjściowych, to możemy mieć 5 węzłów w warstwie wyjściowej, ale jakie są kryteria wyboru liczby ukrytych warstw w MLP i ile neuronów węzły w 1 ukrytej warstwie?

Abhishek kumar
źródło

Odpowiedzi:

217

ile ukrytych warstw ?

model bez ukrytych warstw rozwiąże dane, które można rozdzielić liniowo . Więc jeśli nie wiesz już, że twoje dane nie są rozdzielane liniowo, weryfikacja tego nie zaszkodzi - po co używać bardziej złożonego modelu niż wymaga tego zadanie? Jeśli da się je rozdzielić liniowo, wtedy zadziała prostsza technika, ale Perceptron również wykona zadanie.

Zakładając, że dane wymagają rozdzielenia metodą nieliniową, zawsze zaczynaj od jednej ukrytej warstwy . Prawie na pewno to wszystko, czego będziesz potrzebować. Jeśli twoje dane można rozdzielić za pomocą MLP, to MLP prawdopodobnie potrzebuje tylko jednej ukrytej warstwy. Jest to teoretyczne uzasadnienie, ale mój powód jest czysto empiryczny: wiele trudnych problemów klasyfikacyjnych / regresyjnych rozwiązuje się za pomocą jednowarstwowych MLP, ale nie przypominam sobie napotkania żadnych wielowarstwowych warstw ukrytych używanych do pomyślnego modelowania danych. -Czy na tablicach ogłoszeń ML, podręcznikach ML, artykułach naukowych itp. Oczywiście istnieją, ale okoliczności uzasadniające ich użycie są empirycznie dość rzadkie.


Ile węzłów w warstwie ukrytej?

Z literatury naukowej MLP. moje własne doświadczenie itp. zebrałem i często polegam na kilku praktycznych regułach ( RoT ), które również okazały się niezawodnymi przewodnikami (tj. wskazówki były dokładne, a nawet jeśli tak nie było, zwykle było jasne, co dalej):

RoT w oparciu o poprawę konwergencji:

Kiedy zaczynasz budować model, popełniaj błędy po stronie większej liczby węzłów w ukrytej warstwie.

Czemu? Po pierwsze, kilka dodatkowych węzłów w warstwie ukrytej prawdopodobnie nie wyrządzi żadnej szkody - twój MLP nadal będzie się zbieżny. Z drugiej strony zbyt mało węzłów w warstwie ukrytej może uniemożliwić konwergencję. Pomyśl o tym w ten sposób, dodatkowe węzły zapewniają pewną nadwyżkę przepustowości - dodatkowe obciążenia do przechowywania / uwalniania sygnału do sieci podczas iteracji (szkolenie lub budowanie modelu). Po drugie, jeśli zaczniesz od dodatkowych węzłów w swojej ukrytej warstwie, możesz je później łatwo przyciąć (w trakcie iteracji). Jest to powszechne i istnieją techniki diagnostyczne, które mogą Ci pomóc (np. Diagram Hintona, który jest tylko wizualnym przedstawieniem macierzy wagi, „mapą cieplną” wartości wagi).

RoTs na podstawie rozmiaru warstwy wejściowej i rozmiaru warstwy wyjściowej:

Ogólna zasada mówi, że rozmiar tej [ukrytej] warstwy powinien znajdować się gdzieś pomiędzy rozmiarem warstwy wejściowej ... a rozmiarem warstwy wyjściowej ....

Aby obliczyć liczbę ukrytych węzłów, używamy ogólnej zasady: (liczba wejść + wyjść) x 2/3

RoT w oparciu o główne komponenty:

Zwykle określamy tyle ukrytych węzłów, ile wymiarów [głównych składników] potrzeba do uchwycenia 70–90% wariancji zbioru danych wejściowych .

A jednak autor NN FAQ nazywa te reguły „nonsensem” (dosłownie), ponieważ: ignorują one liczbę instancji uczących, szum w celach (wartości zmiennych odpowiedzi) i złożoność przestrzeni funkcji.

Jego zdaniem (i zawsze wydawało mi się, że wie, o czym mówi), wybierz liczbę neuronów w warstwie ukrytej w oparciu o to, czy twój MLP obejmuje jakąś formę regularyzacji, czy też wczesne zatrzymanie .

Jedyna ważna technika optymalizacji liczby neuronów w ukrytej warstwie:

Podczas tworzenia modelu testuj obsesyjnie; testowanie ujawni sygnatury „nieprawidłowej” architektury sieci. Na przykład, jeśli zaczynasz od MLP mającego ukrytą warstwę składającą się z niewielkiej liczby węzłów (którą będziesz stopniowo zwiększać w zależności od potrzeb, na podstawie wyników testów), twój błąd treningu i uogólnienia będzie wysoki, spowodowany uprzedzeniami i niedopasowaniem.

Następnie zwiększaj liczbę węzłów w warstwie ukrytej, jeden po drugim, aż błąd uogólnienia zacznie wzrastać, tym razem z powodu nadmiernego dopasowania i dużej wariancji.


W praktyce robię to w ten sposób:

warstwa wejściowa : rozmiar mojego vactor danych (liczba funkcji w moim modelu) + 1 dla węzła stronniczości i oczywiście bez zmiennej odpowiedzi

warstwa wyjściowa : wyłącznie określona przez mój model: regresja (jeden węzeł) a klasyfikacja (liczba węzłów równa liczbie klas, przy założeniu softmax)

ukryta warstwa : zacząć , jedną warstwę ukrytąz liczbą węzłów równą rozmiarowi warstwy wejściowej. „Idealny” rozmiar prawdopodobnie będzie mniejszy (tj. Pewna liczba węzłów między liczbą w warstwie wejściowej a liczbą w warstwie wyjściowej), a nie większy - znowu jest to tylko obserwacja empiryczna, a większość tej obserwacji jest moje własne doświadczenie. Jeśli projekt uzasadniał dodatkowy wymagany czas, zaczynam od pojedynczej warstwy ukrytej składającej się z niewielkiej liczby węzłów, a następnie (jak wyjaśniłem powyżej) dodam węzły do ​​warstwy ukrytej, po jednym na raz, podczas obliczania uogólnienia błąd, błąd uczenia, odchylenie i wariancja. Kiedy zaniknie błąd uogólnienia i tuż przed tym, jak zacznie ponownie rosnąć, wybieram liczbę węzłów w tym momencie. Zobacz rysunek poniżej.

wprowadź opis obrazu tutaj

Doug
źródło
1
Chciałbym dodać kilka powiązanych wyników dotyczących RoT nr 1: W odnoszących sukcesy maszynach SVM faktycznie mapujesz swoje dane wejściowe do wyższej przestrzeni wymiarowej (więcej węzłów ukrytych niż węzłów w warstwie wejściowej w języku NN). Zadaniem warstwy wyjściowej jest podjęcie decyzji na podstawie tej zbyt kompletnej reprezentacji. Może też istnieć połączenie z losowymi projekcjami. Genialny artykuł Adama Coatesa i Andrew Y. Ng (2011) omawia powiązane tematy.
Vladislavs Dovgalecs
Niezłe wyjaśnienie. Masz jakiś pomysł, w jaki sposób mógłbym wykreślić figurę taką jak powyżej, używając sklearn i MLPClassifier?
seralouk
1
@sera masz na myśli styl xkcd?
denfromufa
Czy w zasadzie mógłbyś zautomatyzować proces optymalizacji liczby neuronów w warstwie ukrytej? Czy możesz również automatycznie zoptymalizować liczbę ukrytych warstw?
Addison
2

Bardzo trudno jest wybrać liczbę neuronów w ukrytej warstwie i liczbę ukrytych warstw w twojej sieci neuronowej.

Zwykle w przypadku większości aplikacji wystarczy jedna ukryta warstwa. Ponadto liczba neuronów w tej ukrytej warstwie powinna zawierać się między liczbą wejść (w twoim przykładzie 10) a liczbą wyjść (w twoim przykładzie 5).

Ale najlepszym sposobem doboru liczby neuronów i warstw ukrytych jest eksperymentowanie. Wytrenuj kilka sieci neuronowych z różną liczbą ukrytych warstw i ukrytych neuronów oraz mierz wydajność tych sieci za pomocą weryfikacji krzyżowej . Możesz trzymać się liczby zapewniającej najlepszą wydajność sieci.

Ove
źródło
2

Aby zautomatyzować wybór najlepszej liczby warstw i najlepszej liczby neuronów dla każdej z warstw, możesz użyć optymalizacji genetycznej .

Kluczowe elementy to:

  1. Chromosom : wektor, który określa, ile jednostek w każdej ukrytej warstwie (np. [20,5,1,0,0] oznacza 20 jednostek w pierwszej ukrytej warstwie, 5 w drugiej, ..., bez warstw 4 i 5). Możesz ustawić limit maksymalnej liczby warstw do wypróbowania oraz maksymalnej liczby jednostek w każdej warstwie. Powinieneś także nałożyć ograniczenia na sposób generowania chromosomów. Np. [10, 0, 3, ...] nie powinno być generowane, ponieważ jakiekolwiek jednostki po brakującej warstwie („3,…”) byłyby nieistotne i marnowałyby cykle oceny.
  2. Funkcja sprawności : funkcja, która zwraca odwrotność najmniejszego błędu uczenia w zbiorze walidacji krzyżowej sieci zdefiniowanej przez dany chromosom. Możesz także podać całkowitą liczbę jednostek lub czas obliczeń, jeśli chcesz znaleźć „najmniejszą / najszybszą, ale najdokładniejszą sieć”.

Możesz również rozważyć:

  • Przycinanie : zacznij od dużej sieci, a następnie zmniejsz warstwy i ukryte jednostki, jednocześnie śledząc wydajność zestawu do weryfikacji krzyżowej.
  • Rozwój : zacznij od bardzo małej sieci, następnie dodaj jednostki i warstwy i ponownie śledź wydajność zestawu CV.
Tak jak
źródło
0

Ostatnio trwają prace teoretyczne nad tym https://arxiv.org/abs/1809.09953 . Zakładając, że używasz RELU MLP, wszystkie ukryte warstwy mają taką samą liczbę węzłów, a funkcja utraty i prawdziwa funkcja, którą aproksymujesz za pomocą sieci neuronowej, są zgodne z pewnymi właściwościami technicznymi (w artykule), możesz wybrać głębokość zamów $ \ log (n) $ i szerokość ukrytych warstw, aby były w porządku $ n ^ {d / (2 (\ beta + d))} \ log ^ 2 (n) $. Tutaj $ n $ to rozmiar twojej próbki, $ d $ to wymiar twojego wektora wejściowego, a $ \ beta $ to parametr gładkości dla twojej prawdziwej funkcji. Ponieważ $ \ beta $ jest nieznane, prawdopodobnie będziesz chciał traktować go jako hiperparametr.

Robiąc to, możesz zagwarantować, że przy prawdopodobieństwie zbieżności do 1 $ w funkcji wielkości próbki twój błąd przybliżenia zbiegnie się do 0 $ w funkcji wielkości próby. Podają stawkę. Zwróć uwagę, że nie jest to gwarantowana „najlepsza” architektura, ale może przynajmniej zapewnić dobre miejsce na rozpoczęcie. Co więcej, moje własne doświadczenie sugeruje, że rzeczy takie jak rezygnacja z nauki mogą nadal pomóc w praktyce.

mlstudent
źródło