- Je berekent entropie en cross-entropy in bits.
- Je verklaart het verschil tussen onzekerheid en de extra kosten van een verkeerde verdeling.
Een model voorspelt “kop” met kans 0.99, maar de munt toont munt. Dat is een veel grotere verrassing dan wanneer het model beide uitkomsten kans 0.5 gaf. We gaan die verrassing meten en daarna middelen over alle uitkomsten.
Deze les werkt met geldige kansverdelingen: iedere kans is niet-negatief en de som is 1. De lijsten p en q beschrijven steeds dezelfde uitkomsten in dezelfde volgorde. p vertelt hoe vaak uitkomsten werkelijk voorkomen in ons oefenmodel; q bevat de voorspelde kansen.
1. Verrassing op een verdubbelingsschaal
Een zekere uitkomst bevat geen verrassing. Bij een eerlijke munt moet je tussen twee even waarschijnlijke mogelijkheden onderscheiden; bij vier even waarschijnlijke kaarten zijn dat er vier. Een bit is hier de informatie-eenheid: twee mogelijkheden vragen 1 bit, vier vragen 2 bits, acht vragen 3 bits.
Het patroon volgt machten van twee: 2 tot de macht 1 is 2, tot de macht 2 is 4. Een negatieve macht neemt het omgekeerde: 2 tot de macht −1 is één gedeeld door 2, en tot de macht −2 is één gedeeld door 4.
De logaritme met basis twee, log₂, rekent omgekeerd: log₂(4) = 2. Voor kansen geeft log₂(1) = 0, log₂(0.5) = −1 en log₂(0.25) = −2, omdat de overeenkomstige machten van twee die kansen opleveren.
Daarom definiëren we de verrassing bij een positieve kans als het negatieve van die logaritme:
I noemt de verrassing, p hier één kans. Kans 1 geeft dus 0 bits, kans 0.5 geeft 1 bit en kans 0.25 geeft 2 bits. Een bit is geen kans: verrassing kan groter dan 1 zijn.
import math
print(-math.log2(1)) # 0.0 of -0.0
print(-math.log2(0.5)) # 1.0
print(-math.log2(0.25)) # 2.0
import math maakt Pythons wiskundebibliotheek beschikbaar; math.log2(x) roept daar de logaritme met basis twee aan. Nul mag niet als argument. -0.0 is voor onze berekeningen gewoon nul.
Entropie (entropy) is de gemiddelde verrassing. Iedere uitkomst weegt mee naar hoe vaak zij voorkomt: bij een eerlijke munt 0.5 × 1 + 0.5 × 1 = 1 bit.
H noemt entropie. Het somteken ∑ zegt “tel de bijdragen op”; i loopt langs alle uitkomsten en pᵢ is de kans op die positie. De hele lijst heet nu p; in Python is pᵢ bijvoorbeeld p[i].
p = [0.5, 0.5]
H = 0
for i in range(len(p)):
if p[i] > 0:
H = H - p[i] * math.log2(p[i])
print(H) # 1.0
Een uitkomst met kans nul komt niet voor en draagt nul bij aan dit gemiddelde. Sla die term over vóór de logaritme. Maak entropie(p); [1, 0] geeft daardoor nul bits, vier kansen van 0.25 geven twee bits.
2. Verrassing onder een voorspelling
Neem nu p = [0.8, 0.2]: de eerste uitkomst komt viermaal zo vaak voor als de tweede. Hun verrassingen onder p zijn ongeveer 0.322 en 2.322 bits. De gewogen som is 0.8 × 0.322 + 0.2 × 2.322 ≈ 0.722 bits.
Voorspelt het model q = [0.5, 0.5], dan kost iedere uitkomst volgens zijn voorspelling 1 bit. Het gemiddelde wordt dus 0.8 × 1 + 0.2 × 1 = 1 bit. Deze gemiddelde verrassing, berekend met q en gewogen met p, heet cross-entropy:
pᵢ blijft het gewicht: hoe vaak telt de uitkomst mee? qᵢ bepaalt de verrassing: welke kans voorspelde het model? Voor onze twee positieve verdelingen:
p = [0.8, 0.2]
q = [0.5, 0.5]
H = 0
CE = 0
for i in range(len(p)):
H = H - p[i] * math.log2(p[i])
CE = CE - p[i] * math.log2(q[i])
print(H) # ongeveer 0.721928
print(CE) # 1.0
Als pᵢ positief is maar qᵢ nul, noemt het model een mogelijke uitkomst onmogelijk. De cross-entropy is dan oneindig; geef float("inf") terug, Pythons waarde voor positieve oneindigheid. Maak cross_entropy(p, q): sla eerst pᵢ = 0 over, controleer daarna qᵢ = 0 en bereken pas dan een logaritme.
Twee uitkomsten: p is de werkelijke kans op A, q de voorspelde kans. Alle waarden zijn in bits.
1.000 + 0.000 = 1.000 bits
Begin met p = q = 0.5: entropie en cross-entropy zijn gelijk. Zet daarna p op 0.8 en houd q op 0.5; herken 0.722 en 1. De schuiven tonen de kans op de eerste uitkomst; de tweede krijgt steeds 1 min die kans.
q blijft in dit diagram tussen 0.01 en 0.99 om oneindige balken te vermijden. Bij p = 0 of 1 kun je q hier dus niet exact gelijk maken. De codeopdracht behandelt deze nulgrenzen wel.
3. Hoeveel extra kost de verkeerde verdeling?
De extra gemiddelde verrassing heet KL-divergentie (KL divergence). In ons voorbeeld is dat 1 − 0.721928 ≈ 0.278072 bits. Je kunt haar ook rechtstreeks optellen:
De verhouding pᵢ/qᵢ vergelijkt de werkelijke en voorspelde kans op dezelfde uitkomst. Onze twee bijdragen zijn ongeveer 0.542458 en −0.264386; samen 0.278072. Bereken precies die termen:
eerste = p[0] * math.log2(p[0] / q[0])
tweede = p[1] * math.log2(p[1] / q[1])
print(eerste) # ongeveer 0.542458
print(tweede) # ongeveer -0.264386
print(eerste + tweede) # ongeveer 0.278072
print(CE - H) # dezelfde totale KL
Veelgemaakte fout: iedere KL-term positief verwachten. Losse termen mogen negatief zijn; de totale KL is niet-negatief voor geldige verdelingen en nul als p en q gelijk zijn. Omwisselen van p en q kan een andere waarde geven: KL is geen gewone afstand.
Maak kl(p, q) met de rechtstreekse som. Gebruik dezelfde nulcontroles als bij cross-entropy; zo voorkom je log2(0) en deling door nul.
Wat neem je mee?
- Entropie is de gemiddelde verrassing van de werkelijke verdeling, hier in bits.
- Cross-entropy weegt met p, maar beoordeelt voorspellingen q.
- KL is de extra gemiddelde verrassing; losse bijdragen hoeven niet positief te zijn.
Je hebt nu de wiskunde om eenvoudige modellen en hun verlies te begrijpen. De datatrack begint bij de gegevens waarop die modellen moeten leren.