ML Atlas

04 · Ocena · 4 min czytania · Interaktywne · aktualizacja

Co pokazuje krzywa uczenia (learning curve) i jak z niej odczytać, czy pomogą nowe dane?

W skrócie

Krzywa uczenia pokazuje wynik treningowy i walidacyjny modelu w zależności od liczby przykładów. Mówi, czy więcej danych pomoże, czy model jest za prosty.

Co to jest

Krzywa uczenia (learning curve) to wykres wyniku modelu na zbiorze treningowym i walidacyjnym w funkcji liczby przykładów treningowych. Trenuje się ten sam model na coraz większych fragmentach danych — np. 5%, 10%, 20%… 100% — i dla każdego rozmiaru zapisuje oba wyniki. Kształt i odległość dwóch krzywych odpowiadają na jedno z najdroższych pytań w projekcie: czy warto zbierać więcej danych?

Uwaga na terminologię: w uczeniu głębokim „krzywą uczenia” nazywa się też wykres straty w funkcji epok. To inne narzędzie — pokazuje przebieg optymalizacji, a nie wpływ liczby danych. To hasło dotyczy wersji klasycznej, z liczbą przykładów na osi poziomej.

Mechanizm — dlaczego tak działa

Przy kilku przykładach model łatwo dopasowuje je wszystkie, więc wynik treningowy jest wysoki, a walidacyjny niski: model nauczył się przypadkowości małej próbki. Gdy przykładów przybywa, coraz trudniej zapamiętać każdy z nich — wynik treningowy zwykle spada. Jednocześnie szum się uśrednia, a model widzi coraz więcej prawdziwej różnorodności — wynik walidacyjny rośnie. Obie krzywe zbliżają się do siebie i dążą do wspólnej granicy, wyznaczonej przez pojemność modelu i szum w danych.

Z tego wynikają dwa typowe obrazy. Wysoka wariancja (przeuczenie): duża luka między treningiem a walidacją, a krzywa walidacyjna wciąż wyraźnie rośnie na prawym końcu. Więcej danych prawdopodobnie pomoże, podobnie jak regularyzacja. Wysokie obciążenie (niedouczenie): obie krzywe szybko się spotykają na niskim poziomie i spłaszczają. Model nie umie wykorzystać więcej danych — zamiast nich potrzebna jest większa pojemność, lepsze cechy albo inny algorytm.

Kształt krzywej walidacyjnej często przypomina prawo potęgowe: kolejne podwojenie danych daje coraz mniejszy przyrost. Pozwala to ostrożnie ekstrapolować, ile dałoby np. dwa razy więcej przykładów — ostrożnie, bo przy małej liczbie punktów ekstrapolacja jest niepewna, a zbieranie danych z innego rozkładu może zmienić obraz całkowicie.

Krzywe uczenia pokazują też, że ranking modeli zależy od rozmiaru danych. Prosty model z silnymi założeniami (np. naiwny Bayes, regresja logistyczna) bywa najlepszy przy małej próbie, a model elastyczny wyprzedza go dopiero po przekroczeniu pewnej liczby przykładów. Perlich, Provost i Simonoff pokazali to systematycznie dla drzew i regresji logistycznej. Wniosek „model A jest lepszy od B” bez podania liczby danych bywa więc niepełny.

Na przykładzie

Na zbiorze Digits (1797 cyfr 8 × 8) narysowałem krzywe uczenia z 5-krotną warstwową walidacją krzyżową (learning_curve, StratifiedKFold(5, shuffle=True, random_state=0)), dla rozmiarów treningu od 71 do 1437 przykładów. Regresja logistyczna ze standaryzacją ma wynik treningowy praktycznie 100% przy każdym rozmiarze, a walidacyjny rośnie z 74,8% (71 przykładów) przez 93,8% (574) do 96,9% (1437). Luka maleje, ale krzywa walidacyjna wciąż rośnie — klasyczny obraz wariancji: więcej danych powinno jeszcze pomóc.

Naiwny klasyfikator bayesowski (GaussianNB) zachowuje się inaczej. Przy 71 przykładach ma 99,7% na treningu i 50,8% na walidacji; przy 1437 — odpowiednio 86,0% i 85,1%. Krzywe się zetknęły, a walidacyjna od około 1150 przykładów przestała rosnąć (86,0% wobec 85,1% na końcu, różnica w granicach szumu). To obciążenie: założenie niezależności pikseli jest zbyt grube i dodatkowe dane go nie naprawią. Dla porównania SVM z jądrem RBF (gamma=0.001) dochodzi do 99,0% walidacji.

Ta ilustracja działa w przeglądarce z włączonym JavaScriptem: krzywe uczenia regresji logistycznej na cyfrach 8×8: przy 50 obrazach trening 100%, a walidacja 82%; przy 1438 walidacja 95,8%, a luka maleje do 2,2 pkt proc. — więcej danych wciąż trochę pomaga.

Dane: Digits (ręcznie pisane cyfry 8×8)

W praktyce

  • learning_curve(model, X, y, train_sizes=np.linspace(0.1, 1.0, 8), cv=5) zwraca rozmiary oraz wyniki treningowe i walidacyjne dla każdego foldu; wykres: LearningCurveDisplay.from_estimator (scikit-learn 1.2+).
  • Rysuj średnią i pasmo odchylenia z foldów — przy małych rozmiarach wyniki bardzo skaczą.
  • Używaj warstwowej CV i shuffle=True, by małe podzbiory zawierały wszystkie klasy.
  • Do oceny opłacalności zbierania danych zwróć uwagę na nachylenie walidacji przy ostatnich punktach; najlepiej na osi logarytmicznej liczby przykładów.
  • W uczeniu głębokim analogiczny eksperyment robi się, trenując sieć na 10%, 25%, 50% i 100% danych, z tym samym budżetem strojenia.
  • Typowy błąd: mylenie krzywej uczenia z krzywą straty w epokach albo z krzywą walidacyjną (oś pozioma = hiperparametr).

Najczęstsze pytania

Czym różni się krzywa uczenia od krzywej walidacyjnej?
Krzywa uczenia ma na osi poziomej liczbę przykładów i mówi, czy pomogą nowe dane. Krzywa walidacyjna ma na osi poziomej wartość hiperparametru (np. głębokość drzewa) i mówi, jaka złożoność modelu jest najlepsza przy obecnych danych.
Co, jeśli wynik walidacyjny jest wyższy niż treningowy?
Zdarza się przy silnej regularyzacji, dropoucie (aktywnym tylko w treningu), augmentacji utrudniającej dane treningowe albo przy przypadkowo łatwym zbiorze walidacyjnym. Jeśli różnica jest duża i stała, sprawdź, czy nie ma przecieku lub duplikatów między zbiorami.
Ile punktów potrzeba na krzywej?
Zwykle 5–10 rozmiarów rozłożonych logarytmicznie wystarcza. Ważniejsze od liczby punktów jest powtórzenie każdego pomiaru na kilku foldach, by odróżnić trend od szumu.

Źródła

  • Perlich C., Provost F., Simonoff J. S. (2003). Tree Induction vs. Logistic Regression: A Learning-Curve Analysis. Journal of Machine Learning Research, 4.
  • Banko M., Brill E. (2001). Scaling to Very Very Large Corpora for Natural Language Disambiguation. Proceedings of ACL 2001.
  • Géron A. „Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow”, 3rd ed., O’Reilly 2022, rozdz. 4 (Training Models — Learning Curves).
  • Dokumentacja scikit-learn: Validation curves and learning curves — https://scikit-learn.org/stable/modules/learning_curve.html

Zobacz też