Kurs: sieci neuronowe od środka · Projekt końcowy
Projekt: Twoja sieć na cyfrach
W skrócie
Projekt końcowy kursu NN: ułóż z bloków sieć na cyfrach 8×8, wybierz ją na walidacji i wyślij na ukryty test. Ma dorównać regresji logistycznej.
Zadanie
Masz 1797 ręcznie pisanych cyfr 8×8 i sieć, którą składasz z bloków: liczba warstw ukrytych i neuronów, aktywacja, optymalizator, krok uczenia, paczka, dropout, liczba epok i wczesne zatrzymanie. Każdy blok znasz z lekcji 2–8. Sieć uczy się w Twojej przeglądarce, z ziarnem, więc ten sam wybór daje w tej samej przeglądarce zawsze ten sam wynik.
- Ułóż sieć z bloków i trenuj ją. Po każdym treningu widzisz trafność na walidacji, epoka po epoce.
- Porównuj ustawienia na walidacji. Do porównania masz regresję logistyczną: sieć bez warstwy ukrytej.
- Napisz jedno zdanie, dlaczego ta konfiguracja, i wyślij sieć na ukryty test.
Trening i walidacja nic nie kosztują, ale każde porównanie trochę zużywa walidację: im więcej przebiegów porównasz, tym bardziej najlepszy wynik walidacji jest zawyżony. Ukryty test ocenia sieć raz, na końcu.
Dane i podział
Optical Recognition of Handwritten Digits (Alpaydin i Kaynak 1998, UCI), licencja CC BY 4.0: 1797 cyfr 8×8, każdy piksel to liczba od 0 do 16 (sieć dostaje ją podzieloną przez 16). To ten sam zbiór co load_digits w scikit-learn. UCI
- Trening: 1151 cyfr. Na nich sieć uczy się wag.
- Walidacja: 359 cyfr, odłożonych losowo, z zachowaniem proporcji cyfr (ziarno 1). To te same cyfry, na których laby lekcji 2, 6 i 8 pokazują trafność: tam grały rolę walidacji i tu też nią są. Na nich porównujesz ustawienia i na nich działa wczesne zatrzymanie. Sieć się na nich nie uczy.
- Ukryty test: 287 cyfr spoza tamtych 359, wydzielonych tak samo (20%, to samo ziarno) z pozostałych 1438. Wybór podpowiedziany wynikami labów jest więc wybrany na walidacji, a nie na teście.
„Ukryty” znaczy: strona nie pokazuje wyniku na teście przed wysyłką. Nie jest zamknięty: kod strony jest publiczny, a w notebooku test policzysz sam. Limit wysyłek żyje w Twojej przeglądarce, więc pilnuje go Twoja uczciwość, nie serwer.
Jak zaliczyć
Zaliczenie jest automatyczne, według trzech zasad:
- sieć ma co najmniej jedną warstwę ukrytą. Bez niej to sama regresja logistyczna, czyli punkt odniesienia;
- na ukrytym teście trafia co najmniej tak dobrze jak regresja logistyczna na tych samych 64 pikselach. Regresja trafia w 276 z 287 cyfr testowych (96,2%), a na walidacji ma 95,5%. To sieć bez warstwy ukrytej uczona zawsze tak samo: Adam z krokiem 0,01, paczki po 32, 40 epok, ziarno 1;
- liczy się pierwsza wysyłka. Masz 3 wysyłki, ale kolejne są „po fakcie”: pokazują wynik testu, a zaliczenia nie zmieniają. Do każdej wysyłki piszesz jedno zdanie, dlaczego ta konfiguracja. Nikt go nie ocenia: to notatka dla Ciebie, np. do README w Twoim repozytorium.
Prosta sieć nie bije wyraźnie regresji logistycznej. Na cyfrach 8×8 regresja jest mocna. Mała sieć (32 neurony, bez dropoutu, Adam 0,01, wczesne zatrzymanie po 5 epokach bez poprawy) była co najmniej tak trafna jak regresja tylko na 62,0% z 200 innych losowych podziałów, czyli średnio tyle samo. Szersza sieć z dropoutem (128 neuronów, dropout 0,2, Adam 0,003, 40 epok) zaliczała na 98,5%, a z 64 neuronami na 93,5%. Średnio wygrywała o 4,0 cyfry z 287, czyli o 1,4 punktu procentowego. Mało, ale niemal na każdym podziale. To też jest wynik kursu: na małych obrazkach regresja logistyczna jest mocnym punktem odniesienia.
Jeden start to za mało na wniosek. Ta sama szersza sieć na podziale strony, z ziarnami od 1 do 5: od 343 do 350 cyfr walidacji dobrze (regresja: 343) i od 277 do 278 cyfr testowych (regresja: 276). Na tym podziale walidacja słabo odróżnia ją od regresji: przewaga na walidacji wynosi od 0 do 7 cyfr, zależnie od ziarna. Ziarno zmienia wagi początkowe, kolejność paczek i maski dropoutu. Z ziarnami od 1 do 10 ta sama sieć różni się na walidacji nawet o 9 cyfr, więc mniejsza różnica między dwiema konfiguracjami może być samym losem ziarna. Sprawdź 2–3 ziarna, zanim coś z niej wywnioskujesz.
Dlaczego liczy się pierwsza wysyłka. Da się dopasować wybór do testu: wysłać, zobaczyć wynik i poprawić. Walidację też da się w ten sposób naciągnąć: kto porówna wiele przebiegów i weźmie najlepszy, wybiera także szczęście walidacji (zob. lekcję „Strojenie hiperparametrów bez oszukiwania” w kursie ML). Przed wysyłką narzędzie pokazuje zwykły przedział: od walidacji − 3 do walidacji + 3 punktów procentowych. Na 200 innych podziałach mieściło się w nim 592 z 600 różnic test − walidacja: dla pojedynczych przebiegów dwóch przykładowych sieci i dla sieci wybranej jako najlepsza z 9 przebiegów (3 konfiguracje × 3 ziarna) na walidacji. Pojedynczy przebieg wypadał na teście średnio 0,1 punktu poniżej walidacji, a najlepszy z 9 średnio 0,6 punktu poniżej. Kto porówna więcej przebiegów, niech spodziewa się wyniku bliżej dolnej granicy. Jedna cyfra testowa to 0,35 punktu, a jedna cyfra walidacji 0,28. Przedział nie ocenia. Nie ma rankingu: wynik widzisz tylko Ty.
Budżet treningu. Przykładowa szersza sieć to 9610 wag i 40 epok po 1151 cyfr, razem ok. 1465 mln mnożeń. Narzędzie po każdym treningu pisze, ile trwał na Twoim urządzeniu, i szacuje czas następnego. Najcięższy wybór (2 warstwy po 128 neuronów, 40 epok) to ok. 3983 mln mnożeń, czyli 2,7 razy więcej. Mniejsza paczka nie dokłada mnożeń, ale wydłuża trening na zegarze. Trening możesz przerwać w każdej chwili.
Twoja sieć
Narzędzie działa w przeglądarce z włączonym JavaScriptem. Bez niego wytrenuj sieć w notebooku poniżej.
Karta ukończenia
Po zaliczeniu pierwszej wysyłki możesz pobrać kartę (PNG) z nazwą projektu, zbiorem, wynikiem i datą. Imię wpisujesz tylko na karcie: nie trafia do adresu ani na serwer. Karta nie jest certyfikatem zawodowym i niczego nie obiecuje.
Dla kodujących: notebook w numpy
Notebook trenuje tę samą sieć w numpy, bez PyTorcha: ten sam zbiór (plik cyfr z tej strony; to te same obrazy co load_digits w scikit-learn), ten sam podział (sprawdza go sam), te same losowania wag, kolejności paczek i masek dropoutu. Dla sprawdzonych ustawień wychodzi ten sam wynik co w przeglądarce, co do cyfry: sprawdziliśmy to na 5 konfiguracjach z ziarnami od 1 do 5. Przy bardzo dużym kroku uczenia drobne różnice zaokrągleń w numpy i w przeglądarce rosną z epoki na epokę i wyniki mogą się rozjechać, np. dla 2 warstw po 128 neuronów z Adamem 0,03, dropoutem 0,5 i paczką 16. Wynik może też zależeć od wersji numpy i procesora. Pod narzędziem pobierzesz notebook z własną konfiguracją; ten link ma konfigurację startową. Komórkę z testem uruchom raz, na końcu.