Begreper & referanser
Alle nøkkelbegrepene, formlene og referansene fra Gradient descent og trening, samlet på én side. Bruk denne som oppslag når du leser, øver flashcards eller tar quiz.
Begreper
Sentrale begreper fra kapittelet med korte definisjoner.
En iterativ metode som flytter parameterne i motsatt retning av tapsgradienten.
Steglengden som bestemmer hvor kraftig parameterne endres i hver gradientoppdatering.
Gradient descent der hver oppdatering bruker én observasjon eller en minibatch.
Et mindre utvalg av treningsobservasjoner som brukes til å anslå gradienten i ett treningssteg.
Tapet sett som funksjon av modellparameterne, for eksempel , mens treningsdataene holdes faste. Gradienten peker oppover på flaten, og gradient descent går motsatt vei, mot lavere tap.
Én full gjennomgang av treningsdataene. Med eksempler og batchstørrelse består en epoke av iterasjoner, altså parameteroppdateringer.
En funksjon der linjestykket mellom to punkter på grafen aldri ligger under grafen. Hvert lokalt minimum er da også globalt. MSE for lineær regresjon og BCE for logistisk regresjon er konvekse i parameterne, mens tapet til et nevralt nett ikke er det.
Å avbryte treningen når valideringstapet ikke har blitt bedre på et gitt antall epoker (tålmodigheten), og beholde vektene fra den beste epoken.
Formler
Hver formel: hva den heter, hvordan den ser ut, og hva symbolene betyr.
Gradienten til MSE
Gradienten uttrykker hvordan MSE endrer seg når hver vekt justeres.
Gradient descent-oppdatering
Parameterne flyttes mot lavere tap med læringsrate .
Minibatch-gradient
En minibatch estimerer gradienten fra et delsett i stedet for hele treningssettet.
MSE-gradient for w og b
Gradientene for med MSE. Hver residual drar i begge parameterne, og for vektes den med .
Iterasjoner per epoke
Antall parameteroppdateringer i én epoke med batchstørrelse . Full batch gir 1 per epoke, SGD med gir .
Feilfaktor på kvadratisk tap
For ganges avstanden til minimum med i hvert steg. Konvergens krever , og negativ faktor gir sikksakk rundt minimum.
Kodesnutter
Kodesnutter fra kapittelet, vist literal.
Ett gradient descent-steg for hånd og i kode
import numpy as np # Soltimer (x) og produksjon i kWh (y) for tre dagerx = np.array([1.0, 2.0, 3.0])y = np.array([3.0, 4.0, 8.0])w, b = 1.0, 0.0eta = 0.05 # @param 0.01..0.4 0.01 def mse(w, b): return np.mean((w * x + b - y) ** 2) feil = w * x + b - y # residual ŷ − ydw = 2 * np.mean(feil * x) # ∂L/∂wdb = 2 * np.mean(feil) # ∂L/∂bh = 1e-6 # kontroll: numerisk derivert med et lite dytt hdw_num = (mse(w + h, b) - mse(w - h, b)) / (2 * h)print(f"gradient: dw = {dw:.2f} (numerisk {dw_num:.2f}), db = {db:.2f}") w_ny, b_ny = w - eta * dw, b - eta * dbprint(f"nye parametere: w = {w_ny:.3f}, b = {b_ny:.3f}")print(f"MSE før: {mse(w, b):.3f}, etter: {mse(w_ny, b_ny):.3f}")Prøv: Dra eta oppover og finn verdien der «MSE etter» ikke lenger er lavere enn «MSE før».
Full batch, minibatch og SGD side om side
import numpy as npimport matplotlib.pyplot as plt rng = np.random.default_rng(3)n = 200x = rng.uniform(-2, 2, n)y = 1.5 * x - 0.7 + rng.normal(0, 0.3, n)eta = 0.05 # @param 0.01..0.5 0.01epoker = 8 plt.figure()for B in [n, 16, 1]: w = b = 0.0 mse = [np.mean((w * x + b - y) ** 2)] for epoke in range(epoker): rekkefolge = rng.permutation(n) # stokk på nytt hver epoke for start in range(0, n, B): idx = rekkefolge[start:start + B] feil = w * x[idx] + b - y[idx] w, b = w - eta * 2 * np.mean(feil * x[idx]), b - eta * 2 * np.mean(feil) mse.append(np.mean((w * x + b - y) ** 2)) print(f"B = {B:3d}: {epoker * int(np.ceil(n / B)):4d} oppdateringer, MSE = {mse[-1]:.3g}") plt.plot(mse, label=f"B = {B}")plt.yscale("log")plt.xlabel("epoke")plt.ylabel("MSE (log-skala)")plt.legend()plt.tight_layout()plt.show()Prøv: Dra eta mot 0,5 og se hvilken «B =»-linje som får høyest MSE først (ustabil); støyen gir et gulv rundt 0,09.
Lineær regresjon trent med gradient descent
import numpy as np rng = np.random.default_rng(4172)X = rng.uniform(-2, 2, size=80)y = 1.5 * X - 0.7 + rng.normal(scale=0.25, size=80) eta = 0.08 # @param 0.02..0.8 0.02eksponent = 4 # @param 1..8toleranse, maks_epoker = 10.0 ** -eksponent, 500w = b = 0.0for epoke in range(1, maks_epoker + 1): feil = w * X + b - y dw, db = 2 * np.mean(feil * X), 2 * np.mean(feil) if np.hypot(dw, db) < toleranse: # stoppkriterium: gradienten er nesten null break w -= eta * dw b -= eta * db print(f"toleranse {toleranse:.0e}: stoppet etter {epoke} epoker (maks {maks_epoker})")print(f"w = {w:.3g}, b = {b:.3g}, MSE = {np.mean((w * X + b - y) ** 2):.3g}")Prøv: Dra eksponent opp og se «stoppet etter … epoker» vokse; dra så eta mot 0,8 og se løkka nå taket «maks 500».
Læringsmål
Hva du skal kunne etter å ha lest kapittelet.
- 01Regn ut ett gradient descent-steg for både og i med MSE
- 02Forklar hvorfor oppdateringen går motsatt vei av gradienten, og hvorfor stegene krymper nær minimum
- 03Tolk en tapskurve og avgjør om læringsraten er for liten, passe, for stor eller langt for stor
- 04Regn ut antall iterasjoner per epoke og totalt for full batch, minibatch og SGD
- 05Forklar hvorfor konveksitet gir et globalt minimum, og hvorfor et nevralt nett kan ende i ulike løsninger
- 06Velg et stoppkriterium, og bruk tidlig stopping på valideringstap