Pokrętła treningu: krok uczenia, epoki, wsad

🎯 Po co Ci to?

Dwie osoby biorą tę samą architekturę sieci, te same dane i ten sam algorytm uczenia. Po treningu pierwsza ma model z trafnością 98%, druga — model, którego strata po trzech minutach zamieniła się w „nieliczbę" i trening się rozsypał. Różnica nie leży w matematyce z poprzednich jednostek, bo była identyczna. Leży w kilku liczbach ustawionych przed treningiem: jak duży krok robić, ile przykładów obejrzeć przed każdą korektą, ile razy przejść przez zbiór danych. To właśnie pokrętła treningu. W tej jednostce dowiesz się, co robi każde z nich i dlaczego strojenie modelu bywa najbardziej „rzemieślniczą" częścią pracy z uczeniem maszynowym.

✅ Czego się nauczysz

Po tej lekcji potrafisz:

  • odróżnić parametry modelu (uczy się ich sieć) od hiperparametrów (ustawia je człowiek);
  • wyjaśnić rolę kroku uczenia i opisać, co się dzieje, gdy jest za duży i gdy za mały;
  • wyjaśnić, czym jest wsad (batch) i dlaczego niemal nikt nie liczy gradientu z całego zbioru naraz;
  • policzyć, ile korekt wag przypada na jedną epokę przy zadanej wielkości wsadu;
  • powiedzieć, po co powstały optymalizatory sprytniejsze niż zwykły spadek gradientu (pęd, Adam);
  • opisać uczciwą procedurę dobierania hiperparametrów — i wskazać, dlaczego nie wolno robić tego na zbiorze testowym.

🔁 Przypomnij sobie

Z Jednostki 11.2 masz wzór na korektę pojedynczej wagi: nowa waga = stara waga − η · gradient, gdzie η to krok uczenia. Nazwaliśmy go wtedy „długością kroku na zboczu" i odłożyliśmy pytanie, jak go dobrać. Z Jednostki 9.3 masz pojęcie hiperparametru oraz podział danych na zbiór treningowy, walidacyjny i testowy — i to on będzie tu narzędziem pracy. Z Jednostki 11.3 wiesz, że korektę wykonuje optymalizator; teraz zobaczymy, że optymalizatory bywają różne.

📘 Dwa rodzaje pokręteł

W sieci neuronowej są dwa zupełnie różne zestawy liczb do ustawienia — i mylenie ich to jedno z najczęstszych nieporozumień.

Parametry to wagi i obciążenia neuronów. Ich są miliony (a w dużych modelach językowych miliardy) i nikt ich nie ustawia ręcznie — właśnie po to jest cała maszyneria z Jednostek 11.1–11.3. Sieć dostraja je sama, krok po kroku, przykład po przykładzie.

Metafora, która to dobrze oddaje: gitarzystka szukająca brzmienia. Każde pokrętło efektu — gain, tone, time, feedback — zmienia dźwięk o włos; ustawienie ich wszystkich razem daje brzmienie, którego szukała. Nie ma wzoru „gain = 70%"; jest długie kręcenie i słuchanie, czy zabrzmiało lepiej.

Dostrajanie parametrów sztucznej sieci neuronowej można porównać do gitarzysty lub gitarzystki, którzy dążą do osiągnięcia idealnego brzmienia swojego instrumentu
Dostrajanie parametrów sztucznej sieci neuronowej można porównać do gitarzysty lub gitarzystki, którzy dążą do osiągnięcia idealnego brzmienia swojego instrumentu

Ta metafora ma jeszcze jedno, historyczne dno. Pierwsza samoucząca się sieć neuronowa, SNARC Minsky'ego z 1951 roku (Jednostka 8.3), miała w każdym ze swoich czterdziestu neuronów fizyczny potencjometr — pokręcając nim, zwiększało się albo zmniejszało wagę sygnału. To, co dziś jest liczbą w pamięci komputera i co koryguje optymalizator, było wtedy bolcem, który trzeba było przekręcić.

Hiperparametry to zupełnie inny zestaw: liczby, które ustawia człowiek przed treningiem i których sieć nie zmienia. Ich jest kilka albo kilkanaście: liczba warstw, liczba neuronów w warstwie, krok uczenia, wielkość wsadu, liczba epok, siła regularyzacji. Wracając do metafory: parametry to pokrętła, którymi kręci sieć; hiperparametry to decyzja, jak mocno wolno przekręcić pokrętło za jednym razem, ile razy posłuchać przed korektą i jak długo w ogóle próbować.

📐 DEFINICJA — hiperparametr: liczba (lub decyzja) ustalana przez człowieka przed treningiem i niezmieniana przez algorytm uczenia; sterują nie tym, co model wie, ale tym, jak przebiega jego uczenie. Przykłady: krok uczenia, wielkość wsadu, liczba epok, liczba warstw, siła regularyzacji.

Po ludzku: parametry to wiedza modelu, hiperparametry to warunki, w jakich tę wiedzę zdobywa.

📘 Krok uczenia: najważniejsze pokrętło

Krok uczenia (ang. learning rate, oznaczany zwykle η) mówi, jaką część wskazanej przez gradient poprawki faktycznie wykonujemy. Jest bezlitosny w obie strony.

Za duży krok. Zamiast zejść w dół doliny, przeskakujesz na drugie zbocze — i to wyżej, niż byłeś. Następny krok wyrzuca cię jeszcze wyżej. Strata nie maleje, ale rośnie, często wykładniczo, aż liczby przekraczają zakres reprezentacji i w miejscu straty pojawia się NaN (ang. not a number, „nie-liczba"). Trening jest wtedy nie do uratowania: wagi zawierają nieliczby, więc każda dalsza operacja też da nieliczbę. Trzeba zacząć od nowa z mniejszym krokiem.

Za mały krok. Uczenie działa, ale w tempie, które unieważnia projekt. Model, który przy dobrym kroku uczy się dwie godziny, przy kroku sto razy mniejszym potrzebuje ich dwustu — i może utknąć na płaskim fragmencie zbocza, z którego przy większym kroku by się wyrwał.

Typowe wartości to 0,1 do 0,0001, zależnie od optymalizatora i skali zadania. Praktyka jest prosta i brutalna: próbuje się kilku wartości i patrzy na krzywą straty. Jeśli strata skacze albo rośnie — krok za duży. Jeśli spada, ale ledwo widocznie — za mały. Jeśli spada szybko, a potem gładko zwalnia — jest dobrze.

W poważnych treningach kroku nie trzyma się stałego. Stosuje się harmonogram: na początku krok duży (żeby szybko zjechać z wysokiego zbocza), potem stopniowo malejący (żeby na dnie doliny nie przeskakiwać minimum, a delikatnie do niego dojść). Bywa też odwrotnie na samym starcie — rozgrzewka: pierwsze kilkaset kroków wykonuje się bardzo małym η, bo świeżo zainicjowana losowo sieć produkuje ogromne gradienty, które przy pełnym kroku rozsypałyby trening w pierwszej minucie.

📘 Ile przykładów przed jedną korektą: wsad

Pytanie brzmi: po ilu obejrzanych przykładach optymalizator powinien poprawić wagi? Są trzy odpowiedzi i wszystkie mają swoje imiona.

Cały zbiór naraz (spadek gradientu pełnowsadowy): policz stratę dla wszystkich 60 000 obrazków, uśrednij gradienty, zrób jeden krok. Kierunek jest wtedy najdokładniejszy, jaki się da — i to jedyna zaleta. Wady są zabójcze: jedna korekta wymaga przeliczenia całego zbioru, więc uczenie jest koszmarnie wolne, a przy zbiorach, które nie mieszczą się w pamięci, wręcz niewykonalne.

Jeden przykład na raz (spadek gradientu stochastyczny, ang. stochastic gradient descent, SGD): po każdym obrazku natychmiastowa korekta. Korekt jest dużo, więc postęp bywa szybki, ale kierunek każdej z nich jest „hałaśliwy" — wyznaczony na podstawie jednego, może nietypowego przykładu. Ścieżka schodzenia przypomina wtedy nie spacer w dół, a zbieganie zygzakiem.

Kilkadziesiąt naraz (wsad, ang. mini-batch) — i to jest odpowiedź stosowana praktycznie zawsze. Bierzemy porcję, na przykład 32, 64 albo 256 przykładów, liczymy dla niej średni gradient i wykonujemy jeden krok. Trzy powody, dla których to wygrywa:

  1. Kompromis dokładność–tempo: średnia z 64 przykładów wskazuje kierunek znacznie stabilniej niż jeden przykład, a kosztuje ułamek tego, co cały zbiór.
  2. Sprzęt: karta graficzna liczy tysiące działań równolegle (Jednostka 13.1). Podanie jej 64 obrazków naraz to niemal ten sam czas co jednego — pojedynczy przykład po prostu marnuje sprzęt.
  3. Szum bywa pożyteczny: drobna losowość kierunku pomaga wyrwać się z płaskich miejsc i słabych minimów lokalnych (Jednostka 11.2). Trening idealnie „gładki" wcale nie jest najlepszy.

Ograniczeniem z góry jest pamięć karty graficznej: wszystkie przykłady wsadu muszą się w niej zmieścić razem z aktywacjami wszystkich warstw. Dlatego przy dużych modelach wsad bywa mały nie z wyboru, a z konieczności.

Epoka to jedno przejście przez cały zbiór treningowy. Przy 60 000 obrazków i wsadzie 64 jedna epoka to około 938 korekt wag — i zwykle trenuje się od kilku do kilkuset epok, za każdym razem w innej, losowej kolejności przykładów. Ile dokładnie? Do momentu, w którym błąd na zbiorze walidacyjnym przestaje spadać. To dokładnie wczesne zatrzymanie z Jednostki 9.3.

💭 Pomyśl

💭 Pomyśl: Trenujesz sieć i widzisz w logach, że strata w kolejnych krokach wynosi: 2,31 → 2,29 → 2,30 → 2,28 → 2,31 → 2,29. Po pięciu epokach nadal krąży wokół 2,3 i nie chce zejść niżej. Jakie dwie różne hipotezy warto sprawdzić w pierwszej kolejności — i jak każdą z nich rozpoznać?

Sprawdź odpowiedź

Hipoteza pierwsza: krok uczenia za duży. Strata „drga" wokół jednej wartości, bo każdy krok przeskakuje minimum i ląduje po drugiej stronie doliny — model nie potrafi się zbliżyć do dna. Rozpoznanie: zmniejsz krok dziesięciokrotnie; jeśli strata zacznie spadać, to była ta przyczyna. (Warto zauważyć, że 2,3 to podejrzana liczba dla dziesięciu klas: ln 10 ≈ 2,30 to entropia krzyżowa modelu zgadującego całkowicie na oślep — czyli sieć na razie nie nauczyła się niczego.)

Hipoteza druga: sygnał uczący nie dochodzi. Może gradient zanika po drodze (Jednostka 11.5), może w kodzie jest błąd — na przykład etykiety nie są przypisane do właściwych przykładów, dane wejściowe nie zostały znormalizowane albo wagi zamarły przy złej inicjalizacji. Rozpoznanie: klasyczny test to spróbować przeuczyć model na dwudziestu przykładach. Sprawna sieć powinna zapamiętać dwadzieścia obrazków do zera straty w kilkadziesiąt kroków. Jeśli tego nie potrafi, problemem nie są hiperparametry, lecz sam trening — i szukanie należy zacząć od danych i kodu, nie od kręcenia pokrętłami.

📘 Optymalizatory sprytniejsze niż zwykły spadek

Zwykły spadek gradientu traktuje każdą wagę jednakowo: ten sam krok dla wszystkich, przy każdej korekcie, bez pamięci o tym, co było wcześniej. Dwa ulepszenia okazały się na tyle skuteczne, że dziś nikt nie trenuje bez nich.

Pęd (ang. momentum): do bieżącego kroku dodaje się ułamek kroku poprzedniego, tak jak kula tocząca się w dół zbocza zachowuje rozpęd. Efekt: w kierunku, w którym gradient konsekwentnie wskazuje to samo, ruch przyspiesza; kierunki, w których gradient co krok zmienia znak, wzajemnie się wygaszają. Zygzakowanie maleje, zbieżność przyspiesza.

Adam (2015, od adaptive moment estimation): utrzymuje osobny, adaptowany krok dla każdego parametru — na podstawie historii gradientów tego konkretnego parametru. Wagi, których gradient jest stale mały, dostają większy krok; wagi rozhuśtane — mniejszy. Dzięki temu Adam działa przyzwoicie przy szerokim zakresie ustawień początkowych i jest domyślnym wyborem w większości bibliotek. To on zwykle stoi za słowem „optymalizator" w Jednostce 11.3.

Warto trzymać w głowie, że żaden z tych mechanizmów nie zmienia ani funkcji straty, ani sposobu liczenia gradientów. Cel i informacja o kierunku pozostają te same; inaczej wygląda tylko sposób poruszania się.

📘 Jak dobiera się hiperparametry (i czego nie wolno robić)

Nie istnieje wzór, z którego wyliczysz krok uczenia. Hiperparametry dobiera się eksperymentalnie: uruchamiasz kilka treningów z różnymi ustawieniami i porównujesz wyniki. Robi się to na kilka sposobów — od przeszukiwania siatki wartości, przez losowanie zestawów (co przy wielu hiperparametrach bywa skuteczniejsze niż siatka), po metody automatyczne.

Kluczowa jest zasada, na czym porównujesz: wyłącznie na zbiorze walidacyjnym. Zbiór testowy zostaje nietknięty do samego końca. Jeśli wybierzesz krok uczenia „bo na teście wyszło najlepiej", właśnie przeciekła do modelu informacja z testu — i wynik testowy przestał być uczciwą oceną tego, jak model poradzi sobie z nowymi danymi. To ten sam błąd, o którym mówi Jednostka 9.3, tylko popełniony jedno piętro wyżej: nie na parametrach, a na hiperparametrach.

⚠️ Uwaga, pułapka

Najczęstszy mit brzmi: „więcej epok = lepszy model". Nie. Po pewnym momencie dalszy trening już nie odkrywa reguły, a dopasowuje model do przypadkowych szczegółów zbioru treningowego — strata treningowa dalej maleje, a błąd na walidacji rośnie. To przeuczenie (Jednostka 9.3) i tylko krzywa walidacyjna mówi, kiedy przestać.

Drugi mit: „sieć sama sobie dobierze krok uczenia". Nie dobierze. Sieć uczy się wag; krok uczenia jest częścią procedury, która te wagi zmienia. Adam adaptuje krok dla poszczególnych parametrów, ale robi to wokół wartości bazowej, którą wciąż podaje człowiek — i przy złym rzędzie wielkości tej wartości też nic nie uratuje.

Trzeci, subtelniejszy: „jak coś nie działa, kręćmy pokrętłami". Zanim zaczniesz stroić hiperparametry, sprawdź dane i kod. Zamienione etykiety, brak normalizacji wejść albo przeciek między zbiorami dają objawy podobne do złych hiperparametrów, a żadne kręcenie tego nie naprawi.

🌍 Powiązania

Hiperparametry z Jednostki 9.3 dostają tu konkretną treść — teraz wiesz, co robi każde pokrętło i jak rozpoznać, że jest przekręcone. Wielkość wsadu wiąże trening z fizycznym sprzętem (pamięć i równoległość karty graficznej, Jednostka 13.1), a to jeden z powodów, dla których uczenie głębokie musiało czekać na odpowiednie procesory graficzne. Regularyzacja, o której tu tylko wspomnieliśmy jako o jednym z pokręteł, to temat następnej jednostki. A gdy dojdziemy do dużych modeli językowych (Część V), zobaczysz te same trzy pokrętła w skali, w której jeden trening pochłania miesiące pracy tysięcy kart graficznych — i w której pomyłka w kroku uczenia kosztuje miliony.

📐 Definicje tej lekcji

  • Hiperparametr — liczba ustalana przez człowieka przed treningiem, niezmieniana przez algorytm uczenia (krok uczenia, wielkość wsadu, liczba epok, liczba warstw, siła regularyzacji).
  • Krok uczenia (η, learning rate) — jaką część poprawki wskazanej przez gradient faktycznie wykonujemy w jednej korekcie.
  • Harmonogram kroku uczenia — zaplanowana zmiana η w trakcie treningu (zwykle malejąca, często z rozgrzewką na starcie).
  • Wsad (mini-batch) — porcja przykładów, dla której liczy się średni gradient przed jedną korektą wag.
  • Spadek gradientu stochastyczny (SGD) — wariant, w którym korekta następuje po pojedynczym przykładzie (albo po małym wsadzie).
  • Epoka — jedno pełne przejście przez cały zbiór treningowy.
  • Pęd (momentum) — dodanie do bieżącego kroku ułamka kroku poprzedniego; wygasza zygzakowanie.
  • Adam — optymalizator utrzymujący osobny, adaptowany krok dla każdego parametru; dziś domyślny wybór.

📌 Najważniejsze w pigułce

  • Parametry (wagi, obciążenia) uczy się sieć; hiperparametry ustawia człowiek przed treningiem.
  • Krok uczenia jest najważniejszym pokrętłem: za duży rozsypuje trening (strata rośnie, potem NaN), za mały czyni go bezsensownie wolnym.
  • Kroku zwykle nie trzyma się stałego: rozgrzewka na starcie, potem malejący harmonogram.
  • Prawie nikt nie liczy gradientu z całego zbioru; standardem jest wsad kilkudziesięciu przykładów — kompromis między dokładnością kierunku, tempem i możliwościami karty graficznej.
  • Epoka = jedno przejście przez zbiór; przy 60 000 przykładów i wsadzie 64 to ok. 938 korekt wag.
  • Pęd i Adam zmieniają sposób poruszania się, nie cel ani gradienty.
  • Hiperparametry dobiera się eksperymentalnie i porównuje na walidacji — nigdy na zbiorze testowym.
  • Strata krążąca wokół ln(liczba klas) znaczy, że model nie nauczył się niczego; wtedy szukaj błędu w danych i kodzie, nie kręć pokrętłami.

🎒 Zadania

Zadanie 11.4.1. Zbiór treningowy ma 50 000 przykładów, wsad ustawiono na 100, trening ma trwać 30 epok. Policz: (a) ile korekt wag przypada na jedną epokę, (b) ile korekt wykona się w całym treningu, (c) ile razy każdy pojedynczy przykład zostanie obejrzany przez sieć.

Pokaż rozwiązanie

(a) 50 000 : 100 = 500 korekt na epokę. (b) 500 · 30 = 15 000 korekt w całym treningu. (c) Każdy przykład jest obejrzany raz na epokę, więc 30 razy — za każdym razem przez sieć o innych już wagach, w innym losowym towarzystwie wsadu i z innym wnioskiem dla optymalizatora. Warto zauważyć asymetrię tych liczb: obejrzeń jest 1,5 miliona (30 · 50 000), a korekt tylko 15 000 — bo jedna korekta powstaje ze średniej ze stu przykładów.

Zadanie 11.4.2. Dwie osoby trenują tę samą sieć. U pierwszej strata spada: 2,30 → 1,84 → 1,51 → 1,29 → 1,15. U drugiej: 2,30 → 4,71 → 18,3 → 512 → NaN. Zdiagnozuj, co ustawiła źle druga osoba, wyjaśnij mechanizm powstania NaN i wskaż, dlaczego treningu drugiej osoby nie da się „uratować" zmniejszeniem kroku w połowie.

Pokaż rozwiązanie

Druga osoba ustawiła za duży krok uczenia. Mechanizm: każdy krok przerzuca punkt na przeciwległe zbocze doliny, ale dalej od dna niż punkt wyjścia — więc gradient w nowym miejscu jest większy, następny krok jeszcze dłuższy i tak dalej. Strata rośnie wykładniczo (widać to w ciągu 4,71 → 18,3 → 512), aż wartości przekroczą zakres liczb zmiennoprzecinkowych: pojawia się nieskończoność, a operacje w rodzaju „nieskończoność minus nieskończoność" dają NaN.

Dlaczego nie da się uratować: NaN zaraża. Gdy choć jedna waga stanie się nieliczbą, każde następne mnożenie i dodawanie z jej udziałem też da nieliczbę — więc cała sieć jest już nieodwracalnie zepsuta, niezależnie od tego, co potem zrobisz z krokiem. Trzeba zacząć trening od nowa (od świeżej inicjalizacji wag) z mniejszym η, ewentualnie dodając rozgrzewkę albo obcinanie gradientów (Jednostka 11.5).

Zadanie 11.4.3. Kolega chwali się: „przetestowałem 40 kombinacji kroku uczenia i liczby warstw, wybrałem tę, która dała najlepszy wynik na zbiorze testowym — 96,4%. Tyle właśnie zgłaszam jako trafność modelu". Wyjaśnij, co jest z tym nie tak, i opisz, jak powinien był postąpić.

Pokaż rozwiązanie

Kolega użył zbioru testowego jako zbioru walidacyjnego i przez to zniszczył jego jedyną funkcję. Zbiór testowy jest uczciwą oceną tylko wtedy, gdy model nie miał z nim żadnego kontaktu — ani przez wagi, ani przez decyzje człowieka. Tutaj testu użyto 40 razy do wyboru najlepszego ustawienia, więc wynik 96,4% jest zawyżony: opisuje między innymi to, jak dobrze wybrane ustawienie pasuje do tych konkretnych przykładów testowych. Na nowych danych model prawdopodobnie wypadnie gorzej. Zjawisko ma nawet swoją nazwę — przeuczenie do zbioru testowego przez wielokrotny wybór na nim.

Poprawna procedura: podzielić dane na trzy części, wszystkie 40 kombinacji porównać na walidacji, wybrać najlepszą, ewentualnie dotrenować model na połączonym zbiorze treningowym i walidacyjnym, a zbiór testowy uruchomić raz, na końcu, wyłącznie po to, by podać liczbę do raportu. Jeśli danych jest mało i szkoda ich na osobną walidację, stosuje się walidację krzyżową — ale nadal na danych innych niż testowe.

🔍 Sprawdź, czy umiesz

  • [ ] Odróżnić parametry od hiperparametrów i podać po dwa przykłady każdego.
  • [ ] Opisać objawy zbyt dużego i zbyt małego kroku uczenia na podstawie krzywej straty.
  • [ ] Podać trzy powody, dla których trenuje się wsadami, a nie na całym zbiorze ani po jednym przykładzie.
  • [ ] Policzyć liczbę korekt wag na epokę i w całym treningu.
  • [ ] Wyjaśnić, co dodaje pęd, a co Adam — i czego oba nie zmieniają.
  • [ ] Wskazać, dlaczego hiperparametrów nie wolno dobierać na zbiorze testowym.

Ucz się tej jednostki z asystentem