Błąd sprawdzania poprawności mniej niż błąd szkolenia?


57

Znalazłem tu i tutaj dwa pytania dotyczące tego problemu, ale nie ma jeszcze oczywistej odpowiedzi ani wyjaśnienia. Wymuszam ten sam problem, w którym błąd walidacji jest mniejszy niż błąd szkolenia w mojej sieci neuronowej Convolution. Co to znaczy?


Nie sądzę, aby można było odpowiedzieć na to pytanie, nie znając bezwzględnej liczby przypadków treningowych (cv) i testowych, a także wariancji zaobserwowanej dla MSE zarówno dla walidacji krzyżowej, jak i testu.
cbeleites obsługuje Monikę


Co z tego wywnioskujemy? Tak, jest generowany z gęstej sieci z warstwami przerywającymi i nienormalnymi. ! [wpisać opis obrazu tutaj ] ( i.stack.imgur.com/KX1Fz.png )
Srinath

Odpowiedzi:


69

Trudno być pewnym, nie znając faktycznej metodologii (np. Metody walidacji krzyżowej, metryki wydajności, metody podziału danych itp.).

Ogólnie mówiąc, błąd szkolenia prawie zawsze nie docenia twojego błędu sprawdzania poprawności. Jednak możliwe jest, że błąd sprawdzania poprawności będzie mniejszy niż szkolenie. Możesz myśleć o tym na dwa sposoby:

  1. Twój zestaw treningowy miał wiele „trudnych” przypadków do nauczenia się
  2. Twój zestaw sprawdzania poprawności miał głównie „łatwe” przypadki do przewidzenia

Dlatego tak ważne jest, aby naprawdę ocenić swoją metodologię szkolenia modelu. Jeśli nie podzielisz danych w celu prawidłowego szkolenia, wyniki doprowadzą do mylących, jeśli nie tylko nieprawidłowych wniosków.

Myślę o ocenie modelu w czterech różnych kategoriach:

  1. Niedopasowanie - wysoki błąd walidacji i szkolenia

  2. Overfitting - Błąd sprawdzania poprawności jest wysoki, błąd szkolenia niski

  3. Dobre dopasowanie - niski błąd walidacji, nieco wyższy niż błąd szkolenia

  4. Nieznane dopasowanie - niski błąd sprawdzania poprawności, błąd szkolenia „wysoki”

Mówię „nieznane” dopasowanie, ponieważ wynik jest sprzeczny z intuicją tego, jak działa uczenie maszynowe. Istotą ML jest przewidywanie nieznanego. Jeśli jesteś lepszy w przewidywaniu nieznanego niż to, czego się „nauczyłeś”, AFAIK dane między szkoleniem a walidacją muszą być w pewien sposób różne. Może to oznaczać, że musisz albo ponownie oszacować metodę podziału danych, dodać więcej danych lub ewentualnie zmienić metrykę wydajności (czy faktycznie mierzysz wydajność, którą chcesz?).

EDYTOWAĆ

Aby odnieść się do odniesienia OP do poprzedniego pytania dotyczącego lasagne python .

Sugeruje to, że masz wystarczającą ilość danych, aby nie wymagać weryfikacji krzyżowej, i po prostu masz podzestawy danych dotyczących szkolenia, weryfikacji i testowania. Teraz, jeśli spojrzysz na samouczek lasagne , zobaczysz, że to samo zachowanie jest widoczne u góry strony. Trudno mi było uwierzyć, że autorzy opublikowaliby takie wyniki, gdyby było to dziwne, ale zamiast zakładać, że są poprawne, spójrzmy dalej. Najbardziej interesująca nas sekcja znajduje się w sekcji pętli treningowej , tuż nad dnem zobaczysz, jak obliczane są parametry strat.

Strata szkolenie jest obliczana na całym zbiorze treningowym . Podobnie utrata walidacji jest obliczana na podstawie całego zestawu danych walidacji . Zestaw treningowy jest zwykle co najmniej 4 razy większy niż walidacja (80-20). Biorąc pod uwagę, że błąd jest obliczany dla wszystkich próbek, można spodziewać się około 4-krotności miary utraty zestawu sprawdzania poprawności. Zauważysz jednak, że utrata treningu i utrata ważności zbliżają się do siebie w miarę kontynuowania treningu. Jest to celowe, ponieważ jeśli Twój błąd treningowy zaczyna być niższy niż błąd sprawdzania poprawności, zaczynasz przecinać swój model !!!

Mam nadzieję, że to wyjaśnia te błędy.


2
Niezła odpowiedź. Istnieje również możliwość, że w kodzie jest błąd, który sprawia, że ​​trening nie jest zgodny z optymalnym rozwiązaniem na zestawie treningowym. Lub, jeśli cel szkolenia nie jest wypukły, a algorytm szkolenia zbiega się do lokalnego minimum, które okazuje się być dobre dla zestawu sprawdzania poprawności.
Sobi,

@cdeterman dzięki. Używam RMSE jako miernika wydajności. Podzieliłem swoje dane na 20% na test i 80% na szkolenie i walidację (20% danych treningowych jest poddanych walidacji krzyżowej w celu obliczenia błędu walidacji). W rzeczywistości błąd walidacji jest niski, nieco niższy niż błąd szkolenia. Błąd testu jest wyższy niż błąd szkolenia i walidacji. Podobny przypadek możemy znaleźć w MNISTdataset dla rozpoznawania pisma ręcznego stats.stackexchange.com/questions/178371/...
Bido,

@Bido, czy mój ostatni adres edycji, którego dotyczy pytanie, jest kwestionowany?
cdeterman

@cdeterman Thanks. Właśnie zauważyłem, że zredagowałeś swoją odpowiedź. To jest jasne i pomocne.
Bido

Świetne wytłumaczenie, jeśli możesz dodać kilka wykresów - byłby najlepszy z możliwych
Taras Matsyk

109

Jedna możliwość: jeśli używasz warstwy regulacyjnej porzucania w swojej sieci, uzasadnione jest, że błąd weryfikacji jest mniejszy niż błąd szkolenia. Ponieważ zwykle przerywanie jest aktywowane podczas treningu, ale dezaktywowane podczas oceny zestawu walidacyjnego. W tym drugim przypadku otrzymujesz bardziej płynną (zwykle oznacza lepszą) funkcję.


12
Cóż za prosta, rozsądna odpowiedź!
rajb245

4
Tak, to należy zaznaczyć jako poprawną odpowiedź.
Simanas

2
Usunąłem warstwę rezygnacji, ale początkowo nadal widzę utratę walidacji niższą niż strata treningowa! (Nie określam też żadnych uregulowań na warstwach!)
Josiah Yoder

Pasuje do mojej skrzynki. Korzystanie z wielu rezygnacji.
André Christoffer Andersen

@JosiahYoder - masz coś więcej do podzielenia się na ten temat? Mam 1650 funkcji wejściowych. kiedy utrzymuję małą przerwę w sieci (1650, 50, 1) lub nie przerywam, błąd szkolenia w początkowych epokach jest większy niż błąd sprawdzania poprawności. Kiedy używam dużych sieci (1650, 1200, 800, 100 ... około 10 warstw 100 z aktywacją selu), dziwny wzór wyższej dokładności walidacji jest nieco złagodzony.
MiloMinderbinder

19

Nie mam wystarczającej liczby punktów, aby skomentować odpowiedź @ DK, ale teraz jest to odpowiedź na FAQ w dokumentacji Keras:

„Dlaczego strata treningowa jest znacznie wyższa niż utrata testowa?

Model Keras ma dwa tryby: trening i testowanie. Mechanizmy regularyzacji, takie jak regularyzacja porzucania i L1 / L2, są wyłączone na czas testowania.

Poza tym strata treningowa jest średnią strat z każdej partii danych treningowych. Ponieważ Twój model zmienia się w czasie, strata w pierwszych partiach epoki jest na ogół wyższa niż w ostatnich partiach. Z drugiej strony, strata testowa dla epoki jest obliczana przy użyciu modelu takiego jak na końcu epoki, co powoduje niższą stratę ”.


1
To również nie do końca odpowiada na pytanie. Po wyłączeniu rezygnacji nadal widzę utratę walidacji o około połowę straty treningowej przez kilka epok z rzędu!
Josiah Yoder

Czy twoje dane treningowe są reprezentatywne dla danych programistycznych?
dniu

Losowo dzielę zestaw danych na szkolenie i testowanie. Okazało się, że jest to dobra próbka. Pracowałem nad problemem regresji, w którym najlepsze klasyfikatory były tylko nieznacznie lepsze niż zawsze przewidywanie wartości średniej.
Josiah Yoder

Twoja odpowiedź nie mówi o tym, że utrata treningu jest większa niż utrata walidacji, która jest pytaniem. Bardziej koncentrujesz się na utracie treningu i utracie testu
enjal

6

moje 2 centy: Miałem również ten sam problem, nawet bez warstw odpadających. W moim przypadku sprawcami były warstwy norm serii. Kiedy je usunąłem - utrata szkolenia stała się podobna do utraty sprawdzania poprawności. Prawdopodobnie tak się stało, ponieważ podczas treningu norma wsadowa używa średniej i wariancji podanej partii wsadowej, która może być różna dla poszczególnych partii. Ale podczas oceny norma wsadowa używa średniej biegnięcia i wariancji, które oba odzwierciedlają właściwości całego zestawu treningowego znacznie lepiej niż średnia i wariancja pojedynczej partii podczas treningu. Przynajmniej tak jest implementowana norma wsadowa w pytorch


1
Dziękuję @ Mans007, stało się to ze mną i korzystałem z Keras. Przyczyną były warstwy norm wsadowych.
Roei Bahumi

4

Inną możliwością, która łączy w pewien sposób odpowiedź @cdeterman i @DK , jest użycie mechanizmu powiększania danych. Rzeczywiste powiększanie danych odbywa się zwykle tylko na zestawie szkoleniowym, a nie na zestawie sprawdzania poprawności (jak w przypadku regulowania porzucania), co może prowadzić do zestawu sprawdzania poprawności zawierającego „łatwiejsze” przypadki do przewidzenia niż przypadki w zestawie szkoleniowym.


2

Mam podobne wyniki (utrata testu była znacznie niższa niż utrata treningu). Po usunięciu regularyzacji porzucania obie straty stały się prawie równe.


0

@cdeterman i @DK mają dobre wytłumaczenie. Chciałbym z jeszcze jednego powodu data leakage. Część danych pociągu jest „ściśle związana” z danymi testowymi.

Potencjalny przykład: wyobraź sobie, że masz 1000 psów i 1000 kotów z 500 podobnymi zdjęciami na zwierzaka (niektórzy właściciele lubią robić zdjęcia swoich zwierzaków w bardzo podobnych pozycjach), powiedzmy w tle. Więc jeśli wykonasz losowy podział 70/30, dostaniesz wyciek danych pociągu do danych testowych.


0

Mówiąc prosto, jeśli utrata treningu i utrata walidacji są poprawnie obliczone, niemożliwe jest, aby strata treningu była wyższa niż utrata walidacji. Jest tak, ponieważ propagacja wsteczna BEZPOŚREDNIO zmniejsza błąd obliczony na zestawie szkoleniowym i tylko POŚREDNIE (nawet nie gwarantowane!) Zmniejsza błąd obliczony na zestawie sprawdzania poprawności.

Muszą istnieć dodatkowe czynniki, które są różne podczas treningu i podczas walidacji. Rezygnacja jest dobra, ale mogą istnieć inne. Należy sprawdzić dokumentację dowolnej używanej biblioteki. Modele i warstwy mogą zwykle mieć ustawienia domyślne, na które zwykle nie zwracamy uwagi.


0

Błąd niższej walidacji niż szkolenia może być spowodowany fluktuacjami związanymi z rezygnacją lub inną, ale jeśli utrzymuje się na dłuższą metę, może to oznaczać, że zbiory danych szkolenia i walidacji nie zostały w rzeczywistości wyciągnięte z tych samych zestawów statystycznych. Może się to zdarzyć, jeśli twoje przykłady pochodzą z serii i jeśli nie losowo odpowiednio zestawów danych dotyczących szkolenia i walidacji.


0

W tej chwili metody oparte na gradiencie stochastycznym są prawie zawsze algorytmem z wyboru do głębokiego uczenia się. Oznacza to, że dane przychodzą jako partie, gradienty są obliczane, a parametry aktualizowane. Oznacza to, że można również obliczyć stratę na danych po wybraniu każdej partii. W ramach tej metody, istnieją dwa sposoby, w jaki sposób straty oblicza się, że mogę myśleć, co może prowadzić do tego zjawiska, że błąd jest większy niż trening błędu walidacji. Poniżej pokazuję, że Keras faktycznie oblicza błędy w próbie w ten sposób.

1.) Błąd szkolenia jest uśredniany dla całej epoki, a raczej naraz na końcu epoki, ale błąd walidacji występuje tylko na końcu epoki. Należy zauważyć, że błąd sprawdzania poprawności ma tę zaletę, że jest w pełni aktualizowany, natomiast błąd szkolenia obejmuje obliczenia błędów z mniejszą liczbą aktualizacji. Oczywiście asymptotycznie ten efekt powinien zasadniczo zniknąć.

2.) Błąd szkolenia jest obliczany przed aktualizacją partii. W metodzie opartej na gradiencie stochastycznym gradient jest nieco zakłócony. Podczas wspinaczki na wzgórze istnieje duże prawdopodobieństwo, że zmniejszy się globalna strata obliczona dla wszystkich próbek treningowych. Jednak gdy zbliży się do trybu, kierunek aktualizacji będzie ujemny w odniesieniu do próbek w partii. Ale ponieważ jesteśmy podskakują wokół trybie, to znaczy średnio musimy być wybranie kierunku, który jest pozytywne w odniesieniu do próbek outpartii. Teraz, jeśli mamy zamiar zaktualizować w odniesieniu do próbek w danej partii, oznacza to, że zostały one wypchnięte przez potencjalnie wiele aktualizacji partii, których nie uwzględniono, obliczając ich utratę przed aktualizacją, to wtedy stochastyczny metody przesunęły parametry najbardziej na korzyść innych próbek w zbiorze danych, co daje nam niewielkie odchylenie w górę w zakresie oczekiwanej straty.

Zauważ, że chociaż asymptotycznie efekt (1) znika, (2) nie! Poniżej pokazuję, że Keras wydaje się robić zarówno (1), jak i (2).

(1) Wskazanie, że dane są uśredniane dla każdej partii w epoce, a nie wszystkie jednocześnie na końcu. Zwróć uwagę na OGROMNĄ różnicę w dokładności w próbie w porównaniu z wartością val_accuracy, sprzyjającą wartości val_accuracy w pierwszej epoce. Wynika to z faktu, że niektóre błędy w próbce zostały obliczone przy bardzo niewielu aktualizacjach wsadowych.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = 100, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 8s 176us/sample 
- loss: 0.2320 - accuracy: 0.9216 
- val_loss: 0.1581 - val_accuracy: 0.9636
Epoch 2/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1487 - accuracy: 0.9662 
- val_loss: 0.1545 - val_accuracy: 0.9677
Epoch 3/3
46580/46580 [==============================] - 8s 165us/sample 
- loss: 0.1471 - accuracy: 0.9687 
- val_loss: 0.1424 - val_accuracy: 0.9699
<tensorflow.python.keras.callbacks.History object at 0x17070d080>

(2) Wyświetlanie błędu jest obliczane przed aktualizacją dla każdej partii. Zauważ, że dla epoki 1, kiedy używamy batch_size = nRows(tj. Wszystkich danych w jednej partii), błąd w próbie wynosi około 0,5 (losowe zgadywanie) dla epoki 1, ale błąd walidacji wynosi 0,82. Dlatego błąd w próbie został obliczony przed aktualizacją partii, podczas gdy błąd sprawdzania poprawności został obliczony po aktualizacji partii.

>>> model.fit(Xtrn, Xtrn, epochs = 3, batch_size = nRows, 
...                 validation_data = (Xtst, Xtst))
Train on 46580 samples, validate on 1000 samples
Epoch 1/3
46580/46580 [==============================] - 9s 201us/sample 
- loss: 0.7126 - accuracy: 0.5088 
- val_loss: 0.5779 - val_accuracy: 0.8191
Epoch 2/3
46580/46580 [==============================] - 6s 136us/sample 
- loss: 0.5770 - accuracy: 0.8211 
- val_loss: 0.4940 - val_accuracy: 0.8249
Epoch 3/3
46580/46580 [==============================] - 6s 120us/sample 
- loss: 0.4921 - accuracy: 0.8268 
- val_loss: 0.4502 - val_accuracy: 0.8249
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.