Kısım III · Merak · Bölüm 54

Olabilirlik ve Kayıp

Modeli ölçmek (Likelihood and negative log-likelihood)

Neden burada · Neye dayanıyor

Neden burada: Bir önceki bölümde isim ürettik: jayson ve mai güzeldi, anedatsttzyavilanah değildi. Ama "güzel" ve "değil" gözle verilmiş yargılar. Model iyileştirmek istiyorsak, "bu model şu modelden daha iyi" demenin bir yolu olmalı, ve o yol bir sayı olmalı. Çünkü Bölüm 52'de gördük: gradyan inişi yalnızca bir sayıyı küçültebilir. Bu bölüm, bir dil modelinin kalitesini tek bir sayıya çevirir: negatif log olabilirlik. Bu sayı, sonraki bölümde sinir ağını eğitirken küçültmeye çalışacağımız kayıp olacak; ve bundan sonraki bölümlerin hepsinde, GPT'ye varana kadar, hep aynı sayıyı göreceksin.

Neye dayanıyor: Bölüm 52.1: kayıp fonksiyonu, "ne kadar yanlışız"ı tek bir sayıya çevirir. Burada o fikrin dil modellerine uygun versiyonunu kuruyoruz. Bölüm 53: bigram tablosu ve olasılıklar P(sonraki | önceki); 32.033 isim, 228.146 harf çifti.

  1. Kat 10Uygulamalar: bizimki ve içinde yaşayan yapay zekâ"İyi model" fikri bir uygulamanın kalitesini sayıya çevirmektir.
  2. Kat 4–9Python, kayan noktalı sayılarÇok küçük sayıların neden sıfıra yuvarlandığını bu katta göreceksin. Bölüm 2, 21.
  3. Kat 3İşlemci ve GPULogaritma ve toplama, işlemcinin sayı birimlerinde. Bölüm 4, 6.
  4. Kat 0–2Bit, kapı, devreSınırlı bit sayısı: çok küçük sayılar saklanamaz. Bölüm 2.

Bu bölümün sonunda şunları bileceksin: bir modelin "olabilirlik"inin ne olduğunu; neden olasılıkları çarpmak yerine logaritmalarını toplarız; negatif log olabilirliğin bir kayıp fonksiyonu olarak ne söylediğini ve bigram modelimizin bu ölçüde 2,454 aldığının ne demek olduğunu; hiç görülmemiş harf çiftlerinin neden ölçümü sonsuz yaptığını ve yumuşatmanın bunu nasıl çözdüğünü.

54.1 Olabilirlik ve logaritma neden

Sorunun hukukî tadı

Bir deliller dosyasına bakan hakim şu soruyu sorar: "Şu iddia doğruysa, elimizdeki bu kanıtların ortaya çıkması ne kadar beklenirdi?" İddia doğruysa bu kanıt çok beklenirse iddia güçlenir; çok beklenmezse zayıflar. Dil modeli için aynı soru şöyle sorulur: "Şu model doğruysa (yani dünya, bu modelin tarif ettiği gibi çalışıyorsa), elimizdeki gerçek veriler ne kadar beklenirdi?" Gerçek isimlere yüksek olasılık veren model, gerçeğe uygun; düşük olasılık veren, uygun değil. Bir modelin gerçek veriye verdiği toplam olasılığa olabilirlik (likelihood) denir.

Bir isim için olabilirlik

Bölüm 53'teki tablodan emma ismini değerlendirelim. İşaretli yazılışı .emma.; çiftleri .e, em, mm, ma, a.. Modelin her çifte verdiği olasılık (satır toplamına bölünmüş sayımlar):

ÇiftAnlamıOlasılık
.eisim "e" ile başlar0,0478
em"e"den sonra "m"0,0377
mm"m"den sonra "m"0,0253
ma"m"den sonra "a"0,3899
a."a"dan sonra isim biter0,1960

Modelin "emma" ismine toplam olasılığı nedir? Bigram modelinde her harf kendi komşu harfine koşullu seçildiği için (Bölüm 53), bütün ismin olasılığı bu beş sayının çarpımıdır: önce "e" ile başlama, ardından "m" gelme, ardından yine "m", sonra "a", sonra bitiş. Çarpma, "ve" demektir: bütün bunlar birlikte gerçekleşsin. Hesapladım:

0,0478 × 0,0377 × 0,0253 × 0,3899 × 0,1960 ≈ 0,0000035   (3,48 × 10⁻⁶)

Üç buçuk milyonda bir. Küçük görünüyor ama bir şeyle karşılaştır: hiçbir şey bilmeyen, her harfi 27 sembolden eşit olasılıkla seçen bir model aynı beş çifti (1/27)5 ≈ 6,97 × 10⁻⁸ olasılıkla üretirdi. Bigram modeli "emma"ya yaklaşık 50 kat daha yüksek olasılık veriyor (hesabım: 3,48·10⁻⁶ / 6,97·10⁻⁸ ≈ 49,9). Model bir şey öğrenmiş.

Bütün veri için olabilirlik ve ilk sorun

Bütün veri kümesi için olabilirlik, 228.146 olasılığın çarpımıdır. (Bir miktar da varsayım: isimlerin birbirinden bağımsız olduğunu kabul ediyoruz; tablonun bir ismi nasıl değerlendirdiği başka bir ismin ne olduğuna bağlı değil.) Ama burada pratik bir engel var: her çarpan 1'den küçüktür, çarpım hızla küçülür. Python'da şunu dene: 0.1**300 sonucu 1e-300 (yani bir ile üç yüz sıfır), ama 0.1**400 sonucu 0.0. Sayı o kadar küçüktür ki bilgisayarın kayan noktalı sayı biçimine (Bölüm 2: sınırlı bit sayısı) sığmaz ve sıfıra yuvarlanır. Gerçek veri için bu çarpımın büyüklüğü yaklaşık e−560.000; yani çarpımı doğrudan hesaplayan bir program 0 yazar ve iki modelin kalitesini karşılaştırmak imkânsız olur (iki modelin ikisi de "0").

Çözüm: logaritma

Logaritma (logarithm), bir sayıyı "e'nin kaçıncı kuvveti?" diye soran bir fonksiyondur (burada hep doğal logaritmayı, yani tabanı e ≈ 2,718 olanı kullanıyoruz, Python'da math.log). Bilmen gereken üç özelliği var, hepsini Python'la doğruladım:

Olasılık plog(p)
10
0,5−0,693
0,1−2,303
0,01−4,605
0,001−6,908
0,000001−13,816
  1. Çarpımı toplama çevirir: log(a × b × c) = log(a) + log(b) + log(c). Örnek: 0,5 × 0,1 × 0,2 = 0,01 ve log(0,01) = −4,605; öte yandan log(0,5) + log(0,1) + log(0,2) = −0,693 − 2,303 − 1,609 = −4,605. Aynı.
  2. Küçük sayıları ölçülebilir yapar: bir milyonda bir olasılık (0,000001) logaritmada sadece −13,8. Ve 228.146 çarpımın e−560.000 gibi sığmayan sonucu, 228.146 logaritmanın toplamında −560.000 gibi sıradan bir sayıdır.
  3. Sıralamayı bozmaz: a > b ise log(a) > log(b). Matematikçiler bu özelliğe "monoton artan" der: logaritma artan bir fonksiyondur, hangi model daha büyük olabilirliğe sahipse onun logaritması da büyüktür. Yani olabilirliği en büyük yapan model, log olabilirliği de en büyük yapan modeldir.

Bu yüzden pratikte olabilirliğin kendisini değil log olabilirliği (log-likelihood) kullanırız: her çiftin olasılığının logaritmasını al, hepsini topla. "emma" için:

log(0,0478) + log(0,0377) + log(0,0253) + log(0,3899) + log(0,1960)
= −3,041 − 3,279 − 3,677 − 0,942 − 1,630  =  −12,569

Ve bütün veri kümesi için de aynı işlemi 228.146 çiftte yapınca toplam sıradan bir sayı çıkar (düzgünleştirilmiş modelde −560.002; 54.3'ü göreceksin).

Sınırlama: "hepsi bağımsız" bir kabul

Olabilirliği çarpım olarak yazmamız, 228.146 olayın bağımsız olduğunu varsaymak demektir. Bigram modelinin içinde zaten böyle bir yapı gömülü (bir harf yalnızca önceki harfe bağlı), ama isimlerin birbirinden bağımsız olduğu kabulü bir modelleme seçimidir, bir doğa yasası değil. Bu kabul bu bölümün işini görüyor; büyük dil modelleri de metni aynı biçimde "her parçayı öncekilere bağlı olarak" çarpıp olabilirliği hesaplar (Bölüm 58).

54.2 Negatif log olabilirlik, kayıp olarak

Log olabilirlik hep ≤ 0'dır (olasılıklar 1'den küçük, logları negatif) ve büyük (sıfıra yakın) olması iyidir. Ama Bölüm 52'de öğrendiğimiz çerçeve küçültme üzerine kuruldu: kayıp küçüldükçe iyiyiz. Dolayısıyla işareti çevirmek gerek: negatif log olabilirlik (negative log-likelihood, NLL) = −(log olabilirlik). "emma" için 12,569. Ne kadar küçükse o kadar iyi; sıfır, her çifte olasılık 1 vermek demek, yani kusursuz.

Ama isimler farklı uzunlukta; uzun isimler daha çok çift içerdiği için daha büyük NLL üretir. Adil karşılaştırma için ortalama alırız: toplam NLL'yi çift sayısına böleriz. "emma": 12,569 / 5 = 2,514. Karpathy'nin ders defterinin zincirleme özeti şöyle: olabilirliği büyütmek, log olabilirliği büyütmekle aynıdır (log artan bir fonksiyon), bu negatif log olabilirliği küçültmekle aynıdır, bu da ortalama negatif log olabilirliği küçültmekle aynıdır.1 Her adım sıralamayı korur, yalnızca sayıyı daha kullanışlı yapar. Sonuç: kayıp = ortalama negatif log olabilirlik.

Kodda

import math

log_likelihood = 0.0
n = 0

for w in words:
    chs = ['.'] + list(w) + ['.']
    for ch1, ch2 in zip(chs, chs[1:]):
        p = P[stoi[ch1]][stoi[ch2]]      # modelin bu çifte verdiği olasılık
        log_likelihood += math.log(p)    # logaritmasını toplama ekle
        n += 1                           # kaç çift saydık

nll = -log_likelihood                    # işareti çevir
print(nll / n)                           # ortalama: kayıp

Satır satır: P[stoi[ch1]][stoi[ch2]]: Bölüm 53'te kurduğumuz olasılık tablosundan, bu çiftin hücresi. math.log(p): doğal logaritma. Döngü her isimdeki her komşu çifti dolaşır: 228.146 tur. Sonda toplamı −1 ile çarpıp çift sayısına bölüyoruz. Bu, Karpathy'nin ders defterindeki hesabın aynısı.1

Sonuç: 2,454

Bu hesabı 32.033 isim üzerinde çalıştırdım. Bigram modelinin (olasılıklar doğrudan satır toplamına bölünmüş sayımlar) ortalama NLL değeri 2,4540. Bu sayıyı anlamlandırmak için karşılaştırma noktaları:

ModelOrtalama NLLNe yapar
Rastgele tahmin (her sembol 1/27)3,2958hiçbir şey bilmez; ln 27'ye eşit
Bağlamsız model (her harf, genel sıklığına göre)2,8227harflerin sıklığını bilir, komşusunu bilmez
Bigram (bir önceki harfe bakar)2,4540bu bölümün modeli
Kusursuz bilgi0her çifte olasılık 1; ulaşılamaz

Hiçbir bilgi olmasa 27 sembolden eşit olasılıkla seçmek zorundayız ve her çiftin olasılığı 1/27, NLL = −ln(1/27) = ln 27 ≈ 3,296. Bu, iyi bir "taban çizgisi": kayıp 3,296'dan büyükse model rastgele tahminden bile kötüdür. Başlangıçta ağırlıkları rastgele olan bir sinir ağının kaybı, sıfır ağırlıkla başlarsa tam bu sayıdır (Bölüm 55'te bunu doğrulayacağız).

2,454'ün sezgisel anlamı: e2,454 ≈ 11,63. Yani model, doğru harfe (geometrik ortalamayla) kabaca 1/11,6 ≈ 0,086 olasılık veriyor; sanki her adımda ortalama 11–12 eşit olasılıklı seçenek arasında kalmış gibi. Rastgele modelde bu sayı 27'ydi (tam 27: e3,2958 ≈ 27). Bu bir ölçekten ibaret ve kaba bir sezgi: harf seçimleri 27 yerine ortalama 11–12 seçenekle sınırlanmış.

Neden "farkın karesi" değil de bu?

Bölüm 52'de kayıp olarak (tahmin − istenen)² kullanmıştık. Burada modelin çıktısı tek bir sayı değil, bir olasılık dağılımı; "istenen" ise doğru harf. Ölçmek istediğimiz şey: model, doğru harfe ne kadar olasılık ayırdı? −log(p) bu soruyu cevaplar ve ceza davranışı hoş: p = 1 ise ceza 0; p = 0,5 ise 0,69; p = 0,1 ise 2,30; p = 0,01 ise 4,61; p → 0 giderken ceza sonsuza gider. Yani model doğru cevaba küçük bir olasılık verince çok ağır, "gayet eminim ama yanılıyorum" durumunda en ağır cezayı alır. Bu, hukuk dilinde "kesin hüküm veren ama yanılan hakim"in "tereddütle karar veren ama yanılan hakim"den daha ağır cezalandırılması gibi. İyi bir dil modelinin, emin olmadığı yerde emin olmayan bir dağılım vermesi gerekir; NLL bunu özendirir. İlerleyen bölümlerin hepsinde (MLP, Transformer, büyük dil modelleri) kayıp budur.

Tek tek isimler

Aynı hesabı tek tek isimlere uygulayıp ortalama NLL'lerine baktım (modelde 54.3'te anlatacağım "+1 yumuşatma" ile):

İsimToplam NLLÇift sayısıOrtalama NLL
ayse11,8452,367
kerem14,3162,385
emma12,5752,514
andrejq27,8783,483

ayse ve kerem bu İngilizce veride bile "makul" görünüyor (ortalama 2,4 civarı, modelin ortalamasına yakın). andrejq bilerek uydurulmuş, Karpathy'nin ders defterinde de kullanılan bir sahte isim:1 ortalaması 3,48, rastgele tahminin (3,30) bile üstünde. Neden? Ayrıntısına bakalım:

Çift−log olasılık
.a1,98
an1,83
nd3,26
dr2,56
re2,01
ej5,90
jq7,98
q.2,33

"jq" çifti tek başına toplam 27,87'nin 7,98'ini alıyor. İsimlerde "j"den sonra "q" gelmesi neredeyse hiç olmuyor: sayım tablosunda hücre sıfır. Tam sıfır. Ve burada asıl sorun başlıyor.

54.3 Yumuşatma: hiç görülmemiş çiftler

Ham modelde "j"den sonra "q" olasılığı 0/(j satırının toplamı) = 0. Ve log(0) tanımsızdır: aşağıdaki gibi, olasılık küçüldükçe −log(p) sonsuza gider (log(10⁻⁶) = −13,8; log(10⁻¹²) = −27,6; …). Sonuç: ham modelde andrejq isminin NLL'si sonsuz. Tek bir sıfır, bütün ismin olabilirliğini sıfır, bütün kaybı sonsuz yapar. Üstelik bu sadece bir isim için değil: yeni bir isim listesi üzerinde modelimizi değerlendirsek ve içinde tek bir "hiç görülmemiş çift" bulunsa, model bütün listeyi "imkânsız" sayardı. Modelin olasılık atamadığı bir olay, "az olası" değil "imkânsız" diye işaretlenmiştir; oysa "bu veride hiç görmedik" ile "olamaz" arasında fark var.

Tabloda 729 hücrenin 102'si sıfır (Bölüm 53.3): 101'i gerçek çift, biri başlangıç-bitiş işaretinin yan yana gelmesi. Çözüm: yumuşatma (smoothing): her hücreye küçük bir sayı ekleyerek hiçbir hücreyi sıfır bırakmamak. En basit yöntem: bütün sayımlara k eklemek (k = 1 ise "bir ekle" yumuşatması):

def olasilik_tablosu(N, k):
    P = []
    for i in range(27):
        toplam = sum(N[i]) + 27 * k           # her hücreye k ekledik: 27 hücre
        P.append([(N[i][j] + k) / toplam for j in range(27)])
    return P

P = olasilik_tablosu(N, 1)                     # +1 yumuşatma

Satır satır: her hücreye k eklenir (N[i][j] + k); satırın toplamı da 27 hücrenin hepsine k eklendiği için 27 * k kadar büyür; böylece satır hâlâ 1'e toplanır. Karpathy'nin ders defterinde de aynı hile var: P = (N+1).float() ve ardından satır toplamlarına bölme.1 Artık "jq" için olasılık sıfır değil: 1 / (j satırı toplamı + 27) = 0,0003 civarı ve −log = 7,98 (yukarıdaki tablodaki sayı bu). Bu büyük ama sonlu bir ceza; "çok beklenmedik" ama "imkânsız" değil.

Yumuşatma neye mal olur?

Bedava değil: ekleyerek veriden öğrendiğimiz olasılıkları biraz çarpıtıyoruz. Etkisini ölçelim. Eğitim verisinin kendisi üzerindeki ortalama NLL:

Eklenen kOrtalama NLL
0 (yumuşatma yok)2,4540
0,12,4541
0,52,4543
12,4546
22,4553
52,4577
102,4621

Eğitim verisinde yumuşatma kaybı hep biraz kötüleştirir: ham sayım, eğitim verisini en iyi tarif eden modeldir (bunu şimdilik bir iddia olarak al; 55'te sayısal göreceksin) ve k = 1 ile fark 2,4540'dan 2,4546'ya yalnızca 0,0006. Bu veri kümesi büyük (228.146 çift) olduğu için bir ekleme, çoğu hücrede ihmal edilebilir. Ama yumuşatmanın asıl işi başka: görmediğimiz veride sağlam olmak. Bunun için Bölüm 52.4'teki deneyin bir benzerini yaptım: isimleri karıştırıp ilk N tanesiyle tablo kurdum, eğitimde hiç görülmeyen 2.000 ismi sınadım:

Eğitim verisik = 0,001, görülmeyen veride NLLk = 1, görülmeyen veride NLL
200 isim2,8942,637
2.000 isim2,4962,484
30.000 isim2,4572,458

Az veride (200 isim) yumuşatma anlamlı biçimde yardımcı oluyor (2,894 → 2,637): tablo çok seyrek olduğundan görülmemiş çiftlerle çok karşılaşıyor ve neredeyse sıfır olasılıkla ağır ceza alıyor. Veri çoğaldıkça fark azalıyor, ve 30.000 isimde k = 1 artık çok hafif zararlı. (Küçük bir not: isim listesinde tekrarlar olduğu için görülmeyen veri tamamen "yeni" değil.) Yumuşatmanın ne kadar olması gerektiği bir ayar sorusudur (bir hiperparametre, Bölüm 56.4'te); Karpathy'nin kullandığı +1 işe yarar ama tek seçenek değil.

Yumuşatma bir sinir ağı kavramıyla akraba

Yumuşatma, tabloyu "hiçbir hücreyi sıfır olmaktan aşırı emin olma" yönüne çeker; aşırı büyük k, tabloyu eşit olasılıklı (rastgele) bir modele yaklaştırır. Bölüm 55'te sinir ağı modelinde, ağırlıkları sıfıra doğru çeken ceza terimi (düzenlileştirme) tam böyle bir etki yapacak. Orada deneyle göreceksin: düzenlileştirmeli ağda "jq" olasılığı sıfır değil.

Uygulamamızda

Diyelim ileride uygulamamızda, bir kullanıcının bir soruyu doğru cevaplama olasılığını tahmin eden bir model kurduk ("bu kullanıcı bu soruyu %80 ihtimalle bilir"). Kalitesini nasıl ölçeriz? Aynen bu bölümdeki gibi: gerçekleşen sonuca modelin verdiği olasılığın −log'unu al, ortalamasını hesapla. Kullanıcı bildi ve model %80 demişse ceza −ln 0,8 = 0,22; model %99 demiş ve kullanıcı bilememişse ceza −ln 0,01 = 4,61. "Emin olup yanılmak" ağır cezalanır: istediğimiz tam olarak bu. Ve bir sıfır olasılık hiçbir zaman verilmemelidir: model "bu kullanıcı bunu kesinlikle bilir" (olasılık 1) demişse ve bilememişse ceza sonsuzdur; pratikte olasılıkları 0,001 ile 0,999 arasında tutmak (yumuşatmanın kardeşi) tipik bir güvenlik önlemidir. Elbette bu bir düşünce örneği; uygulamada böyle bir model planlanmış değil, ve basit bir kural çoğu zaman yeter. Ama "doğru kayıp, doğru ceza" ilkesi, hangi tahmin sistemi olursa olsun aynıdır.

Bölüm 52 ve 53 ile bağlantı

Bölüm 52'de kayıp, "ağ ne kadar yanlış" sorusunun cevabıydı ve bir sayı olmak zorundaydı, çünkü gradyan inişi bir sayıyı küçültür. Bölüm 53'te elimizde bir model vardı ama onun iyi olup olmadığını yalnızca gözle bakarak söyleyebiliyorduk. Bu bölüm iki parçayı birleştirdi: dil modeli için doğru kayıp, doğru sonuca verilen olasılığın negatif logaritmasının ortalaması. 2,454 sayısını aklında tut: bir sonraki bölümde sinir ağını eğitirken kaybın 3,8'den başlayıp bu sayıya doğru nasıl indiğini adım adım izleyeceğiz.

Bu bölümde neler kuruldu

Bir modelin gerçek veriye verdiği toplam olasılığa olabilirlik denir; olasılıkların çarpımıdır ve çok küçük çıktığı için bilgisayarda sıfıra yuvarlanır. Logaritma çarpımı toplama çevirir, küçük sayıları ölçülebilir yapar ve sıralamayı korur; o yüzden log olabilirlik kullanılır. Kayıp küçültülecek bir sayı olduğundan işareti çevirir ve çift sayısına böleriz: ortalama negatif log olabilirlik. Bigram modelinin değeri 2,454; rastgele tahmin 3,296, bağlamsız model 2,823. Hiç görülmemiş bir çiftin olasılığı sıfırsa kayıp sonsuz olur; yumuşatma (her sayıma küçük bir sayı eklemek) bunu önler, eğitim verisinde çok az maliyetle, az veride görülmeyen sınamada kazançla.

Terimler sözlükte, Bölüm 54 başlığı altında.

Birincil okuma

Karpathy, nn-zero-to-hero, makemore_part1_bigrams.ipynb, "GOAL: maximize likelihood of the data w.r.t. model parameters" yorumundan başlayan hücreler (log olabilirlik, negatif log olabilirlik, ortalama; andrejq örneği; model yumuşatması). Derinleşmek için: 3Blue1Brown, "Gradient descent, how neural networks learn", The Cost Function başlığı (aynı "kayıp tek bir sayıdır" fikrinin başka bir kayıp fonksiyonuyla anlatımı).

Takıldığın her yeri yapay zekâ öğretmenine sor. Bölüme özgü alıştırma: ondan sana 3 tahmin ("%90 evet", "%50 evet", "%10 evet") ve gerçekleşen sonuçlar versin; her biri için −ln(olasılık)'i hesapla ve en çok hangisinin cezalandırıldığını yorumla.

Bölüm sonu soruları

Kitaba bakmadan cevapla. Kâğıt kalem serbest.

1. Bir modelin olabilirliği (likelihood) nedir?
Olabilirlik, model doğruysa gözlediğimiz verinin ne kadar beklenir olduğunu söyler: her çiftin olasılığının çarpımı. Bkz. 54.1.
2. Olasılıkların çarpımı yerine neden logaritmalarının toplamı kullanılır?
Çok sayıda 1'den küçük sayının çarpımı e−560.000 gibi sığmayan bir sayıya iner; logaritmaların toplamı ise sıradan bir sayıdır ve sıralama değişmez. Bkz. 54.1.
3. Doğru harfe verilen olasılık 0,01 ise o çiftin cezası (−ln p) yaklaşık kaçtır?
−ln(0,01) = 4,605. Ceza olasılık küçüldükçe hızla artar; 100 olasılığın tersi, 0,01 ise olasılığın kendisidir, ceza ise logaritmadır. Bkz. 54.2.
4. Her harfi 27 sembolden eşit olasılıkla seçen modelin ortalama NLL değeri nedir?
Her çifte 1/27 olasılık verir, ceza −ln(1/27) = ln 27 ≈ 3,296. Bu, her modelin aşması gereken taban çizgisi. Bkz. 54.2.
5. Bigram modelimizin 2,454'lük ortalama NLL değeri nasıl yorumlanır?
NLL bir doğruluk yüzdesi değil; ceza ölçüsüdür. 0 kusursuz, ln 27 ≈ 3,3 rastgele tahmin; 2,454 aralarında, bağlam bilmeyen modelin (2,82) de altında. Bkz. 54.2.
6. Ham modelde "jq" çifti hiç görülmediyse andrejq isminin NLL'si ne olur?
Olasılık 0 ise −log(0) sonsuza gider: tek bir sıfır bütün ismi "imkânsız" yapar. Çarpım sıfırdır ama bu olabilirliğin sıfır olması, NLL'nin sonsuz olması demektir. Bkz. 54.3.
7. +1 yumuşatma satırın toplamını neden 27 artırır?
Satırda 27 hücre var ve her birine 1 ekliyoruz; toplam 27 artar. Böylece her hücreyi yeni toplama bölünce satır yine 1'e toplanır. Bkz. 54.3.
8. Yumuşatma ne zaman en çok yarar sağlar?
200 isimlik tabloda görülmeyen veride NLL 2,894'ten 2,637'ye indi; 30.000 isimde fark yok. Eğitim verisinde ise yumuşatma kaybı biraz kötüleştirir. Bkz. 54.3.
9. Kendi cümlelerinle: neden "modelimiz iyi mi?" sorusunu bir sayıya çeviriyoruz ve bu sayı neden olasılığın kendisi değil de logaritmasının ortalamasının negatifi? Bir hukuk benzetmesi de kullan.
Örnek cevabı göster

Gradyan inişi yalnızca bir sayıyı küçültebildiği için "iyi"yi sayıya çevirmeliyiz. Modelin gerçek veriye verdiği olasılık, bir delilin "iddia doğruysa ne kadar beklenirdi?" sorusu gibidir; ama bu olasılıklar çarpılınca çok küçülüp sıfıra yuvarlandığı için logaritmalarını toplarız; işareti çevirip ortalama alırız ki "küçük olan iyi" kuralıyla uyuşsun ve uzun örnekler haksız yere büyük cezalar almasın. "Eminim ama yanılıyorum" durumu en ağır cezayı alır.

10. Bir modelin üç çifte verdiği olasılıklar 0,5, 0,2 ve 0,1 ise toplam NLL ve ortalama NLL kaçtır? Hesabını göster.
Cevabı göster

−ln 0,5 = 0,693; −ln 0,2 = 1,609; −ln 0,1 = 2,303. Toplam NLL = 0,693 + 1,609 + 2,303 = 4,605 (bu aynı zamanda −ln 0,01'dir, çünkü 0,5 × 0,2 × 0,1 = 0,01). Ortalama = 4,605 / 3 = 1,535.

Kaynaklar

  1. Karpathy, nn-zero-to-hero, makemore_part1_bigrams.ipynb: "GOAL: maximize likelihood of the data w.r.t. model parameters (statistical modeling); equivalent to maximizing the log likelihood; equivalent to minimizing the negative log likelihood; equivalent to minimizing the average negative log likelihood"; log(a·b·c) = log a + log b + log c; andrejq örneği; P = (N+1).float() model yumuşatması. Bu bölümdeki bütün sayılar names.txt'yi indirip kendi çalıştırmamla hesaplandı.