Czy może wystąpić przeregulowanie, nawet jeśli utrata walidacji wciąż spada?

12

Mam w Keras model splotowy + LSTM, podobny do tego (ref 1), którego używam do konkursu Kaggle. Architektura jest pokazana poniżej. Przeszkoliłem go na moim oznaczonym zestawie 11000 próbek (dwie klasy, początkowa częstość wynosi ~ 9: 1, więc zwiększyłem próbkę 1 do około 1/1) dla 50 epok z 20% podziałem walidacji. przez jakiś czas, ale myślałem, że to opanowało hałas i warstwy odpadające.

Model wyglądał, jakby trenował cudownie, na koniec uzyskał 91% na całym zestawie treningowym, ale po przetestowaniu na zestawie danych testowych absolutne śmieci.

Strata według epoki

Dokładność walidacji według epoki

Uwaga: dokładność walidacji jest wyższa niż dokładność szkolenia. Jest to przeciwieństwo „typowego” nadmiernego dopasowania.

Moją intuicją jest to, że biorąc pod uwagę niewielki podział sprawdzania poprawności, model nadal zbyt dobrze dopasowuje się do zestawu danych wejściowych i traci uogólnienie. Inną wskazówką jest to, że val_acc jest większy niż acc, co wydaje się podejrzane. Czy to najbardziej prawdopodobny scenariusz?

Jeśli to się nie zgadza, czy zwiększenie podziału sprawdzania poprawności w ogóle to złagodzi, czy też mam do czynienia z tym samym problemem, ponieważ przeciętnie każda próbka nadal widzi połowę wszystkich epok?

Model:

Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
convolution1d_19 (Convolution1D) (None, None, 64)      8256        convolution1d_input_16[0][0]     
____________________________________________________________________________________________________
maxpooling1d_18 (MaxPooling1D)   (None, None, 64)      0           convolution1d_19[0][0]           
____________________________________________________________________________________________________
batchnormalization_8 (BatchNormal(None, None, 64)      128         maxpooling1d_18[0][0]            
____________________________________________________________________________________________________
gaussiannoise_5 (GaussianNoise)  (None, None, 64)      0           batchnormalization_8[0][0]       
____________________________________________________________________________________________________
lstm_16 (LSTM)                   (None, 64)            33024       gaussiannoise_5[0][0]            
____________________________________________________________________________________________________
dropout_9 (Dropout)              (None, 64)            0           lstm_16[0][0]                    
____________________________________________________________________________________________________
batchnormalization_9 (BatchNormal(None, 64)            128         dropout_9[0][0]                  
____________________________________________________________________________________________________
dense_23 (Dense)                 (None, 64)            4160        batchnormalization_9[0][0]       
____________________________________________________________________________________________________
dropout_10 (Dropout)             (None, 64)            0           dense_23[0][0]                   
____________________________________________________________________________________________________
dense_24 (Dense)                 (None, 2)             130         dropout_10[0][0]                 
====================================================================================================
Total params: 45826

Oto wezwanie do dopasowania modelu (waga klasy wynosi zwykle około 1: 1, ponieważ zwiększyłem próbkę danych wejściowych):

class_weight= {0:1./(1-ones_rate), 1:1./ones_rate} # automatically balance based on class occurence
m2.fit(X_train, y_train, nb_epoch=50, batch_size=64, shuffle=True, class_weight=class_weight, validation_split=0.2 )

SE ma głupią zasadę, że mogę opublikować nie więcej niż 2 linki, dopóki mój wynik nie będzie wyższy, więc oto przykład, jeśli jesteś zainteresowany: Ref 1: machinelearningmastery DOT com SLASH sekwencja-klasyfikacja-lstm-rekurencyjna-sieci neuronowe- python-keras

DeusXMachina
źródło

Odpowiedzi:

8

Nie jestem pewien, czy zestaw sprawdzania poprawności jest zrównoważony, czy nie. Masz poważny problem braku równowagi danych. Jeśli próbkujesz równomiernie i losowo z każdej klasy w celu trenowania sieci, a następnie procent tego, co próbkowałeś, zostanie wykorzystany do sprawdzenia poprawności sieci, oznacza to, że trenujesz i weryfikujesz przy użyciu zrównoważonego zestawu danych. W testach wykorzystano niezrównoważoną bazę danych. Oznacza to, że twoje zestawy sprawdzania poprawności i testowania nie są równoważne. W takim przypadku możesz mieć wysoką dokładność walidacji i niską dokładność testowania. Znajdź to odniesienie, które mówi głównie o problemie nierównowagi danych dla DNN, możesz sprawdzić, jak próbują wykonać szkolenie, sprawdzanie poprawności i testowanie https://pdfs.semanticscholar.org/69a6/8f9cf874c69e2232f47808016c2736b90c35.pdf

Baszar Haddad
źródło
1
Zestaw walidacyjny jest pobierany z tego samego zestawu co zestaw szkoleniowy. Nie jestem w 100% pewien, ale uważam, że Keras dokonuje cięcia sprawdzania poprawności przed tasowaniem i szkoleniem (tj. Jeśli podajesz nieskasowane dane, podział sprawdzania poprawia część twojej dystrybucji). Więc ręcznie równoważę i tasuję przed przejściem do Keras. Jedynym problemem może być to, że powielam jedynki i dodam gaussowski szum, który może zwiększać nadmiar.
DeusXMachina
2
Myślę, że nie musisz polegać na Keras, aby przeprowadzić walidację, możesz podzielić swoje dane na trzy części. Szkolenie, walidacja i testowanie. Próbkuj z danych treningowych i trenuj swoją sieć. Nie baw się dystrybucją w zestawach sprawdzania poprawności i testowania. Zoptymalizuj sieć na zestawie sprawdzania poprawności, a następnie sprawdź zestaw testowy. Zredagowałem swoją odpowiedź, aby dodać przydatne odniesienie
Bashar Haddad,
5

Jeśli Twoja utrata treningowa spadnie poniżej twojej straty z tytułu walidacji, jesteś przepracowany , nawet jeśli walidacja wciąż spada.

Jest to znak, że twoja sieć uczy się wzorców w zestawie pociągów, które nie mają zastosowania w zestawie walidacyjnym

pogrubienie
źródło
Rozumiem, że strata treningowa spada mniej niż utrata walidacji - to po prostu pasuje do zestawu treningowego. Ale dokładność walidacji jest wyższa niż dokładność szkolenia . To dziwna część!
DeusXMachina
Nie, jeśli twoje zestawy są niezrównoważone. Na przykład w binarnym klasyfikatorze, jeśli masz mniej niż 1 proporcjonalnie w zestawie sprawdzania poprawności, a twój model wyświetla tylko 0, miałbyś wyższą dokładność sprawdzania poprawności
pogrubiony