Uczenie maszynowe od podstaw · Lekcja 01 · Część 1

Twój pierwszy neuron — ręcznie

Dlaczego model się uczy? Policz to ręcznie na pięciu przykładach, dwóch regulowanych liczbach i kolejnych małych poprawkach.

Zanim zaczniesz

Wystarczą arytmetyka i długopis. Nie zakładamy znajomości uczenia maszynowego, rachunku różniczkowego ani programowania: kod pojawi się w części 2. Zaplanuj około godziny nauki. To szacunek: zatrzymuj się, żeby liczyć, zamiast tylko czytać, nawet jeśli zajmie to dłużej.

Po tej części będziesz umieć obliczyć predykcję i jej stratę, wyprowadzić gradient, wykonać jedną aktualizację i rozpoznać zbyt duży współczynnik uczenia.

1. Teoria — co oznacza „uczenie”?

Od stałej reguły do reguły z regulacją

W zwykłym programowaniu zapisujesz regułę i podajesz jej dane wejściowe. W uczeniu maszynowym wybierasz rodzinę reguł, a przykłady wskazują najlepszą z nich. Model to obliczenie, które przekształca wejście w wyjście. Trening dostraja liczby modelu tak, aby popełniał mniej błędów na przykładach.

Każda próbka łączy wejście (godziny nauki) ze znaną wartością docelową (punkty z egzaminu). Uczenie z par wejście–cel to uczenie nadzorowane, a przewidywanie liczby to regresja. Nasze pięć par to (1, 20), (2, 40), (3, 60), (4, 80) i (5, 100). Są wymyślone i idealnie regularne, więc każde obliczenie da się sprawdzić ręcznie.

Parametry, waga, bias i predykcja

Wyobraź sobie prostą przechodzącą przez pięć punktów. Sterują nią dwa pokrętła: nachylenie i przesunięcie w pionie. Parametr to liczba wewnątrz modelu, którą dostraja trening. Waga ww określa, o ile zmienia się wyjście, gdy wejście rośnie o jeden. Bias, czyli wyraz wolny bb, dodaje takie samo przesunięcie do każdego wyjścia.

Predykcja to odpowiedź modelu. Wejście oznaczamy xx, cel yy, a predykcję y^\hat{y} („y z daszkiem”). Nie myl ich: prognoza nie jest wartością docelową.

y^=wx+b\hat{y} = wx + b

Dla w=10w = 10 punktów/godzinę i b=5b = 5 punktów trzy godziny dają 10⋅3+5=3510 \cdot 3 + 5 = 35 punktów. Zwiększenie ww o 1 dodaje do tej predykcji 3 punkty, a zwiększenie bb o 1 — jeden punkt. Wpływ wagi rośnie razem z wejściem.

Ten model to regresja liniowa. Nazywamy go „neuronem”, bo neuron w sieci neuronowej liczy to samo — ważone wejście plus bias — zanim przepuści wynik przez funkcję nieliniową. Tę funkcję dodamy w jednej z kolejnych lekcji.

Strata: jedna ocena pięciu pomyłek

Błąd to predykcja minus cel, więc ujemny błąd oznacza zbyt niską prognozę. Średnia błędów ze znakiem ukrywa pomyłki: −10 i +10 się znoszą. Dlatego podnosimy każdy błąd do kwadratu i uśredniamy kwadraty. Wynik to strata (loss): jedna liczba mówiąca, jak źle model pasuje do danych. Im mniejsza, tym lepiej.

Ta funkcja straty to błąd średniokwadratowy (MSE). Kwadraty nie pozwalają błędom się znosić i zwiększają wagę dużych pomyłek: błąd 20 wnosi cztery razy więcej niż błąd 10. Jednostką MSE są punkty do kwadratu, a nie punkty ani procenty.

L(w,b)=1n∑i=1n(wxi+b−yi)2L(w, b) = \frac{1}{n} \sum_{i=1}^{n} \left( w x_i + b - y_i \right)^2

LL to strata, nn liczba próbek (5), a ii numeruje próbki. ∑\sum przypomina, że dane są stałe, a wynik zmieniają tylko parametry.

Pochodna: jak bardzo strata reaguje na zmianę?

Obróć lekko jedno pokrętło. Czy strata rośnie, czy maleje, i jak szybko? Odpowiada na to pochodna: tempo zmian funkcji w danym punkcie. Dla funkcji f(t)f(t) iloraz

f(t+h)−f(t)h\frac{f(t + h) - f(t)}{h}

to średnia zmiana na małym kroku hh. Pochodna to wartość, do której ten iloraz dąży, gdy hh maleje do zera.

Przykład: f(t)=t2f(t) = t^2. Przy t=3t = 3 przejście do t=3,01t = 3{,}01 zmienia ff z 9 na 9,0601. Iloraz wynosi 6,01, a mniejsze kroki przybliżają go do 6. Algebra pokazuje dlaczego:

(t+h)2−t2h=2t+h  →  h→0    2t\frac{(t + h)^2 - t^2}{h} = 2t + h \;\xrightarrow{\;h \to 0\;}\; 2t

Pochodna t2t^2 wynosi więc 2t2t.

Nasza strata zależy od dwóch liczb: ww i bb. Pochodna cząstkowa zmienia jedną z nich, a drugą trzyma na stałym poziomie. Zapisujemy je jako ∂L∂w\frac{\partial L}{\partial w} i ∂L∂b\frac{\partial L}{\partial b} („pochodna cząstkowa L względem w”, „względem b”). Ujemna ∂L∂w\frac{\partial L}{\partial w} oznacza, że małe zwiększenie ww zmniejsza stratę. Nie oznacza, że sama strata jest ujemna.

Gradient i spadek gradientowy

Gradient zbiera wszystkie pochodne cząstkowe w jeden wektor:

∇L=(∂L∂w,  ∂L∂b)\nabla L = \left( \frac{\partial L}{\partial w}, \; \frac{\partial L}{\partial b} \right)

Wyobraź sobie stratę jako wysokość terenu, którego współrzędnymi na mapie są ww i bb. Gradient wskazuje pod górę, a jego przeciwieństwo — najbardziej stromo w dół.

Spadek gradientowy (gradient descent) to algorytm, który z niego korzysta: oblicz gradient, zrób mały krok w przeciwną stronę, powtórz. Współczynnik uczenia (learning rate) η\eta („eta”) ustala długość kroku. To hiperparametr: ustawienie, które wybierasz, a nie coś, czego model się uczy.

wnew=w−η ∂L∂wbnew=b−η ∂L∂b\begin{aligned} w_{\text{new}} &= w - \eta \, \frac{\partial L}{\partial w} \\[6pt] b_{\text{new}} &= b - \eta \, \frac{\partial L}{\partial b} \end{aligned}

Oblicz obie pochodne dla tych samych starych wartości, zanim zmienisz którykolwiek parametr. Gradient jest lokalną wskazówką, a nie obietnicą dotyczącą dalekiego skoku. Zbyt duży współczynnik przeskakuje dolinę i strata rośnie; zbyt mały spowalnia postęp; zero niczego nie zmienia.

Każda aktualizacja w tej lekcji korzysta ze wszystkich pięciu próbek. Jedno pełne przejście przez dane treningowe to epoka, więc tutaj jedna aktualizacja to jedna epoka.

Obliczanie gradientu: reguła łańcuchowa

Strata powstaje etapami: parametry dają predykcje, predykcje dają błędy, a błędy podnosimy do kwadratu i uśredniamy. Aby ustalić, jak parametr wpływa na stratę, mnożymy tempa zmian wzdłuż tego łańcucha. To reguła łańcuchowa.

Dla jednej próbki nazwijmy błąd e=wx+b−ye = wx + b - y. Kwadrat e2e^2 zmienia się względem ee w tempie 2e2e. Błąd zmienia się względem ww w tempie xx, a względem bb w tempie 1. Mnożąc wzdłuż łańcucha:

∂(e2)∂w=2e⋅∂e∂w=2ex∂(e2)∂b=2e⋅∂e∂b=2e\begin{aligned} \frac{\partial (e^2)}{\partial w} &= 2e \cdot \frac{\partial e}{\partial w} = 2ex \\[6pt] \frac{\partial (e^2)}{\partial b} &= 2e \cdot \frac{\partial e}{\partial b} = 2e \end{aligned}

Każda próbka wnosi więc 2ex2ex do pochodnej względem wagi i 2e2e do pochodnej względem biasu. Uśrednienie pięciu próbek daje:

∂L∂w=25∑i=15eixi∂L∂b=25∑i=15ei\begin{aligned} \frac{\partial L}{\partial w} &= \frac{2}{5} \sum_{i=1}^{5} e_i x_i \\[6pt] \frac{\partial L}{\partial b} &= \frac{2}{5} \sum_{i=1}^{5} e_i \end{aligned}

W części 2 to obliczenie wykona za Ciebie PyTorch. Jeśli najpierw zrobisz je ręcznie, będziesz dokładnie wiedzieć, co liczy.

2. Przykład obliczeniowy — pierwsza poprawka

Zacznij od w=0w = 0 i b=0b = 0, więc wszystkie predykcje są zerowe. Przed obliczeniami przewidź znaki obu pochodnych cząstkowych: skoro wszystkie cele są dodatnie, czy zwiększenie każdego pokrętła pomoże?

Wszystkie pięć próbek przy w=b=0w = b = 0
xx (godziny)yy (punkty)y^\hat{y}e=y^−ye = \hat{y} - ye2e^2exex
1200−20400−20
2400−401600−80
3600−603600−180
4800−806400−320
51000−10010000−500

Suma kwadratów błędów to 22000, błędy sumują się do −300, a iloczyny błędu i wejścia do −1100. Zatem:

L=220005=4400∂L∂w=2⋅(−1100)5=−440∂L∂b=2⋅(−300)5=−120\begin{aligned} L &= \frac{22000}{5} = 4400 \\[6pt] \frac{\partial L}{\partial w} &= \frac{2 \cdot (-1100)}{5} = -440 \\[6pt] \frac{\partial L}{\partial b} &= \frac{2 \cdot (-300)}{5} = -120 \end{aligned}

Dla η=0,001\eta = 0{,}001:

wnew=0−0,001⋅(−440)=0,44bnew=0−0,001⋅(−120)=0,12\begin{aligned} w_{\text{new}} &= 0 - 0{,}001 \cdot (-440) = 0{,}44 \\[6pt] b_{\text{new}} &= 0 - 0{,}001 \cdot (-120) = 0{,}12 \end{aligned}

Odjęcie liczby ujemnej zwiększa parametr. Poprawki są różne, bo wejścia mnożą wpływ wagi.

Nowe predykcje to [0.56, 1.00, 1.44, 1.88, 2.32], a nowe błędy [−19.44, −39.00, −58.56, −78.12, −97.68]. Suma ich kwadratów wynosi 20972,304, co daje

MSE=20972,3045=4194,4608\text{MSE} = \frac{20972{,}304}{5} = 4194{,}4608

Strata spadła, ale niewiele: jedna poprawka to jeszcze nie trening. W listach liczb i w kodzie używamy kropki dziesiętnej.

Sprawdź pochodną bez wzoru

Utrzymaj b=0b = 0 i zwiększ ww z 0 do 0,001. Strata wyniesie 4399,560011, więc iloraz

4399,560011−44000,001=−439,989\frac{4399{,}560011 - 4400}{0{,}001} = -439{,}989

jest bliski −440. Nie jest dokładny, bo krok nie jest nieskończenie mały.

Dlaczego bias rośnie, skoro idealne dopasowanie ma b=0b = 0?

Na początku oba parametry pomagają podnieść predykcje, więc oba rosną. Później, gdy nachylenie jest już prawie dobre, dodatni bias zawyża wyniki dla małych wejść i musi znów maleć. Idealne dopasowanie to w=20w = 20, b=0b = 0, ale skończona liczba małych kroków nie musi do niego dotrzeć. Powierzchnia straty to długa, pochylona dolina: stroma w poprzek, prawie płaska wzdłuż.

3. Interaktywna wizualizacja — porównaj poprawki

Poniższa symulacja liczy te same równania w JavaScript. Zanim przesuniesz suwaki, przewidź, co się stanie przy współczynnikach 0, 0,001, 0,05 i 0,1. Każda zmiana zaczyna od w=b=0w = b = 0; suwak kroku pokazuje model po wskazanej liczbie aktualizacji.

Oś pozioma: zakończone aktualizacje (0–100). Oś pionowa: MSE w punktach², skala liniowa. Górna granica osi pionowej dostosowuje się do przebiegu; porównuj liczby oraz kształt.

Wynik liczbowy znajduje się pod wykresem.

Po aktualizacji 1 przy η = 0,001: w = 0,44, b = 0,12, MSE = 4194,4608.

Dopasuj prostą do pięciu punktów

Najpierw wybierz tryb ręczny: ustaw w = 10 i b = 5. Przewidź wpływ zwiększenia tylko biasu o 5, a potem przywróć b = 5 i zwiększ tylko wagę o 5. Co zmienia nachylenie, a co przesunięcie? Następnie wybierz trening i przejdź od aktualizacji 0 do 1, a potem do 100. Połącz ruch prostej ze spadkiem straty.

Parametry ręczne (nie zmieniają treningu)

Koła oznaczają pięć celów treningowych; ciągła linia to ŷ = wx + b. Stałe osie: 0–6 godzin i −60–240 punktów. Fragmenty prostej poza tym zakresem nie są rysowane; wartości pozostają dostępne w opisie i tabeli. Zmiana skali nie ukrywa więc rozbieżności.

Punkty treningowe i prosta modelu 0123456Godziny nauki -600100200240 Punkty

Model po aktualizacji 1: w = 0,44, b = 0,12; MSE = 4194,4608 punktów². Predykcje dla godzin 1–5: 0,56; 1; 1,44; 1,88; 2,32.

Cele i predykcje modelu z wykresu
GodzinyCel (punkty)Predykcja (punkty)
1200.56
2401.00
3601.44
4801.88
51002.32

Dla współczynnika 0 strata pozostaje równa 4400. Dla 0,001 maleje powoli; dla 0,1 eksploduje w ciągu 100 kroków. Patrz na liczby, nie tylko na krzywą: gdy przebieg się rozbiega, skala pionowa rośnie tak bardzo, że początkowe straty wyglądają na zerowe. Te progi dotyczą tylko tego zbioru danych; nie istnieje uniwersalnie dobry współczynnik uczenia.

4. Ćwiczenia

Zapisz przewidywanie przed obliczeniami, a arytmetykę sprawdź w symulacji.

  1. Zacznij od w=10w = 10, b=5b = 5. Oblicz pięć predykcji, MSE, obie pochodne cząstkowe i jedną aktualizację dla η=0,001\eta = 0{,}001. Sprawdź MSE w trybie ręcznym wykresu.
  2. Pomnóż wszystkie cele przez dwa. Przed obliczeniami przewidź, jak zmienią się początkowa strata i gradienty przy w=b=0w = b = 0. Wyjaśnij, dlaczego strata i jej pochodne skalują się inaczej.
  3. W symulacji znajdź w przybliżeniu największy współczynnik, przy którym strata po 100 aktualizacjach wciąż maleje. Co robi prosta na wykresie tuż powyżej tej wartości?
  4. Zmień cele na [25, 45, 65, 85, 105]. Jakie ww i bb dopasowują je dokładnie? Dlaczego model bez biasu nigdy by ich nie dopasował?
Wskazówki

Użyj e=wx+b−ye = wx + b - y i osobno zsumuj e2e^2, exex i ee. Przy w=b=0w = b = 0 podwojenie celów podwaja każdy błąd; zastanów się, co robi kwadrat. W ćwiczeniu 3 sprawdzaj współczynniki między 0,05 a 0,1. Nowe cele z ćwiczenia 4 spełniają wzór y=20x+5y = 20x + 5.

5. Sprawdzenie rozumienia — dlaczego zachodzi uczenie?

Odpowiedz bez przewijania w górę. Poprzyj każdą odpowiedź obliczeniem lub obserwacją, nie samą definicją.

  1. Ktoś z zespołu twierdzi, że pochodna, gradient i spadek gradientowy to to samo. Pokaż różnicę na przykładzie tego modelu z dwoma parametrami.
  2. Dlaczego na początku pochodna względem wagi (−440) jest bardziej ujemna niż względem biasu (−120)? Dlaczego obie trzeba obliczyć, zanim zmieni się którykolwiek parametr?
  3. W symulacji bias najpierw rośnie, choć idealne dopasowanie ma b=0b = 0. Dlaczego? Czy 100 aktualizacji gwarantuje dokładne dopasowanie?
Omówienie rozumowania — otwórz po zapisaniu odpowiedzi

Pochodna cząstkowa mierzy wrażliwość na jeden parametr; gradient zbiera je razem; spadek gradientowy używa gradientu do aktualizacji parametrów. Pochodna względem wagi sumuje e⋅xe \cdot x, więc większe wejścia ją wzmacniają. Aktualizacja w, a potem obliczenie pochodnej względem b dla nowego w, byłaby innym algorytmem. Bias pomaga zmniejszyć początkowe niedoszacowanie, choć jego końcowa wartość to zero; skończona liczba kroków daje postęp, ale nie musi prowadzić do dokładnego rozwiązania.

Lista kontrolna

Zachowaj obliczenia ręczne i krótką notatkę łączącą błędy → gradient → aktualizację → mniejszą stratę. Pola wyboru to przypomnienia dla Ciebie, nie test.

Zapisywane tylko w tej przeglądarce.

Dalej: część 2

Część 2 zamienia te obliczenia w program, a gradient liczy za Ciebie PyTorch.

Przejdź do części 2: w PyTorch →