Dlaczego dokładność walidacji zmienia się?

31

Mam czterowarstwowy CNN do przewidywania odpowiedzi na raka za pomocą danych MRI. Używam aktywacji ReLU do wprowadzenia nieliniowości. Dokładność i strata pociągu monotonicznie odpowiednio wzrastają i maleją. Ale moja dokładność testu zaczyna się dziko wahać. Próbowałem zmienić szybkość uczenia się, zmniejszyć liczbę warstw. Ale to nie zatrzymuje fluktuacji. Przeczytałem nawet tę odpowiedź i próbowałem postępować zgodnie ze wskazówkami zawartymi w tej odpowiedzi, ale znów nie miałem szczęścia. Czy ktoś mógłby mi pomóc dowiedzieć się, gdzie popełniam błąd?

Zrzut ekranu

Raghuram
źródło
Tak, przeczytałem tę odpowiedź. Przetasowanie danych walidacyjnych nie pomogło
Raghuram
4
Ponieważ nie udostępniłeś fragmentu kodu, dlatego nie mogę powiedzieć wiele, co jest nie tak w Twojej architekturze. Ale na zrzucie ekranu, widząc twoją dokładność treningu i walidacji, krystalicznie jasne jest, że twoja sieć jest zbyt duża. Byłoby lepiej, gdybyś udostępnił tutaj swój fragment kodu.
Nain
ile masz próbek? może fluktuacja nie jest tak naprawdę znacząca. Również dokładność jest okropna
rep_ho
Czy ktoś może mi pomóc zweryfikować, czy zastosowanie podejścia zespołowego jest dobre, gdy dokładność walidacji zmienia się? ponieważ byłem w stanie zarządzać moją zmienną dokładnością validation_accuracy przez zespół o dobrej wartości.
Sri2110

Odpowiedzi:

27

Jeśli poprawnie rozumiem definicję dokładności, dokładność (% poprawnie sklasyfikowanych punktów danych) jest mniej kumulatywna niż, powiedzmy, MSE (średni błąd kwadratu). Dlatego widzisz, że twój lossgwałtownie rośnie, a dokładność zmienia się.

Intuicyjnie oznacza to w zasadzie, że pewna część przykładów jest klasyfikowana losowo , co powoduje fluktuacje, ponieważ liczba prawidłowych losowych domysłów zawsze się zmienia (wyobraź sobie dokładność, gdy moneta zawsze powinna zwracać „główki”). Zasadniczo wrażliwość na hałas (gdy klasyfikacja daje losowy wynik) jest powszechną definicją nadmiernego dopasowania (patrz wikipedia):

W statystyce i uczeniu maszynowym jednym z najczęstszych zadań jest dopasowanie „modelu” do zestawu danych szkoleniowych, aby móc w wiarygodny sposób przewidywać ogólne nieprzeszkolone dane. W przypadku nadmiernego dopasowania model statystyczny opisuje losowy błąd lub szum zamiast podstawowej zależności

Kolejnym dowodem przeregulowania jest to, że twoja strata rośnie, Strata jest mierzona bardziej precyzyjnie, jest bardziej wrażliwa na hałaśliwe przewidywanie, jeśli nie zostanie zmiażdżona przez sigmoidy / progi (co wydaje się być twoim przypadkiem dla samej Straty). Intuicyjnie możesz wyobrazić sobie sytuację, w której sieć jest zbyt pewna co do wyjścia (gdy jest niepoprawna), więc daje wartość daleko od progu w przypadku przypadkowej błędnej klasyfikacji.

Jeśli chodzi o Twoją skrzynkę, Twój model nie jest odpowiednio uregulowany, możliwe przyczyny:

  • za mało punktów danych, za dużo pojemności
  • zamawianie
  • brak / nieprawidłowe skalowanie / normalizacja funkcji
  • szybkość uczenia się: jest zbyt duża, więc SGD skacze za daleko i nie trafia w obszar w pobliżu lokalnych minimów. Byłby to skrajny przypadek „niedopasowania” (niewrażliwość na dane), ale mógłby generować (rodzaj) szumu „niskiej częstotliwości” na wyjściu przez szyfrowanie danych z wejścia - w przeciwieństwie do nadmiernej intuicji, byłoby to jak zawsze zgadywanie głów podczas przewidywania monety. Jak zauważył @JanKukacka, dotarcie do obszaru „zbyt blisko” minimów może spowodować przeregulowanie, więc jeśli jest zbyt małe, czułoby się wrażliwe na szum „wysokiej częstotliwości” w danych. powinna być gdzieś pomiędzy.αα ααα

Możliwe rozwiązania:

  • uzyskaj więcej punktów danych (lub sztucznie rozszerz zestaw istniejących)
  • baw się hiperparametrami (na przykład zwiększ / zmniejsz pojemność lub termin regularyzacji)
  • regularyzacja : spróbuj porzucić, wczesne zatrzymanie itd
dk14
źródło
Odnośnie: „Strata jest mierzona bardziej precyzyjnie, jest bardziej wrażliwa na hałaśliwe prognozy, ponieważ nie jest ona zgniatana przez sigmoidy / progi”, zgadzam się bez progów, ale jeśli używasz np. Binarnej entropii krzyżowej jako funkcji straty, sigmoid nadal gra rola.
Zhubarb
1
Jeśli chodzi o tempo uczenia się i brak sgd minimów: osiągnięcie minimum najprawdopodobniej oznaczałoby nadmierne dopasowanie (ponieważ jest to minimum w zestawie treningowym)
Jan Kukacka
@Berkmeister true, przeredagowałem trochę (patrz edycja). Myślałem, że zwiększona strata jest oznaką użycia funkcji niezgniatania.
dk14
@ JanKukacka masz na myśli globalne minima? Implikowałem lokalne minima (właściwie blisko lokalnych minimów) - w tym sensie, że jeśli jest zbyt daleko od jakichkolwiek minimów, byłoby to niedopasowane. Prawdopodobnie powinienem to dokładniej opisać (patrz edycja), dzięki.
dk14
@ dk14 Zakładam, że globalne minimum nie może być w praktyce osiągnięte, więc mam na myśli raczej lokalne minima. Jeśli jesteś za daleko, możesz być niedopasowany, ale jeśli jesteś zbyt blisko, najprawdopodobniej jesteś przeregulowany. Interesująca praca Moritza Hardta „Trenuj szybciej, lepiej uogólniaj: stabilność stochastycznego spadku gradientu” ( arxiv.org/abs/1509.01240 ) wyznacza granicę między błędem treningu a błędem testowania podczas treningu z SGD.
Jan Kukacka
6

To pytanie jest stare, ale zamieszczam je, ponieważ nie zostało jeszcze wskazane:

Możliwość 1 : Stosujesz jakiś proces wstępnego przetwarzania (zero znaczenia, normalizacja itp.) Do zestawu treningowego lub zestawu sprawdzania poprawności, ale nie do drugiego .

Możliwość 2 : Jeśli zbudowałeś kilka warstw, które działają inaczej podczas treningu i wnioskowania od zera, twój model może być nieprawidłowo wdrożony (np. Czy średnia ruchoma i odchylenie standardowe odchylenia dla normalizacji partii są aktualizowane podczas treningu? Jeśli używasz rezygnacji, czy wagi są odpowiednio skalowane podczas wnioskowanie?). Może tak być w przypadku, gdy kod implementuje te rzeczy od zera i nie korzysta z wbudowanych funkcji Tensorflow / Pytorch.

Możliwość 3: Nadmierne dopasowanie, jak wszyscy zauważyli. Uważam, że pozostałe dwie opcje są bardziej prawdopodobne w twojej konkretnej sytuacji, ponieważ twoja dokładność sprawdzania utknęła na poziomie 50% od epoki 3. Zasadniczo byłbym bardziej zaniepokojony nadmiernym dopasowywaniem, gdyby miało to miejsce na późniejszym etapie (chyba że masz bardzo specyficzny problem na dłoni).

Soroush
źródło
Mam problem, który jest podobny, ale nie do końca, więcej szczegółów tutaj: stackoverflow.com/questions/55348052/... W moim przypadku faktycznie mam stałą wysoką dokładność danych testowych, a podczas szkolenia dokładność walidacji „(nie strata) jest wyższa niż dokładność treningu. Ale fakt, że nigdy się nie zbiega i nie oscyluje, każe mi myśleć o nadmiernym dopasowaniu, podczas gdy niektórzy sugerują, że tak nie jest, więc zastanawiam się, czy tak jest i jakie jest uzasadnienie, jeśli tak nie jest.
dusa
1
Jest to zdecydowanie najbardziej prawdopodobne wyjaśnienie udzielonych odpowiedzi. Zauważ, że wysoki pęd normalizacji partii (np. 0,999, a nawet domyślna wartość Keras 0,99) w połączeniu z wysoką częstością uczenia się mogą również powodować bardzo różne zachowania w treningu i ocenie, ponieważ statystyki warstw są bardzo opóźnione. W takim przypadku załatwienie pędu do poziomu 0,9 powinno załatwić sprawę. Miałem podobny problem jak OP i to załatwiło sprawę.
Kristjan
5

Dodanie do odpowiedzi przez @ dk14. Jeśli po prawidłowym uregulowaniu modelu nadal występują wahania , mogą to być możliwe przyczyny:

  • Korzystanie z losowej próbki z zestawu sprawdzania poprawności: oznacza, że ​​zestaw sprawdzania poprawności na każdym etapie oceny jest inny, podobnie jak utrata potwierdzenia.
  • Korzystanie z funkcji ważonej straty (która jest używana w przypadku wysoce niezrównoważonych problemów klasowych). Na etapie pociągu ważysz swoją funkcję straty na podstawie wag klasy, podczas gdy na etapie projektowania po prostu obliczasz nieważoną stratę. W takim przypadku, mimo że twoja sieć wkracza w kierunku konwergencji, możesz zobaczyć wiele wahań w utracie sprawdzania poprawności po każdym kroku pociągu. Ale jeśli zaczekasz na większy obraz, zobaczysz, że twoja sieć faktycznie zbliża się do minimów z fluktuacjami wyczerpującymi się (patrz załączony obraz dla jednego takiego przykładu).wprowadź opis zdjęcia tutajwprowadź opis zdjęcia tutaj
bitspersecond
źródło
2

Zdecydowanie przesadzone. Różnica między dokładnością danych treningowych a danymi testowymi pokazuje, że nadmiernie dopasowałeś się do treningu. Może regularyzacja może pomóc.

keramat
źródło
1

Twoja dokładność sprawdzania poprawności w odniesieniu do problemu klasyfikacji binarnej (zakładam) „waha się” około 50%, co oznacza, że ​​twój model daje całkowicie losowe prognozy (czasami poprawnie zgaduje więcej próbek, a czasem kilka próbek mniej). Ogólnie rzecz biorąc, twój model nie jest lepszy niż rzucanie monetą.

Powodem utraty stabilizacji jest to, że jest to funkcja ciągła: można wyróżnić, że prognoza 0,9 dla próbki dodatniej jest bardziej poprawna niż prognoza 0,51. Aby uzyskać dokładność, zaokrąglasz te ciągłe prognozy dzienników do i po prostu obliczasz procent poprawnych prognoz. Teraz, ponieważ twój model zgaduje, najprawdopodobniej przewiduje wartości bliskie 0,5 dla wszystkich próbek, powiedzmy, że próbka dostaje 0,49 po jednej epoce i 0,51 w następnej. Z perspektywy straty niepoprawność prognozy niewiele się zmieniła, a dokładność jest wrażliwa nawet na te niewielkie różnice.{0;1}

W każdym razie, jak już zauważyli inni, twój model doświadcza poważnego przeuczenia. Domyślam się, że twój problem jest zbyt skomplikowany , tj. Bardzo trudno jest wyodrębnić pożądane informacje z twoich danych, a taki prosty 4-warstwowy przeszkolony end2end nie ma szans się go nauczyć .

Jan Kukacka
źródło
0

Jest kilka sposobów, aby spróbować w twojej sytuacji. Najpierw spróbuj zwiększyć rozmiar partii, co pomaga mini-partii SGD mniej wędrować dziko. Po drugie, dostosowując współczynnik uczenia się, prawdopodobnie zmniejszysz go. Po trzecie, wypróbuj inny optymalizator, na przykład Adam lub RMSProp, które są w stanie dostosować wskaźniki uczenia się dla funkcji wrt. Jeśli to możliwe, spróbuj powiększyć swoje dane. Na koniec wypróbuj bayesowskie sieci neuronowe poprzez przybliżenie porzucania, bardzo interesujące dzieło Yarina Gal https://arxiv.org/abs/1506.02158

pateheo
źródło
0

Czy próbowałeś mniejszej sieci? Biorąc pod uwagę, że dokładność treningu może osiągnąć> .99, Twoja sieć wydaje się mieć wystarczającą liczbę połączeń, aby w pełni modelować dane, ale możesz mieć zewnętrzne połączenia, które uczą się losowo (tj. Przeregulowanie).

Z mojego doświadczenia wynika, że ​​uzyskałem dokładność sprawdzania poprawności wstrzymania w celu ustabilizowania się w mniejszej sieci, próbując różnych sieci, takich jak ResNet, VGG, a nawet prostszych sieci.

teter123f
źródło