Kısım III · Merak · Bölüm 54
Olabilirlik ve Kayıp
Modeli ölçmek (Likelihood and negative log-likelihood)
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.
- Kat 10Uygulamalar: bizimki ve içinde yaşayan yapay zekâ"İyi model" fikri bir uygulamanın kalitesini sayıya çevirmektir.
- 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.
- Kat 3İşlemci ve GPULogaritma ve toplama, işlemcinin sayı birimlerinde. Bölüm 4, 6.
- 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):
| Çift | Anlamı | Olasılık |
|---|---|---|
.e | isim "e" ile başlar | 0,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 biter | 0,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 p | log(p) |
|---|---|
| 1 | 0 |
| 0,5 | −0,693 |
| 0,1 | −2,303 |
| 0,01 | −4,605 |
| 0,001 | −6,908 |
| 0,000001 | −13,816 |
- Ç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ı.
- 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.
- 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).
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ı:
| Model | Ortalama NLL | Ne yapar |
|---|---|---|
| Rastgele tahmin (her sembol 1/27) | 3,2958 | hiçbir şey bilmez; ln 27'ye eşit |
| Bağlamsız model (her harf, genel sıklığına göre) | 2,8227 | harflerin sıklığını bilir, komşusunu bilmez |
| Bigram (bir önceki harfe bakar) | 2,4540 | bu bölümün modeli |
| Kusursuz bilgi | 0 | her ç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ış.
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):
| İsim | Toplam NLL | Çift sayısı | Ortalama NLL |
|---|---|---|---|
ayse | 11,84 | 5 | 2,367 |
kerem | 14,31 | 6 | 2,385 |
emma | 12,57 | 5 | 2,514 |
andrejq | 27,87 | 8 | 3,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 |
|---|---|
.a | 1,98 |
an | 1,83 |
nd | 3,26 |
dr | 2,56 |
re | 2,01 |
ej | 5,90 |
jq | 7,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 k | Ortalama NLL |
|---|---|
| 0 (yumuşatma yok) | 2,4540 |
| 0,1 | 2,4541 |
| 0,5 | 2,4543 |
| 1 | 2,4546 |
| 2 | 2,4553 |
| 5 | 2,4577 |
| 10 | 2,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 verisi | k = 0,001, görülmeyen veride NLL | k = 1, görülmeyen veride NLL |
|---|---|---|
| 200 isim | 2,894 | 2,637 |
| 2.000 isim | 2,496 | 2,484 |
| 30.000 isim | 2,457 | 2,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, 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.
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'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.
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.
andrejq isminin NLL'si ne olur?Ö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.
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
- 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ı.