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?
machine-learning
python
deep-learning
Raghuram
źródło
źródło
Odpowiedzi:
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
loss
gwał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):
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:
Możliwe rozwiązania:
źródło
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).
źródło
Dodanie do odpowiedzi przez @ dk14. Jeśli po prawidłowym uregulowaniu modelu nadal występują wahania , mogą to być możliwe przyczyny:
źródło
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.
źródło
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ć .
źródło
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
źródło
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.
źródło