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?
57
Odpowiedzi:
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:
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:
Niedopasowanie - wysoki błąd walidacji i szkolenia
Overfitting - Błąd sprawdzania poprawności jest wysoki, błąd szkolenia niski
Dobre dopasowanie - niski błąd walidacji, nieco wyższy niż błąd szkolenia
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.
źródło
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ę.
źródło
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ę ”.
źródło
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
źródło
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.
źródło
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.
źródło
@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.
źródło
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.
źródło
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.
źródło
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.
(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.źródło