Frisk opp Python, vektorer, matriser, derivasjon, sannsynlighet og statistikk som trengs for å forstå modellene og regne på dem.
Læringsmål
01Tolke formene til vektorer, matriser og tensorer i et maskinlæringsdatasett
02Beregne skalarprodukt og matrise-vektor-produkt og kontrollere resultatets dimensjon
03Forklare derivert og gradient som lokale endringsmål og velge retning mot lavere verdi
04Beregne gjennomsnitt, varians, forventningsverdi og en enkel Bayes-oppdatering
05Gjenskape sentrale beregninger med deterministisk NumPy-kode
Tallene bak en modell
Anta at vi skal anslå strømforbruket til fire leiligheter. For hver leilighet kjenner vi areal, antall beboere og utetemperatur. Hver enkelt måling er en skalar. Samler vi de tre featureverdiene til én observasjon, får vi en vektor. Legger vi fire slike observasjoner under hverandre, får vi en matrise med fire rader og tre kolonner. Denne formen er ikke bare notasjon: den forteller hvilke beregninger som faktisk er lovlige.
En modell kan ha én vekt per feature. Vektvektoren w må derfor ha tre komponenter. ƒskalarprodukt kombinerer én observasjon x og vektene w til én score. For eksempel gir x=(3,1) og w=(1,2) scoren 3⋅1+1⋅2=5. Fortegnet og størrelsen til hver vekt avgjør hvordan den tilhørende featuren trekker prediksjonen.
FIGTo vektorer: retning, lengde og skalarprodukt
Når vi vil beregne alle fire observasjonene samtidig, bruker vi ƒmatrise-vektor-produkt. Datamatrisen X med form 4×3 multipliseres med w med form 3, og resultatet Xw får form 4. Den indre dimensjonen må stemme: tre featurekolonner krever tre vekter. Dette er den vanligste årsaken til formfeil i NumPy.
Eksempelet gjør formene synlige: en 4×3-matrise multiplisert med en vektor med tre komponenter gir en vektor med fire scorer.
Fra matrise til tensor
Tabulære data passer naturlig i to dimensjoner. Bilder og tidsserier trenger ofte flere. En fargevideo kan for eksempel organiseres som bilde, høyde, bredde og fargekanal. En slik flerdimensjonal tallstruktur kalles en tensor. Ordet kan høres avansert ut, men i praktisk maskinlæring betyr det ofte bare «en array med flere akser».
Dimensjonene har semantikk. I en bildemodell betyr form (32,28,28,1) gjerne en batch på 32 gråtonebilder med høyde og bredde 28. Bytter vi rekkefølgen på aksene uten at modellen forventer det, får den enten en eksplisitt formfeil eller lærer fra feil struktur. Les derfor alltid en array-form som en setning: 32 observasjoner, 28 rader, 28 kolonner, én kanal.
Vektorisering betyr at vi uttrykker samme operasjon over hele arrays i stedet for å skrive en Python-løkke for hvert tall. Det gir kortere kode og lar NumPy bruke optimaliserte rutiner. Vektorisering endrer ikke matematikken; den samler mange like skalarberegninger i én tydelig operasjon.
Lokal endring og den deriverte
Trening handler om å endre parametere slik at et tap blir mindre. Da trenger vi et mål på lokal endring. Den deriverte til en funksjon sier hvor mye funksjonsverdien endres per liten endring i input. ƒderivert definerer dette som grensen til en differansekvotient når steget h går mot null.
For f(x)=x2 er den deriverte f′(x)=2x. Ved x=1 er stigningen 2: øker vi x litt, øker funksjonen omtrent dobbelt så mye. Ved x=−1 er stigningen −2, så en liten økning i x senker funksjonsverdien. Tegningen under viser hvorfor den deriverte kan leses som stigningen til tangenten.
FIGDen deriverte som stigning til en tangent
Når en funksjon har mange parametere, holder det ikke med én derivert. gradienten samler én partiellderivert per parameter. ƒgradient peker i retningen der funksjonen øker raskest lokalt. Skal vi redusere et tap, går vi derfor i motsatt retning. Dette er kjernen i gradient descent, som vi bygger ut i kapittel 2.
At gradienten er null betyr bare at punktet er stasjonært. Det kan være et minimum, et maksimum eller et sadelpunkt. For en konveks tapsfunksjon er saken enklere: ethvert lokalt minimum er også globalt. Nevrale nettverk gir derimot tapslandskap med mange flate områder og sadelpunkter, så null eller nesten null gradient må tolkes i kontekst.
Sentrum og spredning
Et datasett trenger mer enn en form; vi må også forstå verdiene. ƒgjennomsnitt gir et mål på sentrum. For målingene 2, 4 og 9 er gjennomsnittet 5. Det er nyttig, men den høye verdien 9 trekker sentrum opp. Medianen 4 påvirkes mindre av det ekstreme punktet.
ƒutvalgsvarians måler hvor spredt et utvalg ligger rundt gjennomsnittet. Vi kvadrerer avvikene, summerer dem og deler på n−1. Kvadreringen gjør negative og positive avvik sammenlignbare og gir stor vekt til ekstreme observasjoner. Standardavviket er kvadratroten av variansen og uttrykkes i samme enhet som dataene.
Skalering og tap er koblet til disse størrelsene. Hvis én feature måles i tusen og en annen mellom null og én, kan den første dominere avstandsberegninger og gradientsteg. Kapittel 1 viser hvordan vi estimerer sentrum og spredning bare fra treningssettet. Ellers lekker informasjon fra data modellen egentlig ikke skal se.
Sannsynlighet før og etter evidens
En tilfeldig variabel knytter et tall til hvert mulig utfall. La X være gevinsten i et syntetisk spill: 0 poeng med sannsynlighet 0,8 og 10 poeng med sannsynlighet 0,2. forventningsverdien er det sannsynlighetsvektede gjennomsnittet, her 0⋅0,8+10⋅0,2=2. Det er ikke en lovnad om at neste utfall blir 2; det beskriver gjennomsnittet over mange uavhengige runder.
Fast seed gir samme pedagogiske resultat ved hver kjøring. Simuleringen nærmer seg den sannsynlighetsvektede forventningsverdien når antall trekk øker.
I klassifikasjon begynner vi ofte med en sannsynlighet før vi observerer ny informasjon, en prior. ƒbayes’ teorem viser hvordan en observasjon oppdaterer denne til en posterior. Anta at 1 prosent av komponenter har en sjelden feil. En test finner 90 prosent av feilene, men gir også positivt svar for 9 prosent av de friske. Et positivt svar betyr da ikke 90 prosent feilrisiko: de friske er så mange at falske positiver fortsatt utgjør mesteparten av de positive svarene.
Bayes-regningen blir 0,90⋅0,01/(0,90⋅0,01+0,09⋅0,99)≈0,092. Posterioren er omtrent 9,2 prosent. Eksempelet viser hvorfor grunnraten må med. En modellscore uten kunnskap om klasseandel eller kalibrering er ikke automatisk en brukbar beslutningssannsynlighet.
Regneregler som sparer tid
Når flere funksjoner er satt sammen, bruker vi kjerneregelen. Hvis tapet J avhenger av en prediksjon y^, og prediksjonen avhenger av en vekt w, kan endringen skrives som ∂J/∂w=(∂J/∂y^)(∂y^/∂w). Vi følger altså beregningskjeden baklengs. Denne ideen dukker opp igjen som backpropagation i nevrale nettverk, men den kan øves med en enkel funksjon: for J(w)=(2w−3)2 er den ytre deriverte 2(2w−3) og den indre 2, slik at J′(w)=4(2w−3).
Lineæritet gjør forventninger enklere. For tilfeldige variable X og Y gjelder E[aX+bY]=aE[X]+bE[Y], også når variablene ikke er uavhengige. Varians oppfører seg annerledes fordi samvariasjon kan bidra. Dette skillet er nyttig når et mål er en sum: forventet totalsum kan bygges fra delene direkte, mens usikkerheten krever mer informasjon om hvordan delene varierer sammen.
Dimensjonsanalyse er en tredje snarvei. Hvis areal måles i kvadratmeter og vekten i kilowattimer per kvadratmeter, får produktet kilowattimer. Legger vi til et bias, må bias ha samme enhet. En sum av kilowattimer og kroner er et varselsignal selv om NumPy godtar den numerisk. På eksamen kan denne kontrollen avsløre at du har brukt feil vektor, og i kode kan den avsløre at kolonner er blandet.
Til slutt bør du skille et populasjonsmål fra et estimat. Gjennomsnitt og varians beregnet fra et endelig datasett varierer fra utvalg til utvalg. Et større og representativt utvalg gir vanligvis mer stabile estimater, men fjerner ikke systematiske målefeil. Tusen skjeve observasjoner er fortsatt skjeve. Statistiske formler må derfor leses sammen med hvordan dataene ble samlet inn.
I praktiske regnestykker er det lurt å gjøre et størrelsesoverslag før kalkulatoren brukes. En sannsynlighet må ligge mellom null og én, en varians kan ikke være negativ, og et skalarprodukt mellom korte vektorer bør ikke plutselig få tusen sifre. Slike grenser beviser ikke at svaret er riktig, men de avslører mange taste- og fortegnsfeil. Samme vane fungerer i kode: skriv ut former, noen få verdier og en enkel baseline før en stor treningsjobb startes.
En arbeidsregel for resten av faget
Når en formel ser tung ut, start med formene og ett lite tallfestet eksempel. Spør hva hver rad representerer, hva hver kolonne representerer, og hvilken enhet resultatet får. Deretter kan du kontrollere beregningen med NumPy. Kode erstatter ikke resonnementet, men avslører ofte om du har byttet en akse, glemt et gjennomsnitt eller brukt feil nevner.
Verktøykassa i dette kapittelet skal brukes aktivt videre. Vektorer blir observasjoner og parametere, matriser blir datasett, gradienter blir treningsretninger, og sannsynligheter blir grunnlaget for klassifikasjon og beslutninger. Målet er ikke å memorere symboler isolert, men å kunne koble hvert symbol til en konkret beregning og en påstand om data.
Mine notater
Skriv egne notater for dette kapittelet. De lagres automatisk og dukker opp i «Mine notater»-oversikten paa fag-siden.