surprisal = ({
"kargo çok hızlı geldi": {
1: {ppl: 126.8, t: [["kargo",8.5],["çok",5.5],["hızlı",7.9],["geldi",8.5],["</s>",4.6]]},
2: {ppl: 35.2, t: [["kargo",7.5],["çok",4.8],["hızlı",5.2],["geldi",4.9],["</s>",3.3]]},
3: {ppl: 11.8, t: [["kargo",7.5],["çok",3.5],["hızlı",1.0],["geldi",3.5],["</s>",2.3]]}
},
"ürünü çok beğendim kesinlikle tavsiye ederim": {
1: {ppl: 152.0, t: [["ürünü",7.8],["çok",5.5],["beğendim",10.4],["kesinlikle",8.6],["tavsiye",6.9],["ederim",7.0],["</s>",4.6]]},
2: {ppl: 10.3, t: [["ürünü",4.4],["çok",5.2],["beğendim",5.7],["kesinlikle",5.7],["tavsiye",1.3],["ederim",0.5],["</s>",0.7]]},
3: {ppl: 5.5, t: [["ürünü",4.4],["çok",4.8],["beğendim",1.7],["kesinlikle",4.9],["tavsiye",0.5],["ederim",0.6],["</s>",0.5]]}
},
"fiyatına göre gayet kaliteli bir ürün": {
1: {ppl: 132.3, t: [["fiyatına",9.4],["göre",8.2],["gayet",7.5],["kaliteli",8.1],["bir",5.5],["ürün",6.1],["</s>",4.6]]},
2: {ppl: 10.5, t: [["fiyatına",6.7],["göre",0.2],["gayet",3.7],["kaliteli",4.9],["bir",2.5],["ürün",2.3],["</s>",3.4]]},
3: {ppl: 6.2, t: [["fiyatına",6.6],["göre",0.0],["gayet",2.9],["kaliteli",4.0],["bir",2.2],["ürün",0.7],["</s>",2.1]]}
},
"kalite iyi fiyat kötü": {
1: {ppl: 293.7, t: [["kalite",10.2],["iyi",6.8],["fiyat",8.5],["kötü",10.9],["</s>",4.6]]},
2: {ppl: 288.0, t: [["kalite",9.7],["iyi",6.8],["fiyat",6.1],["kötü",13.9],["</s>",4.3]]},
3: {ppl: 313.5, t: [["kalite",9.7],["iyi",7.1],["fiyat",5.2],["kötü",15.1],["</s>",4.3]]}
},
"kalite kötü fiyat iyi": {
1: {ppl: 293.7, t: [["kalite",10.2],["kötü",10.9],["fiyat",8.5],["iyi",6.8],["</s>",4.6]]},
2: {ppl: 357.1, t: [["kalite",9.7],["kötü",11.8],["fiyat",10.8],["iyi",6.6],["</s>",3.5]]},
3: {ppl: 368.9, t: [["kalite",9.7],["kötü",12.6],["fiyat",10.9],["iyi",6.6],["</s>",2.8]]}
},
"kedi klavyede uyuyakaldı": {
1: {ppl: 900.7, t: [["kedi",13.3],["klavyede",17.0],["<unk>",4.4],["</s>",4.6]]},
2: {ppl: 623.7, t: [["kedi",12.7],["klavyede",17.4],["<unk>",2.5],["</s>",4.6]]},
3: {ppl: 666.4, t: [["kedi",12.8],["klavyede",17.5],["<unk>",2.5],["</s>",4.7]]}
}
})6 Dil Modelleri: Saymaktan Sinir Ağlarına
Öğrenme hedefleri. Bu bölümün sonunda şunları yapabileceksiniz:
- bir dil modelini diziler üzerindeki bir olasılık dağılımı olarak tanımlamak, zincir kuralıyla onu bir sonraki kelime olasılıklarının çarpımı olarak yeniden yazmak — kestirimi mümkün kılan adım bu — ve değişken uzunluktaki tam bir yoruma olasılık vermek için bitiş olayının neden gerektiğini açıklamak;
- bir n-gram modelini sayarak kestirmek ve modelin bozulduğu birbirinden farklı iki yolu göstermek: sıfır olasılıklar ve kullandığınız bağlam uzadıkça kötüleşen bir seyreklik (sparsity);
- perplexity’yi, eğitimde kullanılmamış verideki log-olabilirlikten (log-likelihood) hesaplamak, onu etkin bir dallanma çarpanı olarak okumak ve iki perplexity’yi karşılaştırmanın anlamsız olduğu iki koşulu belirtmek;
- düzleştirmenin (smoothing) sıfır olasılık sorununu nasıl çözdüğünü, add-one’ın bu derlemde neden bağlamsız modelden bile kötü sonuç verdiğini ve daha kısa bağlamlardan yararlanan yöntemlerin neden çok daha iyi sonuç verdiğini açıklamak;
- yapay sinir ağı tabanlı bir dil modelinin, benzer bağlamlardan öğrenilen kanıtı embedding’ler üzerinden nasıl paylaştırdığını açıklamak ve bunun hangi n-gram arızasını düzelttiğini, hangisine dokunmadığını söylemek;
- tekrarlayan (recurrent) modellerin taşıdığı iki darboğazı — gizli durumdaki sıkıştırma ve eğitimde konumlar boyunca sıralı hesap — adlandırmak ve Bölüm 7’nin bunları hangi ölçüde hafiflettiğini söylemek.
6.1 4. bölümün cevaplayamadığı soru
Bölüm 4, unigram temsillerin ayıramadığı bir çiftle bitmişti. İki Türkçe yorum, dörder kelime, aynı kelimeler, zıt anlamlar:
a = "kalite iyi fiyat kötü"
b = "kalite kötü fiyat iyi"
cosine, averaged fastText 1.0000
cosine, tf-idf 1.0000
Bunlar unigram temsiller. İki cümle de aynı kelime kümesini içeriyor, dolayısıyla ikisi de aynı vektörü alıyor ve üzerine kurulan hiçbir sınıflandırıcı bunları birbirinden ayıramıyor. Bölüm 4’teki kelime bigram’lı model bu belirli çift üzerinde daha iyi iş çıkarır — iyi fiyat ile fiyat iyi ayrı sütunlardır — ama o da sırasız bir torbadır, yalnızca bu kez kelime ikililerinin torbası. Üstelik bu duyarlılığın bedelini sözlüğü kat kat büyüterek öder. Bunu doğru ifade edelim: o bigram sütunları yerel sırayı gerçekten kodluyor; yani bu, sıraya hiç erişimi olmayan bir temsil değil. Ama o sınıflandırıcı bir etiket kestirmek için eğitildi: bir kelime dizisinin olasılığını ya da sonraki kelimenin dağılımını kestirmek için değil. Bunun için hedefi farklı bir model gerekiyor; bu bölüm onu kuruyor.
Aynı çift, bu bölümdeki modellerle puanlandığında şöyle görünüyor — her modelin cümlenin tamamına, yani dört kelimeye ve yorumun bittiğini gösteren </s> işaretine atadığı olasılığın 10 tabanında logaritması; modeller ham yorum metninden başka hiçbir şeyle eğitilmedi. Başlıktaki “Kneser-Ney smoothed”, modellerin Kneser-Ney yöntemiyle düzleştirildiğini söylüyor; düzleştirmeyi ilerideki bir alt bölümde anlatacağız:
### log10 P(sentence), Kneser-Ney smoothed
log P(a) log P(b) P(a)/P(b)
unigram -12.340 -12.340 1.000
bigram -12.297 -12.764 2.933
trigram -12.481 -12.835 2.259
Unigram model, 4. bölümün başarısızlığını birebir tekrar ediyor: oran 1; çünkü unigram model kelime başına bağımsız olasılıkları çarpıyor ve kelimeleri yeniden sıralamak bir çarpımı değiştiremez. Kelime torbası (bag of words) gibi o da sırayı hiç görmüyor. Bigram model ise beraberliği bozuyor ve a cümlesini yaklaşık üç kat (2,933) farkla öne çıkarıyor.
O üç katlık fark, Kısım II’nin konusunun küçük bir örneği. Yeni olan şey sıranın görünür hâle gelmesi değil — bigram öznitelikleri onu Bölüm 4’te zaten görünür kılmıştı. Yeni olan, sıralı bir dizinin artık bir olasılığı olması. İki cümleyi sıralamak için de sonraki kelimeyi üretmek için de aynı nesneyi kullanabilirsiniz. Bu olasılık tek bir yapısal değişiklikten doğdu: her kelimeyi kendinden öncekine koşullamak. Buradan Bölüm 10’a kadar modeller değişirken bu soru hep geri geliyor: model tam olarak neye koşullanıyor ve o bağlamı nasıl temsil ediyor?
Yine de bigram modelin gerçekte ne bildiği konusunda titiz olun; çünkü bildiği, göründüğünden az. İşi yapan altı sayım şunlar:
a: kalite iyi 7 b: kalite kötü 1
iyi fiyat 112 kötü fiyat 0
fiyat kötü 0 fiyat iyi 25
Kutlamadan önce, modelin iki cümleyi neden birbirinden ayırabildiğine bakın.
Model 858.000 token içinde ne kötü fiyat ne de fiyat kötü görmüş; yani kötü fiyatlar hakkında hiç doğrudan kanıtı yok. İki cümle de bigram’larından biri için tümüyle alt dereceden (lower-order) terime yaslanıyor; bu terim daha kısa bir bağlam kullanıyor ve interpolasyonla ekleniyor. Terazinin dengesini tek bir ifade bozmuyor; birkaç eşdizimin çekişmesi bozuyor. Aşağıdaki etkileşimli araçta bigram modelinin kelime başına surprisal değerleri (bit cinsinden) hesabı veriyor: kalite iyi (kalite kötü’nün 1 gözlemine karşı 7) a cümlesine yaklaşık 5 bit, iyi fiyat (kötü fiyat’ın 0 gözlemine karşı 112) yaklaşık 4,7 bit kazandırıyor. Buna karşılık fiyat iyi’nin 25 gözlemi — fiyat kötü hiç görülmemişken — b lehine yaklaşık 7,3 bit, yorum sonu işareti de 0,8 bit geri alıyor. Geriye kalan net fark yaklaşık 1,6 bit, yani tablodaki yaklaşık üç kat. (Araçtaki değerler bir ondalığa yuvarlanmış; bu katkılar o yüzden yaklaşık ve yalnızca bu modele ait.)
Bu tercihi anlam değil, eşdizimler (collocation) açıklıyor — model a cümlesini tercih ediyor, çünkü o kelime sırası okuduğu yorumlara benziyor. Bu gerçek ve kullanışlı bir sinyal; ama modelin iki yorumun ürün ve fiyat hakkında ne söylediğini anladığını göstermez. Bunu ölçmek ayrı bir görev ister.
Bu ayrımı aklınızda tutun; bölümün geri kalanı bunu ölçüyor.
Neye bakacağız. Önce dil modelinin ne olduğunu tanımlıyoruz; bunun için tek satır yetiyor. Sonra sayarak bir model kuruyor ve ayrılmış veride sıfır olasılıklar yüzünden nasıl çöktüğünü ölçüyoruz. Ardından modeli düzleştirmeyle düzeltiyoruz; bu düzeltme bir tür düzenlileştirme. Sonra düzeltilmiş modelin gerçekte ne bildiğini ve perplexity’nin neyi ölçmediğini soruyoruz. Son olarak saymanın yerine küçük bir yapay sinir ağı koyup aynı veri düzeninde karşılaştırıyoruz; cevap, iki tarafın ne kadar iyi ayarlandığına da bağlı çıkıyor.
6.2 Dil modeli nedir
Bir dil modeli, bir diziye olasılık atar. Tanımın tamamı bu; onu olduğundan zor göstermeye gerek yok.
\[ P(w_1, w_2, \ldots, w_n) \]
Bir ayrıntı var: yazıldığı hâliyle bu, uzunluğu \(n\) olan diziler üzerinde bir dağılım. Uzunlukları farklı, tamamlanmış yorumlara olasılık vermek için modelin dizinin bittiğini de kestirmesi gerekiyor; aşağıda bunu </s> işareti yapıyor.
chain rule (zincir kuralı) — “bu cümlenin tamamı ne kadar olası” sorusunu “her kelime, kendinden öncekiler verildiğinde ne kadar olası” sorusuyla değiştirmenize izin veren kural. Öncekilerin olasılığı sıfır olmadığı sürece bu değiş tokuşta hiçbir şey kaybolmaz; iki sorunun cevabı aynıdır. ↩︎
Bunu doğrudan kestiremezsiniz — olası dört kelimelik Türkçe cümlelerin sayısı, şimdiye kadar yazılmış dört kelimelik Türkçe cümlelerin sayısını kat kat aşar; dolayısıyla onları saymak umutsuz bir iştir. Ama olasılığın zincir kuralı (chain rule) bunu hiçbir yaklaşıklık kullanmadan yeniden yazar:
\[ P(w_1, \ldots, w_n) = \prod_{i=1}^{n} P(w_i \mid w_1, \ldots, w_{i-1}) \]
Bu bir model değil, bir özdeşlik. Cümleler üzerindeki bir ortak dağılımın, bir sonraki kelimeyi ondan önce gelen her şey verildiğinde kestiren bir kuralla aynı şey olduğunu söylüyor. Alanı işler hâle getiren hamle budur ve bu kitabın geri kalanının büyük kısmının bir sonraki token’ı kestirmekle ilgili olmasının sebebi de bu: soldan sağa üreten (otoregresif) bir model için tek seferde tek kelime kestirmek, dil modellemenin basitleştirilmiş hâli değil; tam karşılığı. Tek hedef bu değil — 8. bölümdeki BERT gibi modeller metnin maskelenmiş parçalarını kestirerek eğitiliyor — ama üretim yapan bütün modeller bu çarpanlara ayırmayı kullanıyor.
Zorluk yok olmadı, sadece yer değiştirdi. \(P(w_i \mid w_1, \ldots, w_{i-1})\) sınırsızca büyüyen bir bağlama koşullanıyor ve göreceğiniz uzun bağlamların neredeyse hepsi daha önce hiç görmediğiniz bağlamlar. N-gram cevabı, bağlamı kesmek:
\[ P(w_i \mid w_1, \ldots, w_{i-1}) \approx P(w_i \mid w_{i-n+1}, \ldots, w_{i-1}) \]
Markov assumption (Markov varsayımı) — yalnızca son birkaç kelimeye bakıp cümlenin geri kalanını atma kararı. Doğal dil için yanlış bir varsayım — uzak kelimeler de önemli olabilir — ve buna rağmen yapıyoruz; çünkü imkânsız bir sayımı mümkün bir sayıma çeviren şey bu. ↩︎
Yalnızca son \(n-1\) kelime önemli. Buna Markov varsayımı (Markov assumption) denir ve doğal dil için yanlıştır — “Telefonu geçen mart istasyonun yanındaki o küçük dükkândan almıştım; bu sabah da sonunda ___” cümlesindeki boşluğu iyi tahmin etmeye on üç kelime gerideki telefon kelimesi yardım eder (bozulan bir telefonun yapacağı şeyler), ama son iki kelimeye bakan bir model onu göremez. Soru, varsayımın yanlış olup olmadığı değil, ne kadara mal olduğu; bu bedel de ölçülebiliyor.
İmkânsız bir nicelikten sayım tablosuna üç adım
Zincir kuralının hiçbir bedeli yok; modelleme varsayımı Markov kutusunda. Son kutu bir kestirim: n-gram modelde olasılık, bir tam sayının bir başkasına bölünmesiyle kestirilir (en çok olabilirlik kestirimi). Bu da veriden öğrenmedir, ama gradyan yok, yalnızca sayım var; ve sayımlar sonlu olduğu için kestirimler gürültülü. N-gram modellerin uzun yıllar boyunca, başka modelleri eğitmenin çok pahalı olduğu donanımlarda güçlü ve ucuz bir standart olarak kalmasının sebebi de bu.
Shannon bunu 1951’de, İngilizcenin entropisini kestirmek için elle, bir kitap ve bir kalemle zaten yapıyordu (Shannon 1951). Bu bölümdeki matematiğin özü — n-gram istatistikleri ve entropi — onun; değişenlerin en göze çarpanı derlem büyüklüğü.
6.3 38.000 yorum üzerinde saymak
Kuram bu kadar. Şimdi onun olabilecek en küçük sürümü: her kelimenin her bağlamdan sonra kaç kez geldiğini sayın, bölün ve ne çıktığına bakın.
Derlem, Bölüm 4’teki Türkçe ürün yorumu kümesi; 10.000 yorumluk test kümesi de bilinçli olarak oradakiyle aynı. Böylece orada veri hakkında öğrendiğiniz her şey burada da geçerli kalıyor. Tek bir ekleme var. Düzleştirmenin (smoothing) hiperparametreleri var ve test kümesine bakarak seçilen hiperparametreler hiperparametre değil, sızıntıdır. Bu yüzden 40.000 eğitim yorumu bir kez daha bölünüyor: 2.000’i, modelin hiç saymadığı bir ayrılmış dilim, yani bir geliştirme kümesi (development set, çıktılarda kısaca “dev”) oluyor; sayımlar kalan 38.000 yorumda yapılıyor. Aşağıdaki çıktı sırasıyla sayılan (eğitim) yorumlarını, ayrılan dev ve test yorumlarını, sayılan token’ları, farklı kelime biçimlerini ve en az iki kez geçen biçimlerden oluşan sözlüğü veriyor:
smoothing (düzleştirme) — gördüğünüz kelime birleşimlerinden bir parça olasılık alıp görmediklerinize vermek; böylece “hiç görülmedi”, “imkânsız” demek olmaktan çıkar. ↩︎
held-out data (ayrılmış veri) — modelin saymasına izin verilmeyen metin. Genellemeyi ölçen skor burada alınır: eğitim metnindeki skor ezberi de ödüllendirir; ama eğitim skoru, ayrılmış veridekiyle yan yana konduğunda aşırı öğrenmeyi gösterir. Geliştirme kümesi ayar seçmeye, test kümesi son değerlendirmeye ayrılır. ↩︎
### the language-modelling setup
reviews counted 38,000
reviews held out (dev) 2,000 smoothing constants chosen here
reviews held out (test) 10,000 read exactly once, at the end
tokens counted 857,987
distinct word forms 72,087
vocabulary (count >= 2) 29,773
Tablodaki iki not bir niyet bildiriyor ve ikisi de tam tutulmadı; bunu baştan söyleyelim. Test kümesi “yalnızca bir kez, en sonda” okunmadı: ilk sinir ağı denemesinin ve sinir ağı taramasının test değerleri de aşağıda basılıyor; o yerleri ayrıca işaretliyoruz. Düzleştirme sabitlerinden add-k’nın \(k\)’sı ve interpolasyon ağırlıkları gerçekten geliştirme kümesinde seçildi; Kneser-Ney’in indirimi ise seçilmedi, ders kitaplarındaki 0,75 değerinde sabit tutuldu (Kneser-Ney kısmında bunun neye mal olduğunu ölçüyoruz).
Bu 29.773, bölümün sayıma dayalı kısımlarında \(V\) ile kastedilen sayı: modelin olasılık verebildiği sembollerin, yani olasılıkların üzerinde bire toplanması gereken kümenin büyüklüğü. Buna dağılımın desteği (support) denir. Satırın etiketi eksik kalıyor: bu sayı, eşiği geçen 29.771 kelime türüne iki sembol ekliyor — tek geçen kelimelerin toplandığı <unk> ve yorumun bittiğini gösteren </s>. Sayım modelleri de </s> kestiriyor; aşağıdaki test tablosu bu olaylardan 10.000 tane sayıyor. Bunu bölümün kendi sayıları gösteriyor: ileride sözlük eşiğinin 1 olduğu satırda sözlük 72.089, yani 72.087 farklı biçimin tam iki fazlası.
Bölümün ilerisindeki yapay sinir ağı modeli 29.774 sınıflı bir softmax bildiriyor. Fazladan sınıf </s> değil — o zaten 29.773’ün içinde — <s>. Ağın girdi tablosunun <s> için de bir vektöre ihtiyacı var ve aynı \(V\) çıktı katmanını da boyutlandırdığı için <s>, hiçbir zaman hedef olmayan bir çıktı sınıfı olarak da yer alıyor. Parametre sayısı bunu doğruluyor: \(161 \times 29{.}774 + 8{.}320 = 4{.}801{.}934\) (embedding’in 32 ve çıktı katmanının 128 ağırlığı ile bir bias, her sınıf için; gizli katmanın \(2 \times 32 \times 128 + 128\) parametresi). Model hiç hedef olmayan bir sınıfa neredeyse sıfır olasılık vermeyi öğreniyor; perplexity’yi etkilemiyor, parametre sayısında yer kaplıyor.
Ders şu: desteği bir kez tanımlayın, içinde hangi özel sembollerin bulunduğunu yazın ve aynı tanımı düzleştirmede, softmax’ta ve tahmin olayı sayımında kullanın. Aynı iş akışında farklı tanımlar kullanmak, yayımlanmış bir perplexity’yi başkasınınkiyle karşılaştırılamaz kılmanın en yaygın yollarından biridir.
İki küçük hazırlık kararı ileride gerçekten iş görüyor; o yüzden bunları açıkça belirtiyoruz.
Her yoruma başlangıç ve bitiş işareti ekleniyor. Başa bir <s> işareti ekleniyor ki ilk gerçek kelimenin bir bağlamı olsun; sona bir </s> işareti ekleniyor ki model yorumun bittiğini de kestirmek zorunda kalsın. Sonlandırıcı olmadan olasılıklar her uzunluktaki cümleler üzerinde bire toplanmaz; üretim de ancak dışarıdan konmuş bir uzunluk sınırıyla durur, çünkü model ne zaman duracağını öğrenmemiştir.
Bir kez görülen kelimeler <unk> ile değiştiriliyor. Bölüm 4 kendi 40.000 yorumluk bölmesinde %58,6 oranında hapax (derlemde yalnızca bir kez geçen kelime) ölçmüştü — buradakinden farklı bir örneklem, dolayısıyla onu bu derlemin sayısı olarak değil, problemin büyüklüğünün göstergesi olarak alın. Burada eşik, 72.087 farklı biçimi 29.771 kelimeye indiriyor; yani kırk binden fazla biçimin olasılığı aksi hâlde tek bir gözlemden kestirilecekti. Hepsini tek bir “bilinmeyen kelime” sembolüne eşlemek modele, sözlükte olmayan bir kelime geldiğinde sıfırdan farklı bir olasılık verme imkânı veriyor; ama bu olasılık <unk> sınıfının olasılığı. Model, gelen bilinmeyen kelimenin hangisi olduğunu (uyuyakaldı mı, başka bir şey mi) ayırt edemiyor. Bu eşlemenin bir sonucu daha var. İleride ona dönüp uzun uzun üzerinde duracağız; çünkü yayımlanmış perplexity sayılarını anlamsızlaştırmanın en yaygın yolu bu.
Test kümesi bu sözlükten geçirildiğinde tablo şöyle: test token’ları, bunlardan <unk>’a dönüşenler, farklı biçimler ve bunlardan sözlükte olmayanlar; son satırda da kestirim olaylarının sayısı (229.055 kelime ve 10.000 </s>):
### the test set, through that vocabulary
test tokens 229,055
test tokens -> <unk> 17,003 7.42%
distinct test forms 32,573
not in the vocabulary 15,352 47.1%
prediction events 239,055 229,055 words + 10,000 </s>
Sözlükte olmamak, eğitimde hiç görülmemiş olmak demek değil: bu 15.352 biçimin bir kısmı eğitimde bir kez geçmiş ve eşikte <unk>’a katılmıştı. Gerçekten hiç görülmemiş olanlar, yeniden koşuda 32.573 biçimin 11.151’i (%34,2).
Şimdi modelin kendisi. Bir bigram model, iki sözlük ve bir bölme işleminden ibaret:
from collections import Counter
ctx, ngr = Counter(), Counter()
for s in train_seqs: # <s> ve </s> zaten eklendi
for i in range(1, len(s)):
ctx[s[i - 1]] += 1
ngr[(s[i - 1], s[i])] += 1
def p_mle(prev, w):
# prev her zaman <s> ya da sözlükteki bir kelime (<unk> dâhil); hepsi
# eğitimde bağlam olarak geçtiği için ctx[prev] > 0 ve bölme tanımlı
return ngr[(prev, w)] / ctx[prev]1990 civarında istatistiksel dil modellemenin özü bu. Ne ürettiğine bakalım: modelin kargo kelimesinden sonra gelen kelime üzerindeki dağılımı şöyle (sütunlar: sayım ve olasılık):
### P(next | kargo), bigram MLE
ve 167 0.0676
için 163 0.0659
hızlı 105 0.0425
bedava 103 0.0417
da 93 0.0376
çok 83 0.0336
</s> 82 0.0332 (yorum burada bitiyor)
ile 81 0.0328
context count 2,472; 516 distinct continuations observed
Kimse bir dilbilgisi yazmadı. Model, kargo kelimesinden sonra işlev kelimelerinin, hız ve maliyetle ilgili sıfatların ve — kargo’dan sonraki konumların %3,3’ünde — yorumun sonunun geldiğini keşfetti. Bu, bu derlemdeki yorumcuların nasıl yazdığının sayarak çıkarılmış bir betimlemesi; Türkçenin dilbilgisi ya da genel kullanımı hakkında doğrudan bir kanıt değil.
NotSezgi kontrolü: bir yorumun sonu neden ayrı bir token olmalı?
Çünkü aksi hâlde model, cümleler üzerinde bir dağılım değildir.
</s>’i attığınızı varsayın. O zaman \(P(\text{"kargo hızlı"})\) ve \(P(\text{"kargo hızlı geldi"})\) ifadelerinin ikisi de koşulluların çarpımıdır ve kısa olan zorunlu olarak daha büyüktür; çünkü uzun olan, kısa olanın 1’den küçük bir olasılıkla çarpılmış hâlidir. İkisi de aslında tamamlanmış bir cümlenin değil, bir önekin olasılığı. Her uzunluktaki tüm diziler üzerinden toplayın, bir değil sonsuz elde edersiniz. Modelin “ve sonra durdu” diyecek bir yolu yoktur.
Pratikte bu, üretmeye başladığınız anda ortaya çıkar: sonlandırıcı olmadan örnekleyiciniz, dışarıdan bir uzunluk sınırı koymazsanız siz kesene kadar çalışır ve yazdığı her cümle, durduğu yerde yarım kalır. Bir üretim döngüsünün beklediği şey </s>’tir; modern sohbet modellerindeki end-of-turn token da benzer bir işi görür.
6.4 Perplexity
Artık cümlelere olasılık atayan bir modelimiz var. Bu modelin iyi olup olmadığını nasıl söyleyeceğiz?
Tek bir sayıya ihtiyacımız var ve bu sayı bir alt görev (downstream task, örneğin sınıflandırma) gerektirmemeli; çünkü işin bütün amacı, modelin böyle bir görev olmadan eğitilmiş olması. Sonraki kelimedeki düz doğruluk (accuracy) da iyi bir seçim değil: kabul edilebilir pek çok devam vardır ve doğruluk yalnızca modelin ilk tahmininin tutup tutmadığına bakar; modelin gerçekten gelen kelimeye ne kadar olasılık verdiğini hiç kullanmaz. Bunun yerine sorabileceğimiz şey, modelin görmediği metin karşısında ne kadar şaşırdığı. Bunu bir sayıya dökmenin de standart bir yolu var.
perplexity — ayrılmış metinde token başına ortalama negatif log olasılığın üssü. Düşük olan iyidir. Sezgisel okuması: 10 perplexity, modelin gözlenen kelimelere, on seçenekli bir kısa listeden tekdüze seçim yapan biri kadar olasılık verdiği anlamına gelir; her adımda gerçekten on seçenek olduğu anlamına gelmez. ↩︎
Doğal nicelik, modelin hiç görmediği metne atadığı olasılık. Ayrılmış veri üzerindeki olasılık yüz binlerce küçük sayının çarpımı olduğu için bunun yerine ortalama logaritmayla çalışıyoruz ve sonra yorumlanabilir bir şeye geri dönmek üzere üs alıyoruz:
\[ \mathrm{PPL} = \exp\!\left(-\frac{1}{N}\sum_{i=1}^{N} \log P(w_i \mid h_i)\right) \]
Burada \(N\) kestirim olaylarının sayısı, \(h_i\) ise \(i\). olaydan önceki bağlam (geçmiş). Olaylar kelimeler ve her yorumun sonundaki </s>; bu bölümün testinde \(N = 239{.}055\). Formül, \(1/P(w_i \mid h_i)\) ifadesinin geometrik ortalaması — modelin gerçekten gelen olaylara verdiği olasılıkların geometrik ortalamasının tersi.
Tutarlı olduğunuz sürece logaritmanın tabanı önemli değil: \(\mathrm{PPL} = \exp(H_e) = 2^{H_2}\); burada \(H\) token başına ortalama negatif log olasılık — yani modelin ayrılmış metin üzerindeki çapraz entropisi. Dolayısıyla perplexity’yi küçültmek, ayrılmış verideki log-olabilirliği büyütmek ve çapraz entropiyi küçültmek tek bir işlemin üç adı. Bu kitabın geri kalanındaki dil modellerinin ön eğitim kaybı da üs alınmadan önceki bu nicelikle aynı biçimde: sonraki token’ın ortalama negatif log olasılığı. Yalnızca hangi metin üzerinde ve hangi tokenizer’la ölçüldüğü değişiyor; eğitim kaybını ayrılmış metindeki değerle, ya da farklı tokenizer’larla ölçülmüş iki değeri, doğrudan karşılaştıramazsınız. Aşağıdaki etkileşimli araç \(H_2\)’yi bit cinsinden, token token raporluyor; tablolar ise \(\exp(H_e)\)’yi.
Bu paragraftaki iki kavram birer satırı hak ediyor. Çapraz entropi, \(H(p, q) = -\sum_x p(x) \log q(x)\), gerçekte \(p\)’den (burada Türkçe yorumlardan) gelen veriyi bir \(q\) modeliyle betimlemenin ne kadar pahalı olduğunu ölçer; yukarıdaki ayrılmış veri ortalaması, bunun bir örneklemden yapılmış kestiriminden ibaret. Çapraz entropi, \(p\)’nin kendi entropisinin altına hiçbir zaman inemez. Bir yorumun sonraki kelimesi gerçekten belirsiz olduğu sürece (ki öyle) kusursuz bir model bile 1’in üstünde bir perplexity’de kalır; perplexity’nin 1 olması ancak her sonraki olayın kesin olarak belirlendiği bir dilde mümkün. Bit ise tek bir hilesiz evet/hayır seçiminin taşıdığı bilgi: token başına \(H_2 = 7\) bit, ortalamada, modelin her kelimeyi belirlemek için yedi hilesiz evet/hayır sorusu sorması gerekiyormuş kadar, yani \(2^7 = 128\) eşit olasılıklı seçenek arasından seçiyormuş kadar kararsız olduğu anlamına gelir. Bu da bir benzetme: gerçek dağılım her konumda böyle tekdüze değil.
Bunu etkin bir dallanma çarpanı olarak okuyun. Perplexity’si 100 olan bir model, gözlenen kelimelere ortalamada (geometrik ortalamayla), her konumda 100 kelime arasından tekdüze (uniform) dağılımla seçim yapan bir modelin vereceği kadar olasılık veriyor. Gerçek model böyle değil: kimi konumda neredeyse emin, kimi konumda binlerce seçeneğe dağılmış; perplexity bunların ortalaması. Hilesiz bir altı yüzlü zarın perplexity’si 6’dır. Doğru sonraki kelimeye her seferinde 1 olasılığı atayan bir modelin perplexity’si 1’dir. Düşük olan iyidir ve birimi şu: “etkin olarak kaç eşit olasılıklı seçenek arasından seçiyorum”.
NotAritmetik, tek cümlelik bir derlem üzerinde
Üç token’lık bir dizi ve şunları atayan bir model alın:
\[ P(w_1 \mid h_1) = 0{,}5, \quad P(w_2 \mid h_2) = 0{,}25, \quad P(w_3 \mid h_3) = 0{,}125 \]
Ortalama negatif log olasılığı şu:
\[ -\tfrac{1}{3}\left(\ln 0{,}5 + \ln 0{,}25 + \ln 0{,}125\right) = -\tfrac{1}{3}\ln(0{,}015625) = 1{,}386 \]
ve \(\exp(1{,}386) = 4{,}0\). Yani perplexity 4; bu da 2, 4 ve 8’in geometrik ortalaması; bunlar da üç olasılığın çarpmaya göre tersleri.
Bundan, pratikte önemli olan iki özellik çıkıyor.
Perplexity bir geometrik ortalamadır, dolayısıyla tek bir felaket token kısa bir diziyi tek başına belirler. Üçüncü olasılığı \(10^{-6}\) ile değiştirin; perplexity 4,0’dan 200’e sıçrar — 2, 4 ve \(10^{6}\) sayılarının geometrik ortalaması. Üç token’ın ikisi hâlâ iyi tahmin edilmişti ve skor elli kat oynadı. Uzun bir test kümesinde tek bir küçük olasılığın etkisi \(N\)’e bölünür; 239.055 olayda \(10^{-6}\)’lık tek bir olay perplexity’yi binde birden az oynatır. Sıfır ise farklı: 0 ile değiştirin, model derlemdeki diğer her token’da ne kadar iyi iş çıkarmış olursa olsun perplexity sonsuz olur. Bir sonraki alt bölüm tamamen bu olguyla ilgili.
Perplexity token başına hesaplanır, dolayısıyla token’ın ne olduğuna bağlıdır. Aynı metni kelimeler yerine karakterlere bölen bir model başka olayları, başka bağlamlarla kestirir ve \(N\) de değişir; ortaya çıkan sayı kelime düzeyindekiyle hiçbir ortak ölçeği paylaşmaz. Bu ince bir ayrıntı değil; iki makaledeki iki perplexity sayısının çoğu zaman hiç karşılaştırılamamasının sebebi.
6.5 Felaket: görülmemiş n-gram’lar ve sonsuz perplexity
Buraya kadar her şey, bizim seçtiğimiz bir cümle üzerinde işe yaradı. Test kümesi ise kimsenin seçmediği cümlelerden oluşuyor. Aynı modelin orada olasılık verirken sıfıra düşüp düşmediğine bakalım.
maximum likelihood estimation (MLE) (en çok olabilirlik kestirimi) — gözlenen verinin olasılığını en büyük yapan kestirim; bir n-gram modelinde, bağlam görülmüşse, bir ham sayımı bir başkasına hiçbir şey eklemeden bölmek. Eğitim metnine olabildiğince sıkı uyar ve görmediği her devama sıfır verir; ayrılmış veride sorun bu sıfırlardan çıkar. ↩︎
Şimdi \(c(h,w)/c(h)\) dışında hiçbir şeyle tanımlanmayan en çok olabilirlik (maximum likelihood, MLE) modelini ayrılmış yorumlar üzerinde çalıştırın.
### test perplexity, maximum likelihood
unigram 1,303.6
bigram ∞
trigram ∞
4-gram ∞
5-gram ∞
“Büyük” değil. Sonsuz; üstelik son derece sıradan bir sebeple: bazı test bigram’ları eğitimde hiç görülmedi, dolayısıyla model onlara tam olarak sıfır olasılık atıyor, dolayısıyla logaritma \(-\infty\) oluyor, dolayısıyla ortalama \(-\infty\) oluyor. 239.055 kestirimin herhangi birinde tek bir görülmemiş kelime çiftinin bulunması, hepsinin skorunu yok etmeye yetiyor.
Üstelik tek bir olay da değil. Sayısı şu kadar:
### test predictions the MLE model assigns probability zero
bigram 73,225 of 239,055 30.6%
trigram 161,544 of 239,055 67.6%
4-gram 201,599 of 239,055 84.3%
5-gram 214,122 of 239,055 89.6%
858.000 kelimelik Türkçe yorum üzerinde eğitilmiş bir trigram model, test olaylarının üçte ikisine, kendi iki kelimelik bağlamından sonra sıfır olasılık veriyor. Bu, o kelimelerin Türkçede imkânsız olduğunu değil, o üçlülerin eğitimde hiç sayılmadığını söylüyor; ama MLE için ikisi aynı şey.
Sebep bir yazılım hatası değil; daha fazla veriyle kapanacak bir boşluk da değil. Daha fazla veri bu belirli üçlülerin bir kısmını görünür kılar, ama yeni metin hep yenilerini getirir; çünkü olası n-gram sayısı \(V^n\) gibi büyürken derleminiz \(N\) gibi büyüyor; dolayısıyla \(n\) arttığı anda bölen olarak kullandığınız sayımlar minicik hâle geliyor. \(n\) büyüdükçe modele ne olduğuna bakın (sütunlar: farklı n-gram sayısı, ortalama kaç token’da bir yeni bir n-gram türüyle karşılaşıldığı ve tam bir kez görülenlerin oranı):
### how the count table behaves, 895,987 training events
distinct a new type seen exactly
n n-grams every… once
1 29,773 30.1 tokens 0.0%
2 383,579 2.3 tokens 78.9%
3 674,067 1.3 tokens 91.8%
5 818,339 1.1 tokens 98.0%
\(n = 5\)’e gelindiğinde eğitim verisindeki n-gram’ların %98’i tam olarak bir kez geçiyor ve okuduğunuz token’ların %91,3’ü karşınıza daha önce hiç görmediğiniz bir 5-gram çıkarıyor. Bu noktada yüksek dereceli sayım tablosu, genelleme yapan bir modelden çok derlemin parçalarının bir kaydına benziyor; bunun örneklemeye ne yaptığını biraz aşağıda ölçüyoruz. (Unigram’larda tek geçenlerin oranının %0,0 görünmesinin tek sebebi, onları zaten <unk>’a eşlemiş olmamız.)
Daha çok bağlam, daha az kanıt — her n-gram modelin yaptığı ödünleşim
Turkuaz çizgi, modelin herhangi bir kestirimi olduğu test kestirimlerinin oranı; gül rengi çizgi ise o kestirimin sıfırdan farklı olduğu oran. İkisi de keskin biçimde düşüyor. Gül rengi çizginin üstünde kalan her şey, düzleştirmenin karşılamak zorunda olduğu kısım: iki çizgi arasındaki boşlukta bağlam biliniyor ama devam yeni; turkuaz çizginin üstünde ise bağlamın kendisi de yeni. \(n=5\)’te tam 5-gram, okunan olayların yalnızca %10,4’ünde eğitimde görülmüş; geri kalanında düzleştirilmiş bir model alt derecelerin kestirimlerine dayanır.
6.6 Düzleştirme bir tür düzenlileştirmedir
Bunu okuyan her istatistikçi problemi çoktan teşhis etti: seyrek sayımlar üzerinde eğitilmiş, yansız ama varyansı felaket bir kestirici. Tedavi de her zamanki: biraz yanlılığı göze alıp karşılığında varyansı bolca düşürün ve hepsinden önemlisi kestirimin sıfıra inmesini tümden engelleyin. Düzleştirmenin yaptığı tam olarak bu; bu yüzden onu bir düzenlileştirme biçimi olarak okuyabilirsiniz. İki kelime yine de eşanlamlı değil: düzleştirme, sayım tablolarına özgü bir düzenlileştirme ailesi.
Add-one: ders kitaplarının ilk fikri ve bu derlemde neden bir felaket olduğu. Başlamadan önce olası her devamı bir kez görmüş gibi yapın:
\[ P_{+1}(w \mid h) = \frac{c(h, w) + 1}{c(h) + V} \]
İstatistik okurları için: bu, her kelime için \(\alpha_i = 1\) olan simetrik bir Dirichlet önseli altındaki sonsal ortalamadır. Bu önsel, olası bütün sonraki kelime dağılımları üzerinde düz bir önseldir ve ortalamada her kelimeyi eşit olasılıklı sayar. \(V\) kelimenin her biri 1 sözde sayım (pseudo-count) aldığı için önselin toplam yoğunlaşması (concentration), yani eklenen sözde sayımların toplamı, 1 değil \(V\)’dir; aynı önsel altındaki MAP kestirimi ise düzleştirilmemiş MLE’nin kendisi olurdu. Buradaki \(V\) desteğin tamamı: 29.771 kelime, <unk> ve </s>, toplam 29.773. Gayet saygın bir yöntem; ama bu derlemde bağlamı hiç kullanmayan modelden bile kötü:
### test perplexity, add-one
unigram 1,313.8
bigram 3,216.5
trigram 13,221.2
5-gram 22,234.0
Add-one düzleştirmeli bigram model, bağlamı tümden yok saymaktan iki buçuk kat kötü. Aritmetik sebebini gösteriyor. kargo bağlamında \(c(h) = 2{.}472\) ve \(V = 29{.}773\); gözlenmiş devam sayısı ise yalnızca 516. Add-one bu 516 devama olasılık kütlesinin yalnızca \((2{.}472 + 516)/32{.}245 = \%9{,}3\)’ünü bırakıyor, kalan \(29{.}257/32{.}245 = \%90{,}7\)’yi ise hiç görülmemiş kelime çiftlerine dağıtıyor (\(29{.}257 = 29{.}773 - 516\); gözlenen 516 devamın içinde </s> da var). (Tanıdık \(V/(c(h)+V) = \%92{,}3\) değeri, eklenen toplam sözde sayım kütlesidir; bu kütlenin bir kısmı yine gözlenmiş devamlara düşer. Önemli olan sayı %90,7.) Model kargo’dan sonra ne geldiğine dair 2.472 örnek gördü ve add-one ona kütlenin onda dokuzunu başka yere harcamasını söylüyor. Daha uzun bağlamlarda \(c(h)\) daha da küçük; zarar da tam bir yıkıma dönüşür.
Sözde sayımı aşağı çekmek yardımcı oluyor ve bu ayarın geliştirme kümesinde yapılması şart:
### add-k, k chosen on the dev set
order best k dev test
2 0.003 714.6 728.5
3 0.001 4,011.3 4,058.6
5 0.0003 16,280.4 16,141.8
\(n=2\)’de daha iyi, ötesinde hâlâ felaket. Bu derlemde ve denenen \(k\) değerleriyle her sayıma bir sabit eklemek bigram’ın ötesinde işe yaramadı ve sebebi genel: problem, görülmemiş olayların biraz kütleye ihtiyaç duyması değil — görülmemiş olaylardan hangisinin bunu hak ettiğine dair hiçbir fikrimizin olmaması; bir sabit ise hepsinin aynı şeyi hak ettiğini söylüyor.
interpolation (interpolasyon) — farklı uzunluktaki bağlamların kestirimlerini (örneğin üç, iki ve tek kelimelik), negatif olmayan ve toplamı bir eden ağırlıklarla tek bir sayıda harmanlamak. Bu bölümde ağırlıklar geliştirme kümesinde seçiliyor. ↩︎
İşe yarayan fikir: daha kısa bir modele sorun. kargo çok hızlı’yı hiç görmediyseniz, çok hızlı’yı büyük ihtimalle görmüşsünüzdür ve hızlı’yı kesinlikle görmüşsünüzdür. Dereceleri interpolasyonla (interpolation) harmanlayın:
\[ P_{\text{int}}(w \mid h) = \lambda_3 P(w \mid w_{-2}, w_{-1}) + \lambda_2 P(w \mid w_{-1}) + \lambda_1 P(w) \]
burada toplamı bir eden \(\lambda\)’lar geliştirme kümesinde EM (expectation–maximization, beklenti–enbüyütme) algoritmasıyla kestiriliyor (Jelinek ve Mercer 1980). Artık görülmemiş bir trigram, tekdüze dağılımlı bir tahmine değil bir bigram kestirimine geri çekiliyor; bu geri çekilmenin ağırlığı da her dereceye ne kadar güvenilebildiğine göre ayarlanıyor. EM’in sezgisi basit: her dev kelimesi için, karışımın o kelimeye verdiği olasılığın ne kadarının hangi dereceden geldiğine bakılır — kelimeyi hangi derece ne kadar “açıkladı” — ve her \(\lambda\) bu payların ortalamasına eşitlenir; adım, \(\lambda\)’lar değişmez hâle gelene kadar tekrarlanır. Ağırlık sayısı az olduğundan geliştirme kümesinde basit bir ızgara araması da iş görür. Bir ayrıntı formülde görünmüyor: bağlam eğitimde hiç görülmemişse o derecenin MLE terimi \(c(h,w)/c(h)\) tanımsız (\(c(h)=0\)). Uygulama ya o terimi sıfır sayar ya da atlayıp kalan ağırlıkları yeniden ölçekler ve bu seçim sonucu değiştirir: yeniden koşuda trigram için test perplexity’si birincisinde 408,3, ikincisinde 397,2. Aşağıdaki tabloyu üreten kodun hangisini yaptığı kaydedilmemiş; yeniden koşu iki seçenekte de tablodakinden düşük sayılar veriyor, ağırlıklar ise tablodakilere çok yakın.
EM’in verdiği karar, ürettiği perplexity’den daha ilginç:
### interpolation weights, fitted on dev
unigram bigram trigram 4-gram 5-gram
2-gram model 0.4204 0.5796
3-gram model 0.4228 0.4834 0.0938
4-gram model 0.4237 0.4878 0.0882 0.0003
5-gram model 0.4234 0.4900 0.0865 0.0001 0.0000
EM’e 4-gram’ların ve 5-gram’ların bu derlemde neredeyse hiçbir şey katmadığını kimse söylemedi; bunu kendisi çıkardı. Her dereceye ne kadar güveneceğini serbestçe seçebildiğinde ağırlığın %0,03’ünü 4-gram’lara koyuyor ve 5-gram’ları sıfıra yuvarlıyor (yeniden koşuda ikisi de tam sıfır). Bu, yukarıdaki seyreklik grafiğinin öteki yönden yeniden keşfedilmiş hâli ve bölümün model seçimine dair en açık sonuçlarından biri. Sınırını da bilin: bu, bütün bağlamlar için tek bir küresel ağırlık. Bazı bağlamlarda yüksek dereceler yine yararlı olabilir; bu karışım onları ayırt edemiyor.
Kneser-Ney ve gerçekten zekice bir fikir. Klasik düzleştirme yöntemlerinin en güçlülerinden biri — Chen ve Goodman’ın geniş karşılaştırmasında değiştirilmiş (modified) sürümü en iyi sonucu veriyordu (Kneser ve Ney 1995; Chen ve Goodman 1999) — gözlenen her sayımdan sabit bir \(d\) indirimi düşüyor ve aldığını yeniden dağıtıyor. Formül, bağlamın eğitimde görüldüğü (\(c(h) > 0\)) durum için:
\[ P_{\text{KN}}(w \mid h) = \frac{\max(c(h,w) - d,\ 0)}{c(h)} + \lambda(h)\, P_{\text{KN}}(w \mid h') \]
Burada \(h'\), \(h\) bağlamının en eski kelimesi atılmış hâli; yani ikinci terim, aynı formülün bir alt dereceye özyinelemeli olarak uygulanması. Bağlam hiç görülmemişse (\(c(h) = 0\)) model doğrudan \(P_{\text{KN}}(w \mid h')\)’ye geçer.
backoff (geri çekilme) — uzun bağlamın kestirimi yetersiz kaldığında (klasik biçiminde: kelime o bağlamdan sonra hiç görülmemişse) bağlamın başından bir kelime atıp daha kısa bağlama sormak; olasılıkların bire toplanması için kısa bağlamın payı yeniden ölçeklenir. İnterpolasyon her zaman harmanlar; geri çekilme yalnızca gerektiğinde devreye girer. ↩︎
Yukarıda yazılan varyant interpolasyonlu (interpolated) Kneser-Ney: her zaman kısa bağlam kestiriminden bir pay ekliyor. Bunu dar anlamdaki geri çekilmeden (backoff) ayırın: geri çekilme, kısa bağlama yalnızca uzun n-gram’ın, yani \((h, w)\) ikilisinin sayımı sıfır olduğunda başvurur.
Zekice olan kısım indirim değil, alt derece dağılımının neyi saydığı. Naif bir düzleştirme yöntemi “bu kelime ne sıklıkta geçiyor?” diye sorar. Kneser-Ney ise “bu kelime kaç farklı bağlamda geçiyor?” diye sorar. Standart örnek İngilizce, ama aynı etki her dilde var: Francisco kelimesi sık geçer, ama neredeyse yalnızca San’dan sonra geçer; dolayısıyla başka herhangi bir kelimeden sonra berbat bir tahmindir. Sıklık “yaygın” der; devam sayısı “uzmanlaşmış” der. Kneser-Ney ikincisini kullanır.
Formülün gizlediği iki nicelik var. Birincisi, \(\lambda(h)\) serbest bir parametre değil — dağılımın toplamı hâlâ bir etsin diye, indirimin aldığı kütlenin ta kendisi:
\[\lambda(h) = \frac{d \cdot N_{1+}(h\bullet)}{c(h)},\]
burada \(N_{1+}(h\bullet)\), \(h\)’den sonra görülen farklı kelimeleri sayıyor. Çok sayıda farklı devamı olan bir bağlam alt dereceye daha çok ağırlık veriyor; tek bir devamı tekrarlayan bir bağlam neredeyse hiç vermiyor. İkincisi, en alt derecenin dağılımı bir unigram frekansı değil, devam dağılımı:
\[P_{\text{KN}}(w) = \frac{N_{1+}(\bullet w)}{N_{1+}(\bullet\bullet)},\]
yani \(w\)’nin ardından geldiği farklı kelime sayısının, toplam farklı bigram tipi sayısına oranı. Francisco kuralının yazıya dökülmüş hâli bu: Francisco neredeyse yalnızca tek bir farklı kelimenin ardından gelmiş, dolayısıyla ne kadar sık geçerse geçsin devam olasılığı minicik. Aynı değişiklik yalnızca en alt derecede değil, en üst derece dışındaki bütün derecelerde yapılır: özyinelemenin alt adımlarında formüldeki ham sayımların yerini devam sayımları alır (örneğin \(c(h, w)\) yerine \(N_{1+}(\bullet\, h\, w)\)). Burada unigram düzeyini yazdık, çünkü fikir en açık orada görünüyor. (\(d\) indirimi 0 ile 1 arasında bir sabit; geliştirme kümesinde ayarlanabilir ya da bir ve iki kez geçen n-gram sayılarından, \(n_1/(n_1 + 2n_2)\) olarak kestirilebilir. Değiştirilmiş Kneser-Ney her derecede bir, iki ve üç-ve-üstü sayımlar için ayrı indirim kullanır. 0,75 sık kullanılan bir başlangıç değeri; bu derlem için ayarlanmış bir değer değil.)
### test perplexity, everything together
order MLE add-1 add-k* interpolated Kneser-Ney
1 1,303.6 1,313.8 1,303.6 — —
2 ∞ 3,216.5 728.5 427.8 351.9
3 ∞ 13,221.2 4,058.6 426.4 333.5
4 ∞ 20,147.7 11,240.8 438.1 344.7
5 ∞ 22,234.0 16,141.8 447.6 353.8
Tablodaki en iyi model, perplexity’si 333,5 olan bir Kneser-Ney trigram’ı. Bu tablodan üç şey çıkıyor; ama önce tablonun Kneser-Ney sütunu hakkında bir uyarı. O sütun her derecede \(d = 0{,}75\) kullanıyor; indirim geliştirme kümesinde ayarlanmadı. Yeniden koşu bunun neye mal olduğunu gösteriyor:
### Kneser-Ney test perplexity in the re-run, by how d was set
order d = 0.75 d = n1/(n1+2n2) per order one d chosen on dev
2 352.3 350.5
3 336.5 320.2 320.7 (d = 0.9)
4 347.7 319.5
5 354.2 319.5
İlk sütun tablonun sayılarını yüzde bir içinde tekrarlıyor. İndirimi sayımlardan kestirmek ya da geliştirme kümesinde seçmek trigram’ı yaklaşık %5 iyileştiriyor ve 4-gram ile 5-gram’ları trigram’la başa baş getiriyor. Aşağıdaki üç gözlem bu iki sütunla birlikte okunmalı.
Düzleştirme bir ayrıntı değil. Birebir aynı sayımlar üzerinde sonsuz bir perplexity ile 333,5 arasındaki fark bu. Burada kestirici, model sınıfından daha önemli.
Trigram’ların ötesine geçmek yardımcı olmuyor. Tablodaki her düzleştirme şemasında 4-gram’lar ve 5-gram’lar trigram’lardan kötü; indirim ayarlanınca zarar ortadan kalkıyor ama kazanç da gelmiyor (319,5’e karşı 320,2). Seyreklik eğrisi de bunu vaat ediyordu: fazladan bağlam gerçek bir bilgi, ama bu derlemde model ona ulaşamıyor.
Ve perplexity’si 333,5 olan bir trigram şu demek: bir Türkçe yorumun iki kelimesini okuduktan sonra model, gözlenen kelimelere ortalamada, 333 eşit olasılıklı kelime arasından rastgele seçen bir modelin vereceği kadar olasılık veriyor. Bu bir tavan değil — indirimi ayarlamak bile yeniden koşuda 320’ye iniyor — ama bu derlemde denediğimiz sayım yöntemlerinin ulaştığı yer bu; oraya ulaştıran yöntemler de on yıllarca süren bir çalışmanın ürünü.
Kneser-Ney’i yenen şey zekâdan çok ölçek oldu. Google’ın 2000’lerin sonundaki makine çevirisi sistemleri stupid backoff kullanıyordu (Brants vd. 2007) — normalleştirilmemiş, olasılık dağılımı bile olmayan bir şema. Brants ve arkadaşları veri trilyon token’a yaklaştıkça bu basit şemanın çeviri kalitesinde Kneser-Ney’e yetiştiğini bildirdi; o ölçekte ve o görevde belirleyici olan mühendislikti (Heafield 2011). Bu, perplexity’de düzleştirmenin önemsizleştiği anlamına gelmiyor: stupid backoff bir olasılık vermediği için perplexity’si bile tanımlı değil. Kanıt tükendiğinde daha kısa bir bağlama geri çekilme fikri daha da eski (Katz 1987); Kneser-Ney’in katkısı neye geri çekilineceğiydi.
NotSezgi kontrolü: derlemi ikiye katlıyorsunuz. O tablodaki hangi Kneser-Ney sayısı en çok oynar?
Bunu doğrudan ölçemiyoruz, çünkü elimizde iki katı veri yok; ama tersini ölçebiliyoruz. Yeniden koşuda sözlüğü ve test kümesini sabit tutup sayımları 38.000 yorumun rastgele yarısından aldık (\(d = 0{,}75\)):
### Kneser-Ney test perplexity, 19,000 -> 38,000 reviews (re-run)
order 19,000 38,000 change
2 410.0 352.3 -14.1%
3 401.4 336.5 -16.2%
4 413.9 347.7 -16.0%
5 421.0 354.2 -15.9%
Mutlak olarak en çok oynayan sayı gerçekten 5-gram’ınki (66,8 puan), ama göreli olarak üç yüksek derece neredeyse aynı oranda iyileşiyor; ayrışan bigram, daha az iyileşiyor. “En aç kalan 5-gram en çok kazanır” beklentisi bu ölçekte tutmuyor: 5-gram iki büyüklükte de trigram’dan kötü kalıyor. İndirimi sayımlardan kestirince de tablo aynı: trigram ve 5-gram ikisi de %15,8 iyileşiyor.
Sebebini seyreklik tablosu ima ediyor. Veriyi iki katına çıkarmak tek geçen 5-gram’ların bir kısmını tekrarlanan gözlemlere çeviriyor, ama yeni metin aynı anda yeni tek geçenler de getiriyor; Türkçe yorumların 5-gram’larında bunların çoğu yeni. Bir derecenin ne kadar kazanacağını derlem büyüklüğünden okuyamazsınız; ölçmeniz gerekiyor.
Genellenebilir ders şu: daha fazla verinin nereye yarayacağını sezgiyle değil, sözlüğü ve testi sabit bir öğrenme eğrisiyle ölçün. Burada bigram’ın geri kalması, sayımları az olan derecelerin biraz daha çok kazandığı sezgisiyle uyumlu, ama yüksek dereceler arasında bir fark çıkmıyor. Bölüm 8’deki ölçekleme yasaları bu tür eğrileri büyük ölçekte ölçüyor; oradaki modellerin milyonlarca değil trilyonlarca token üzerinde eğitilmesinin bir sebebi de küçük bir derlem üzerindeki büyük bir modelin ezberlemeye kayabilmesi.
Daha fazla verinin şimdiden öngörülebilecek bir sınırı da var. Derlemi ikiye katlamak 5-gram modeli iyileştirir ama 5-gram’ları yeterli kılmaz; çünkü hem İngilizce hem Türkçe beş kelimeden uzun bağımlılıklar içerir. Hiçbir veri miktarı yanlış bir varsayımı düzeltmez; yalnızca etrafındaki varyansı azaltır.
6.7 Modelin gerçekte bildiği şey
Perplexity bir özettir ve özetler bazı şeyleri gizler. Bir dil modelinin daha çok şey ele veren ikinci bir arayüzü vardır: modelden örnek çekebilirsiniz. Başlangıç işaretiyle (<s>) başlayın, koşullu dağılımdan bir kelime çekin, bağlamı kaydırın, </s> gelene kadar tekrarlayın.
Aşağıdaki örnekler ve kopyalama oranları düzleştirilmemiş (MLE) n-gram modellerinden çekildi; perplexity tablolarındaki Kneser-Ney modellerinden değil. MLE ile örneklemek sorunsuz: model yalnızca eğitimde görülmüş n-gram’ları üretebildiği için karşılaştığı her bağlam zaten görülmüş bir bağlam. Kneser-Ney’den örneklemenin ne verdiğine biraz aşağıda bakıyoruz. Burada saf örnekleme kullanıyoruz: her kelime, modelin dağılımından olduğu gibi çekiliyor. Greedy seçim, sıcaklık (temperature) ya da top-k gibi kod çözme (decoding) seçenekleri bu çıktıları — ve aşağıdaki kopyalama oranlarını — değiştirir; bunlar Bölüm 18’in konusu.
Bir fark daha var. Perplexity ölçerken bağlam her zaman gerçek test metninden, yani gerçek önekten gelir; sinir ağı eğitiminde modeli gerçek önekle koşullamaya teacher forcing (öğretmen zorlaması) deniyor. Örneklemede ise model kendi çektiği kelimelere koşullanır (free-running, serbest üretim): erken bir tuhaf seçim, sonraki bütün bağlamları eğitimde hiç görülmemiş bir yöne kaydırabilir. Aşağıdaki örneklerin birkaç kelime sonra dağılmasının bir kısmı buradan gelebilir. Modelin kendi çıktısına koşullanmasından doğan bozulmalar (tekrar döngüleri ve yozlaşma) büyük modellerde de sürüyor; Bölüm 18’de onlara döneceğiz.
### sampling, seed 7
unigram
kullanım <unk> tavsi
sadece telefon
ederi bu göre
bigram
ürünü tercih edilebilir
makina sessiz ve tadi oluyor ben çok kullanışlı ve masaj yapacak alan…
en iyi bir ürün kolay
trigram
arkadaşlar ürün günde <unk> ulaştırdıkları için siteye teşekkür ediyorum
ofise aldık çok beğendi teşekkürler hepsiburada
ürünü yeni kullanmaya başladım gayet güzel ve kalıcı fıs yetiyor…
5-gram
ürünü yeni aldım gayet kullanışlı tavsiye ediyorum
bu ürünü uzun süredir kullanıyorum şunu diyebilirim ki ses yapiyor…
yıllardır kullandığım ürün en uzun gece kampanyası ile tl ye uygun…
Unigram çıktısı kelime salatası. Bigram çıktısının yerel bir dilbilgisi var ama bütününde anlamı yok. Trigram çıktısında Türkçe gibi duran tam cümlecikler geçiyor. 5-gram çıktısı ise bir ürün yorumu gibi duruyor.
Ürün yorumu gibi duruyor, çünkü zaten bir ürün yorumu. Aşağıdaki çıktı, modelin ürettiği 8 kelimelik parçaların yüzde kaçının eğitim derleminde birebir geçtiğini gösteriyor:
### of the 8-word spans the model generates, how many appear verbatim
### in the training corpus?
unigram 0.0%
bigram 0.0%
trigram 5.8%
5-gram 91.6%
5-gram modelin “yazdığı” 8 kelimelik parçaların onda dokuzu, eğitim verisinde kelimesi kelimesine geçiyor. Bu akıcılık, büyük ölçüde üretim kılığına girmiş bir erişim (retrieval), yani ezberden okuma. Ölçünün ne dediğine dikkat edin: üretilen metnin sekiz kelimelik pencerelerinin eğitim metninde birebir bulunup bulunmadığı. Bütün bir yorumun kopyalandığını söylemiyor ve oran, örnekleme yöntemine ve pencere uzunluğuna bağlı. Yeniden koşuda üç tohumla (her birinde 200 örnek) MLE 5-gram %91,8, %92,6 ve %93,9, MLE trigram %7,0, %6,8 ve %7,2 veriyor; tablodaki sayılar tek bir tohuma ait, ama tesadüf değil. Seyreklik tablosu da bunu haber veriyordu. Eğitimdeki 5-gram’ların %98’i yalnızca bir kez geçtiği için, dört kelimeye koşullanan bir MLE modeline çoğu zaman tek bir seçenek kalıyor: geçen sefer bu dört kelimeden sonra gelen kelime.
Düzleştirme bunu değiştiriyor mu? Aynı ölçüm, perplexity tablolarındaki Kneser-Ney modelleriyle (yeniden koşu, \(d = 0{,}75\)):
### 8-word spans found verbatim in the training corpus (re-run, 200 samples per seed)
seed 7 seed 8 seed 9
trigram, MLE 7.0% 6.8% 7.2%
5-gram, MLE 91.8% 92.6% 93.9%
trigram, Kneser-Ney 0.0% 0.0% 0.0% (1 of 9,262 spans)
5-gram, Kneser-Ney 2.4% 1.9% 1.8%
5-gram, Kneser-Ney, seed 7:
sürekli yazı <unk> düştü hem toplu alabilirsiniz
ürün güzel gösterecektir kargo güvenle eşi m kullaniyor
Değiştiriyor: Kneser-Ney 5-gram’ı neredeyse hiç kopyalamıyor. Ama örneklerine bakın: akıcılık da gitmiş, çıktı bigram’ınki kadar dağınık. Sebebi aynı seyreklik. Yalnızca bir kez görülmüş bir bağlamda Kneser-Ney, gözlenen tek devama kütlenin dörtte birini (\(1 - 0{,}75\)) bırakıyor, kalanını daha kısa bağlamlara veriyor; 5-gram’ların %98’i tek geçen olduğundan model çoğu adımda fiilen alt derecelerden örnekliyor.
Bu bölümden sonraki her şeyin sebebi işte bu çıkmaz. Akıcılık uzun bağlam ister. Sayarak kestirilen uzun bağlam ise ya kopyalıyor ya dağılıyor. Bu ölçümlerde hiçbir n-gram modeli aynı anda hem akıcı hem özgün olmadı: MLE 5-gram akıcı, çünkü kopyalıyor; Kneser-Ney 5-gram özgün, ama dağınık. Düzleştirme kopyalamayı azaltıyor; yeni bir genelleme yaratmıyor, olasılığı daha kısa bağlamlara yeniden dağıtıyor.
Bu iki bozulma biçimiyle — ezberleyerek elde edilen akıcılık ve bu ezberin değerlendirmeye sızması — modern bir kılıkta yeniden karşılaşacaksınız: eğitim verisinin birebir ezberlenmesi büyük dil modelleri için de güncel bir sorun (Carlini vd. 2021); Bölüm 5’in benchmark (kıyaslama) bulaşmasına dair uyarıları da aynı olgunun değerlendirme tarafından görünen hâli.
6.8 Perplexity’nin size söylemedikleri
Sayma çağını geride bırakmadan önce, yayımlanmış pek çok sayıyı — aralarında sizden yeniden üretmeniz istenecek olanlar da var — yanlış okumanızı önleyecek bir uyarı.
Perplexity sözlüğe bağlıdır. Sözlüğün dışında kalan her kelime <unk> olur ve <unk> sık geçen bir semboldür, dolayısıyla kestirmesi kolaydır. Sözlüğü küçültürseniz zor kestirimleri kolaylarıyla değiştirmiş olursunuz. Aşağıda aynı yöntem (Kneser-Ney trigram), aynı kod ve aynı ham test yorumları var; değiştirdiğimiz tek ayar, bir kelimenin sözlükte tutulması için gereken sıklık eşiği. Ama o ayar çok şeyi değiştiriyor: eğitim metninde hangi kelimelerin <unk>’a dönüştüğünü, dolayısıyla sayımları ve eğitilen modelin kendisini. Tablo aynı modelin sekiz ölçümü değil, sekiz ayrı sözlükle yeniden eğitilmiş sekiz modelin, sekiz ayrı kestirim görevindeki sonucu:
### one method, one raw test set, eight vocabularies, eight refitted models
min_count vocab test <unk> perplexity
1 72,089 5.21% 752.5
2 29,773 7.42% 333.5
3 20,090 9.00% 281.6
5 12,839 11.36% 222.6
10 7,275 15.17% 157.8
25 3,460 21.56% 94.3
100 1,057 34.58% 38.0
500 199 54.83% 10.9
Test kümesindeki kelimelerin yarısından fazlasını adlandıramayan bir model 10,9 perplexity bildiriyor. Bu bir zafer gibi görünüyor ama aslında bir yan etki: test kelimelerinin %54,8’inde “kestirim”, tek ve kolay bir tahmin olan <unk>. Etkileşimli aracın son cümlesinin sayısal hâli bu — uyuyakaldı 2,5 bit aldıysa bunun sebebi modelin bir şey anlaması değil, denemeyi bırakmasına izin verilmiş olması. Etkinin tamamı <unk>’tan da gelmiyor: yeniden koşuda <unk> olaylarını hesaptan çıkarınca bile perplexity eşik 2’de 417,8, eşik 500’de 74,5. Geriye kalan kelimeler de az rakipli, sık kelimeler; sözlüğü küçültmek görevin tamamını kolaylaştırıyor.
En üstteki satıra da bakın. Tek kez geçen (hapax) kelimelerin hepsini tutmak en yüksek sayıyı veriyor: 752,5. Ama dikkat: bu karşılaştırma da sözlükler arası yapılıyor, dolayısıyla tek başına daha kötü bir modelin kanıtı değil. Eşiklemenin asıl modelleme gerekçesi başka: min_count 1 olduğunda <unk> eğitim metninde hiç geçmiyor; modelin, yeni bir kelimenin ne sıklıkla karşısına çıkacağını öğrenebileceği hiçbir sayım yok ve test kelimelerinin, modelin hiç görmediği %5,21’lik kısmına neredeyse hiç olasılık veremiyor. Ne kadar verdiğini yeniden koşu gösteriyor: <unk>’un olasılığı yalnızca Kneser-Ney’in en alt derecesindeki tekdüze tabandan (\(1/V\)) geliyor ve bu olaylar ortalama 20,5 bit alıyor, yani kabaca milyonda bir olasılık. Tabloda en üstteki satırın en yüksek sayı olmasının sebebi bu. Yani eşikleme için gerçek bir modelleme gerekçesi de var, eşikleyerek hile yapmanın bir yolu da. İkisi yalnızca perplexity’ye bakarak birbirinden ayırt edilemez. Mesele de bu.
Yani: iki token başına perplexity ancak iki model aynı test metnini, aynı sözlüğü, aynı tokenization’ı ve aynı olay tanımını (</s> dâhil mi?) paylaşıyorsa doğrudan karşılaştırılabilir. Farklı tokenizer’lar arasında token başına perplexity karşılaştırılamaz, çünkü paydadaki \(N\) farklı şeyleri sayar; modern makalelerin bayt başına bit bildirmesinin ya da sözlüğü dondurulmuş sabit bir benchmark üzerinde raporlamasının sebebi budur (Chelba vd. 2014). Bayt başına bit, metnin toplam \(-\log_2\) olasılığını token sayısına değil bayt cinsinden uzunluğuna böler; böylece payda, model hangi tokenizer’ı kullanırsa kullansın aynı kalır. Bunun bir şartı var: iki model de ham metnin kendisine olasılık vermeli. Bir kelimeyi <unk>’a çevirip yüzey biçimini kaybeden bir model, o kelimenin baytlarına olasılık vermiyor; paydayı bayta çevirmek bu karşılaştırmayı tek başına düzeltmez. Bölüm 22’de bir model sıralama tablosuyla (leaderboard) karşılaştığınızda ona soracağınız ilk soru bu olsun.
Uyarının daha derin hâli: perplexity, bir modelin metni ne kadar iyi kestirdiğini ölçer; bu, modelin işe yarar olup olmadığıyla aynı şey değildir. Bir model ürün yorumlarının sonraki token’ını kestirmede mükemmel olup, bir yorum hakkında sorulan soruyu yanıtlayamayabilir. Bölüm 9 baştan sona bu iki şey arasındaki uçuruma dair.
6.9 Yapay sinir ağı tabanlı dil modelleri
Buraya kadarki başarısızlıkların ortak bir kökü var. kargo ile teslimat neredeyse aynı anlama geliyor, ama bir sayım tablosu için bunlar birbiriyle alakasız iki karakter dizisi: kargo çok hakkında sayılan hiçbir şey teslimat çok satırına yazılmıyor. Düzleştirme alt derecelerden ortak bilgi kullanır (ikisinden sonra gelen kelimenin devam olasılığı gibi), ama iki kelimenin birbirine benzediğini bilmez. Bu, Bölüm 3’ün şikâyetinin olasılıksal bir ortamda yeniden karşımıza çıkması: modelin iki bağlamın benzer olduğunu söyleyecek bir yolu yok.
Bengio ve arkadaşları (Bengio vd. 2003), sonraki sinirsel dil modellerinin hepsinin öncüsü sayılan çözümü önerdi. Markov varsayımını koruyun — önceki \(n-1\) kelimeye koşullanın — ama bu kelimelere sembol muamelesi yapmayı bırakın. Bunun yerine:
- Her bağlam kelimesinin yoğun (dense) vektörünü bir tablodan alın. Bunlar Bölüm 3’teki embedding’lerdir; tek fark, kimsenin onları ayrıca eğitmemesi: bunlar dil modelinin parametreleridir ve kestirim hedefinden geri yayılımla (backpropagation) öğrenilirler.
- Bu vektörleri birleştirip bir gizli katmandan geçirin; böylece model bir tablodaki hücreye bakmak yerine bağlamın pürüzsüz (smooth) bir fonksiyonunu hesaplar.
- Vektörü sözlükteki her token için bir skora dönüştürün, sonra bu skorlara softmax uygulayın; bu, sonraki kelime üzerinde geçerli bir olasılık dağılımı verir. Son doğrusal katman her sözlük kelimesi için bir \(z_v\) skoru üretir; softmax (Bölüm 3’te karşılaştığımız fonksiyon) bu skorları olasılığa çevirir: \(P(v \mid h) = e^{z_v} / \sum_{u} e^{z_u}\).
İlişkili kelimeler arasında kanıt paylaşma fikri yeni değildi — Brown ve arkadaşları (Brown vd. 1992) sayımların bir havuzda toplanabilmesi için kelimeleri çoktan katı sınıflara ayırmıştı. Bengio ve arkadaşlarının değiştirdiği şey, gruplamanın yumuşak, öğrenilmiş ve sürekli olması: hiçbir kelimenin tam olarak tek bir sınıfa atanması gerekmiyor (bir kelime birden çok gruba kısmen ait olabilir) ve benzerlik bir derece meselesi.
Sonuç, meselenin ta kendisi. Model bağlam vektörlerinin sürekli bir fonksiyonu; kargo ile teslimat eğitimin sonunda birbirine yakın vektörler alırsa ve bağlamın geri kalanı aynıysa, model bu iki bağlama benzer kestirimler vermeye yatkın olur. Benzer bağlamlar arasında genelleme sonradan eklenmiş bir özellik değil; bir arama tablosunu pürüzsüz bir fonksiyonla değiştirmenin sonucu. Bu bir yatkınlık, garanti değil: yakınlığın ne kadar işe yaradığı ağın ağırlıklarına ve bağlamdaki öteki kelimelere bağlı. İşe yarayıp yaramadığını aşağıda ölçüyoruz.
PyTorch’ta modelin tamamı dokuz satır:
class NNLM(nn.Module):
def __init__(self, V, ctx, emb=64, hid=256, drop=0.5):
super().__init__()
self.emb = nn.Embedding(V, emb)
self.net = nn.Sequential(
nn.Linear(ctx * emb, hid), nn.Tanh(), nn.Dropout(drop),
nn.Linear(hid, V))
def forward(self, x): # x: (batch, ctx) kelime id'leri
return self.net(self.emb(x).flatten(1))Aynı V hem girdi tablosunu hem çıktı katmanını boyutlandırıyor; burada V = 29.774: tahmin desteği (29.773) artı girdi için gereken <s> (38.000 yorum üzerinde saymak başlığı altında açıkladık).
nn.Dropout(drop), her eğitim adımında gizli birimlerin rastgele seçilmiş drop oranındaki kısmını kapatır (test sırasında hiçbirini kapatmaz); böylece ağın tek bir birime fazla yaslanması zorlaşır. Aşırı öğrenmeye (overfitting) karşı kullanılan standart bir düzenlileştirme yöntemidir.
Eğitim, Perplexity başlığı altında tanımlanan niceliğin ta kendisini küçültür: gerçekten sonra gelen kelimenin ortalama negatif log olasılığını. İleri geçiş (forward pass: girdiden çıktıya giden tek hesap) skorları döndürür; çapraz entropi kaybı softmax’ı uygulayıp logaritmayı tek adımda alır:
logits = model(x) # (batch, V) skorlar
loss = F.cross_entropy(logits, y) # batch'teki -ln P(y | bağlam) ortalaması
# dev perplexity'si: bütün dev olaylarının kaybını toplayın (reduction="sum"),
# olay sayısına bölün, math.exp'ini alın; batch ortalamalarının ortalaması değilYani aşağıdaki “train ppl” (eğitim) ve “dev ppl” (geliştirme) sütunları, bu kaybın iki kümedeki değerlerinin üssünden ibaret. Bu hedefte küçük modelimize özgü hiçbir şey yok: Bölüm 8’deki ön eğitim de aynı sonraki token çapraz entropisini küçültür; yalnızca çok daha uzun bir bağlamla ve çok daha fazla veriyle.
Ortak parametreler, tablonun ayrı tuttuğu bağlamlar arasında bilgi paylaşabilir
Sağdaki mekanizma gerçek, ama yakın vektörler benzer kestirimleri kolaylaştırır, garanti etmez. Bu derlemde ölçülen sonuç da, sıkça anlatılan “sinir ağı yeni bağlamlarda kazanır” beklentisine uymuyor; iddia etmek yerine ölçmemizin sebebi bu. Alttaki sayılar \(d = 0{,}75\)’li Kneser-Ney’e karşı; indirimi ayarlanmış bir Kneser-Ney karşısında tablo yine değişiyor (aşağıda).
6.9.1 İlk deneme bir başarısızlıktı
Yukarıdaki ayarlarla ve drop=0.2 ile eğitildiğinde model, Kneser-Ney trigram’ının 333,5’ine karşı 429,0 test perplexity’sine ulaştı. Daha kötüsü, eğitim eğrisi sebebini apaçık söylüyordu:
epoch train ppl dev ppl
2 456.6 432.7
3 297.1 430.0 <- best dev
4 219.8 448.4
5 177.6 467.5 early stop
Eğitim perplexity’si hızla düşmeye devam ederken geliştirme kümesindeki perplexity en düşük değerine 3. epoch’ta (devir) iniyor, sonra yeniden yükseliyor. Bu, ders kitabı tanımıyla aşırı öğrenme. Kapasiteyi betimleyen bir sayı da var: 896.000 eğitim olayına karşı 9,6 milyon parametre, yani olay başına kabaca on bir parametre. Bu oran tek başına sebebi kanıtlamıyor (olaylar birbirinden bağımsız da değil); kanıt, eğitim ve geliştirme eğrilerinin ayrılması. Bu tek denemeye dayanarak “yapay sinir ağı tabanlı dil modelleri Kneser-Ney’e kaybediyor” diye bir sonuç yayımlamak, hiperparametre seçimlerimiz hakkındaki bir ifadeyi mimariler hakkında bir ifade kılığına sokmak olurdu.
Dolayısıyla doğru bir sonraki adım bir hiperparametre araması yapmak, seçimi geliştirme kümesine göre yaparak. Bir dürüstlük notu: ilk denemenin test değerini (429,0) zaten okuduk ve aşağıdaki tablo her yapılandırmanın test değerini de basıyor. Seçimde kullanılmadılar, ama bu yüzden bu test sayıları bağımsız bir son değerlendirme değil, denetim için gösterilen keşif sonuçları.
### 7 configurations, ranked by dev perplexity (test shown for audit, not used to choose)
ctx emb hid drop params dev test
2 32 128 0.5 4,801,934 329.8 332.4
2 64 256 0.5 9,590,478 362.5 362.6
3 64 256 0.5 9,606,862 366.0 365.3
2 64 256 0.2 9,590,478 430.0 429.0
2 128 512 0.5 19,216,718 432.1 436.4
3 128 512 0.5 19,282,254 479.6 483.1
5 128 512 0.5 19,413,326 541.4 548.8
Bu tabloyu aşağıdan yukarıya okuyun, çünkü asıl ders sıralamada. Bu taramada, bir satır dışında, kapasitede atılan her geri adım kalitede bir ileri adım oldu. (İstisna drop=0.2 denemesi: parametre sayısı ikinci satırla birebir aynı, 9.590.478; ondan tek farkı düzenlileştirme — yalnızca dropout’u artırmak test perplexity’sini 429,0’dan 362,6’ya indirdi.) Tablo tek değişkenli bir tarama değil: bağlam, embedding, gizli katman ve dropout satırdan satıra birlikte değişiyor; dolayısıyla sıralamayı tek bir sebebe bağlayamazsınız. Denenen en büyük model — beş kelimelik bağlam ve 19,4 milyon parametre — 548,8 ile taramadaki en kötü model; düzleştirme tablosundaki bütün interpolasyonlu ve Kneser-Ney n-gram modellerinden kötü. Kazanan ise denenen en küçük model: iki kelimelik bağlam, 32 boyutlu embedding’ler, 128 birimlik bir gizli katman.
Bu, Bölüm 4’teki dersin başka bir yoldan karşımıza çıkması. Otuz sekiz bin yorum küçük bir derlem. Küçük bir derlemde bağlayıcı kısıt çoğu zaman kapasite değil veridir; fazladan parametre size eğitim kümesini ezberlemenin daha hızlı bir yolundan başka bir şey kazandırmayabilir.
ctx=5 satırı ilk bakışta “daha çok bağlam modeli kötüleştirdi” diyor gibi; ama o satırda bağlamla birlikte embedding ve gizli katman da büyüdü. Yeniden koşuda yalnızca bağlamı değiştirdik, en küçük yapılandırmayı (32/128/0,5) sabit tutarak:
### re-run: only the context changes (emb 32, hid 128, drop 0.5)
ctx params dev test
2 4,802,578 319.0 333.5
3 4,806,674 315.5 327.0
5 4,814,866 312.9 324.1
Aynı küçük ağda daha uzun bağlam yardımcı oluyor. Taramadaki ctx=5’in kötülüğü bağlamdan değil, onunla birlikte büyütülen kapasiteden geliyordu. Tek tohumluk bir ölçüm ve tarama da yedi satırdan ibaretti; ama bu tablo, bir taramanın kazananının, denenmemiş yapılandırmaların en iyisi olmadığını hatırlatıyor.
6.9.2 Sonuç, abartısız
test ppl stored numbers
Kneser-Ney trigram 333.5 1,087,421 counts
neural, ctx=2 32/128 332.4 4,801,934 parameters
Bu bir beraberlik, zafer değil. %0,3’lük bir fark, eğitimden eğitime değişkenliğin içinde kalıyor: aynı yapılandırmayı hiçbir şey değiştirmeden yeniden eğitmek, 332,4 yerine 330,3 test değeri verdi. Denemeden denemeye değişkenlik, zafer payından daha büyük. İki eğitim bir dağılım vermez; yeniden koşuda beş tohum denedik:
### re-run: neural ctx=2 32/128, five seeds, against Kneser-Ney trigrams
seed 0 1 2 3 4
neural test ppl 333.5 332.7 335.6 331.9 332.6
vs KN, d = 0.75 (336.5) -0.9% -1.1% -0.3% -1.4% -1.2%
vs KN, tuned d (320.2) +4.1% +3.9% +4.8% +3.7% +3.9%
Beş tohumun ortalaması 333,2, standart sapması 1,4. Test yorumları üzerinde eşleştirilmiş bootstrap (yalnızca test örnekleminin belirsizliği, tohumunki değil) \(d = 0{,}75\)’li Kneser-Ney’e karşı farkın beş tohumun dördünde sıfırı dışladığını gösteriyor: sinir ağı küçük ama tutarlı biçimde önde. İndirimi ayarlanmış Kneser-Ney karşısında ise beş tohumun beşinde %4 civarında geride. Yani “beraberlik”, ders kitabı ayarlı bir Kneser-Ney’e karşı bir beraberlik; sayım tarafını da ayarlayınca sayım modeli önde. İki tarafı birden iyileştirmek de bunu değiştirmiyor: bağlamı beş kelimeye çıkarılan küçük sinir ağı 324,1 (tek tohum), indirimi ayarlı Kneser-Ney 5-gram’ı 319,5. Bu sonucu “yapay sinir ağı modeli kazanıyor” diye bildiren biri fazlasını iddia ediyordur; bu abartıyı yakalamanın ucuz yolu da burada kullanılan yol — modeli birkaç kez eğitin ve karşısındaki modeli de ayarlayın.
İkinci sütuna da dikkat edin, çünkü yapay sinir ağı modellerinin daha az yer kapladığı yolundaki bilindik iddia burada yanlış: yapay sinir ağı modeli, ancak başa baş kalabildiği sayım tablosunun dört buçuk katı sayı saklıyor ve bu uygulamada saniyeler yerine iki dakikada eğitiliyor. Bunlar öğe sayıları, bayt değil: 32 bitlik ağırlıklarla sinir ağı yaklaşık 19 MB; sayım tablosunun kapladığı yer ise anahtarları ve sayıları nasıl sakladığınıza bağlı (düz Python sözlüklerinde bundan çok daha fazla, sıkıştırılmış n-gram yapılarında çok daha az). Bu sayıların neredeyse tamamı ağın iki ucunda duruyor: embedding tablosu (\(29{.}774 \times 32\)) ile çıktı katmanı (\(128 \times 29{.}774\) ağırlık artı kelime başına bir bias (sabit terim)) birlikte 4,80 milyon parametrenin 4,79 milyonunu tutuyor. Böyle bir modelin maliyetini gizli katman değil, sözlük büyüklüğü belirliyor.
Bu da bariz soruyu doğuruyor — o zaman ne diye uğraştık? İki cevabı var. Birincisi: iki model farklı yerlerde iyi olduğu için birleştirilebiliyor ve birleşimleri ikisinden de belirgin biçimde iyi (sonraki iki alt başlık). İkincisi: yapay sinir ağı modelinin perplexity’de görünmeyen özellikleri var; embedding üretiyor ve örneklediğinde eğitim metnini kopyalamıyor. Bunların hangisinin gerçekten sayım modellerinden ayrıştığını da ölçeceğiz.
6.9.3 Yapay sinir ağı modelinin üstünlüğü aslında nerede yatıyor
Test olaylarını, iki kelimelik bağlamın eğitimde hiç görülüp görülmediğine göre ikiye ayırın. İki model de aynı iki kelimeyi koşul olarak kullandığı için bölme ikisine aynı olayları veriyor; bu yüzden karşılaştırma adil. Ama iki model hem kestiricide hem parametre yapısında farklı; bölme, aradaki farkın sebebini tek başına göstermiyor. Tabloda context seen/unseen bağlamın eğitimde görülüp görülmediğini, mixture ise biraz aşağıda anlatacağımız iki modelin karışımını gösteriyor:
events KN neural mixture
all 239,055 333.5 332.4 274.4
context seen 166,375 273.1 265.9 227.4
context unseen 72,680 526.7 554.4 421.8
Son iki satıra bakın, çünkü büyük ihtimalle size öğretilenin tam tersini söylüyorlar. Modelin daha önce gördüğü bağlamlarda yapay sinir ağı modeli kazanıyor — 273,1’e karşı 265,9. Hiç görmediği bağlamlarda ise yapay sinir ağı modeli kaybediyor, hem de az farkla değil: 526,7’ye karşı 554,4.
Genelleme anlatısı bu derlemde tersine dönüyor. Yeni bağlamlarla daha iyi başa çıkan taraf, düzleştirilmiş sayım modeli. Olası bir açıklama: Kneser-Ney’in alt derece terimi tam bu duruma verilmiş, özenle tasarlanmış bir cevap — elinizde kanıt yoksa, bir kelimenin kaç farklı bağlamı tamamladığına geri çekilirsiniz. Yapay sinir ağı modeli ise hiç görmediği bir bağlamda, kendisi de seyrek ve gürültülü sayımlardan öğrenilmiş bir embedding geometrisine dayanıyor. Bunun gerçekten sebep olduğunu bu deney kanıtlamıyor; bunun için düzenlileştirmeyi, veri miktarını ve bağlam gruplarını ayrıca değiştirmek gerekir.
İndirimi ayarlanmış Kneser-Ney bölmeyi bir kez daha değiştiriyor. Yeniden koşuda (\(d = 0{,}75\) ile 276,8 / 526,6, sinir ağı 265,7 / 561,2) ayarlı Kneser-Ney görülmüş bağlamlarda 259,0, görülmemişlerde 520,6 veriyor: iki grupta da sinir ağının önünde. Görülmüş bağlamlardaki “sinir ağı kazanıyor” satırı da, ayarlanmamış bir indirime karşı kazanılmış bir avantaj.
Bunun gerçekleştiğini modelin kendi belirsizliğinde izleyebilirsiniz (effective choices: etkin seçenek sayısı, yani \(2^{H}\)):
### neural model, mean predictive entropy
context seen 7.42 bits = 171.2 effective choices
context unseen 7.83 bits = 228.0 effective choices
Model görülmemiş bağlamlarda olasılık kütlesini biraz daha çok kelimeye yayıyor. Ama bu, başının ne kadar dertte olduğunu bildiği anlamına gelmiyor. Yeniden koşuda entropiyi, modelin gerçekten gelen kelimeye verdiği olasılığın surprisal’ıyla, yani gerçek kaybıyla yan yana koyduk:
### re-run, seed 0: mean predictive entropy against mean surprisal (bits)
entropy surprisal gap
context seen 7.58 8.05 0.47
context unseen 7.81 9.13 1.32
Görülmemiş bağlamlarda belirsizlik yalnızca 0,23 bit artıyor, kayıp ise 1,08 bit. Model her iki grupta da kendinden fazla emin, ama yeni bağlamlarda çok daha fazla: temkini, gerçek zorluğunun küçük bir kısmını karşılıyor. Entropi tek başına iyi kalibre olmanın kanıtı değil; kalibrasyonu ayrıca ölçmek gerekiyor, burada yaptığımız gibi.
Bu bulguyu ne kadar genelleştirdiğinize dikkat edin. Bu, bu ölçekteki bu derlem hakkında bir sonuç: 896.000 eğitim olayı, 29.774 kelimelik bir sözlük ve iki kelimelik bağlamı olan ileri beslemeli bir model. Bölüm 8’deki ölçeklerde sinir ağları açık farkla önde ve alanın gittiği yönün sebebi de bu; ama bu bölünmüş tablonun hangi ölçekte tersine döndüğünü burada ölçmedik. Daha güçlü bir mimari de tabloyu değiştirebilir: tekrarlayan modeller (aşağıdaki Pencereden duruma başlığına bakın), Mikolov ve arkadaşlarının birkaç milyon kelimelik kurulumunda Kneser-Ney’i açık farkla geçiyordu (Mikolov vd. 2010). Bu sonucun kalıcı olarak kanıtladığı şey şu: “yapay sinir ağı modelleri daha iyi genelleme yapar” iddiası, ders kitabından varsayılacak değil, kendi verinizde ölçülecek bir iddiadır.
6.9.4 Yapay sinir ağı modellerini kalıcı kılan hamle
Bölünmüş tablodan çıkan gözlem şu: iki model farklı şeylerde iyi. Bu, birini seçmek yerine ikisini birden denemek için iyi bir gerekçe; kazancı önceden garanti etmiyor, çünkü grup ortalamaları olay olay ne olduğunu söylemez. İki dağılımı karıştırın ve tek karışım ağırlığını geliştirme kümesinde belirleyin:
\[ P(w \mid h) = \lambda \, P_{\text{KN}}(w \mid h) + (1 - \lambda) \, P_{\text{NN}}(w \mid h) \]
### dev perplexity against lambda (weight on Kneser-Ney)
0.0 329.8 0.4 272.2 0.8 283.3
0.1 296.7 0.5 270.9 <- 0.9 296.4
0.2 283.6 0.6 272.1 1.0 327.9
0.3 276.2 0.7 276.0
Eğri, 0,1 adımlı ızgarada en düşük değerine \(\lambda = 0{,}50\)’de iniyor — iki model eşit ağırlık alıyor. Bu, iki modelin tek başına eşit değerde olduğunu göstermez; yalnızca bu bölmede birlikte verdikleri olasılıkların log kaybını en çok bu ağırlığın düşürdüğünü söyler. Yeniden koşu bunu açıkça gösteriyor: indirimi ayarlanmış, sinir ağından %4 daha iyi Kneser-Ney ile karıştırınca da en iyi ağırlık yine 0,5. Test kümesini en sonda, tek seferde okuyunca:
Kneser-Ney trigram 333.5
neural 332.4
50/50 mixture 274.4 -17.4% against the better of the two
Tek tek berabere kalan iki modelden perplexity’de %17’lik bir düşüş. Bu bir numara değil ve tek bir koşunun şansı da değil. Yeniden koşuda beş tohumun her birinde kazanç %17,7 ile %18,2 arasında; test yorumları üzerinde eşleştirilmiş bootstrap aralığı %17,7 ile %18,3. Ayarlı Kneser-Ney ile karıştırınca kazanç %15,6’ya iniyor ama kalıyor.
Kazancın ne kadarının iki farklı model ailesinden geldiğini bir kontrol gösteriyor: farklı tohumla eğitilmiş iki sinir ağını aynı yoldan karıştırmak (sıradan bir topluluk, ensemble) yeniden koşuda %9,1 kazandırıyor (333,5 ve 332,7’den 302,5’e). Kneser-Ney ile karışım bunun iki katı kadar kazandırıyor; yani kazancın aşağı yukarı yarısını herhangi iki modeli ortalamak da verirdi, diğer yarısı iki farklı ailenin birbirini tamamlamasından geliyor gibi.
Benzer birleştirmeler literatürde de çalışıldı: Bengio ve arkadaşları 2003’te aynı yapıda bir bulgu bildirmişti (Bengio vd. 2003) ve sonraki yılların güçlü sistemlerinin birçoğu, bir sayım modeliyle interpolasyonla birleştirilmiş bir yapay sinir ağı modeliydi (Mikolov vd. 2010). O yıllarda tek başlarına iyi ayarlanmış bir n-gram modeliyle ancak yarışabilen ve eğitilmesi daha pahalı olan sinir ağı modellerinin kullanılmaya devam etmesinin sebeplerinden biri buydu.
Karışım en çok da, bölünmüş tablonun iki modelin en çok ayrıştığını söylediği yerde işe yarıyor: görülmemiş bağlamlarda, tek başına daha iyi olan modeli %20 iyileştiriyor — 526,7’den 421,8’e. Bu, olasılıkların birbirini tamamladığıyla uyumlu; kazancın hangi olaylarda oluştuğunu ise grup ortalaması değil, olay düzeyindeki log kayıpları gösterir.
6.9.5 Perplexity’de görünmeyen iki özellik
Perplexity, modelin iki özelliğini hiç göstermiyor: öğrendiği kelime temsillerini ve örneklediğinde eğitim metnini ne kadar tekrarladığını. İkisini de ayrıca ölçmek gerekiyor; birincisi sinir ağını gerçekten sayım modellerinden ayırıyor, ikincisi sanıldığı kadar ayırmıyor.
Birincisi, embedding’ler. Kimse onları istemedi. Bir dil modelini eğitmenin yan ürünü olarak ilk katmanda ortaya çıkıyorlar: sonraki kelimeyi kestirme hedefi, embedding tablosunu da güncelliyor. Kosinüs benzerliğine göre en yakın komşular, her kelimenin eğitimdeki sıklığıyla birlikte (yakınlık eşanlamlılık değil; başka bir görevde işe yarayıp yaramadıkları da ayrıca sınanması gereken bir soru):
güzel (7547x) harika, hoş, kaliteli, kaçırılmıyacak, kullanışlı
hızlı (3856x) zamanında, hizli, mikemmel, hizlı, ücretsiz
kargo (2472x) teslimat, gönderi, gönderim, kargolama, teslimatı
telefon (1977x) makina, alet, ürün, kavrayışı, pil
beğendim ( 657x) kaldım, getirebiliyorsunuz, memnunuz, memnunum
iade ( 158x) rica, ade, istop, verem, iptal
kalitesiz ( 143x) konsantre, lezzetlı, kapıdaydı, minicik, fileli
kargo satırında bu alt bölümün verdiği söz harfiyen yerine geliyor: teslimat, gönderi, gönderim, kargolama, teslimatı — model, Türk e-ticaretinin kargo sözlüğünü yalnızca sonraki kelimeyi kestirmeye çalışarak keşfetti. Bir de hızlı’ya bakın: komşuları arasında hizli ve hizlı yazım hataları var (bir de mükemmel yerine mikemmel). Tabloda gösterilmeyen tavsiye’nin komşuları arasında da tevsiye, tafsiye ve tasviye var. Model, bir kelimenin yazım hatalarına doğru yazılışa yakın vektörler verdi, çünkü bunlar aynı yerlerde geçiyor. Bu, onları aynı kelime olarak tanıdığı anlamına gelmiyor; yakın olmaları yeterli. Kelime düzeyindeki bir sayım tablosu bunu yapamaz; onun için hızlı ile hizli, hızlı ile kedi kadar alakasızdır. (Sayım tarafının da yolları var: metni önceden normalleştirmek ya da karakter düzeyinde saymak gibi.)
Şimdi sıklık sütununu yukarıdan aşağı okuyun, çünkü bölümün asıl uyarısı orada. Bu yedi örnekte komşular 7.547 geçişte mükemmel, 2.472’de iyi, 657’de zayıf; 143 geçişte ise kalitesiz kelimesi konsantre, lezzetlı, kapıdaydı döndürüyor — gürültü. Sıklık bunun olası sebeplerinden biri (kelimenin kaç farklı bağlamda geçtiği ve çok anlamlılığı da rol oynar); kaç geçişin yeterli olduğu yedi satırlık bir tablodan çıkmaz. Embedding’ler sihir değildir; kılık değiştirmiş sayımlardır ve altlarındaki sayımlarla birlikte, tam da Bölüm 3’te bulunduğu gibi bozulurlar. İstatistiksel gücün paylaşılması gerçek bir şey, ama bir alt sınırı var.
İkincisi: kopyalama — ama ayrım sanıldığı yerde değil.
### 8-word spans found verbatim in the training corpus
context chapter (seed 7) re-run, seeds 7 / 8 / 9
trigram, MLE 2 words 5.8% 7.0% / 6.8% / 7.2%
5-gram, MLE 4 words 91.6% 91.8% / 92.6% / 93.9%
trigram, Kneser-Ney 2 words — 1 of 9,262 spans
neural, ctx=2 2 words 0.0% (0 of 2,989) 0 of 8,385 spans
Yüzdelerden önce bağlam sütununu okuyun. %91,6, dört kelimeye koşullanan bir MLE modeline ait; yapay sinir ağı modeli iki kelimeye koşullanıyor. Bağlam uzunluğu eşitlendiğinde MLE trigram’ı %5,8 kopyalıyor, sinir ağı hiç. Ama yeniden koşudaki üçüncü satır karşılaştırmayı değiştiriyor: aynı iki kelimelik bağlamla düzleştirilmiş Kneser-Ney trigram’ı da neredeyse hiç kopyalamıyor. Kopyalayan, düzleştirilmemiş sayım; sinir ağının kopyalamaması onu MLE’den ayırıyor, Kneser-Ney’den değil.
Sinir ağı tarafında sıfır gözlem de bir sınır, garanti değil: üç tohumda 8.385 pencerenin hiçbiri eğitimde birebir geçmiyor; “üç kuralı” ile bu, birebir eşleşme oranının büyük olasılıkla %0,04’ün altında olduğunu söylüyor — sıfır olduğunu değil. Daha kısa eşleşmeleri ya da anlamca kopyalamayı bu ölçü hiç görmüyor.
Yapay sinir ağı modelinden örnekler (rastgele tohum, yani seed = 7):
fiyatına göre süper bir makina hiç bir kalite herkese tavsiye ederim…
sevimli hediye olarak aldım çok güzel çıktı olduğunu göreceksiniz…
her gün bu <unk> bütün fonksiyonları bir verilen parayı hak ediyor…
Bu metin MLE 5-gram’ının çıktısından daha kötü — dağılıyor ve bir iki yan cümleden sonra ipin ucunu kaçırıyor — ama eğitim metnini tekrarlamadan kuruluyor. Aynı bağlamlı Kneser-Ney trigram’ının örnekleri de kopya değil, ama gözle bakınca daha dağınık; bunu ölçmedik. Sinir ağını sayım modellerinden gerçekten ayıran şey bu bölümde perplexity ya da kopyalama oranı değil, embedding’ler ve (aşağıda) ölçekle birlikte neyin iyileşebildiği.
Bu bölümün adım adım yaklaştığı ödünleşim (trade-off) bu ve Kısım II’nin var olma sebebi de bu. Sayarak kurulan modeller bu derlemde ya kopyalayarak akıcı ya da kopyalamadan dağınık kaldı. Alan, cümleyi kendisi kuran ve parametrelerini benzer bağlamlar arasında paylaşan modellerin üstüne oynadı; bu modellerin ölçekle nasıl iyileştiğini Bölüm 8 gösteriyor. Sayım modellerinin çok daha büyük derlemlerde ne kadar iyileşeceğini ise bu bölüm ölçmedi.
Son olarak, Bölüm 4’teki cümle çifti, son bir kez puanlanmış hâliyle:
### log10 P(sentence), neural model
kalite iyi fiyat kötü -11.069
kalite kötü fiyat iyi -11.262 ratio 1.561
O da a cümlesini tercih ediyor, ama Kneser-Ney’in 2,933’ünden daha zayıf biçimde (1,561). Tek bir çift bir örnek, bir benchmark değil: genel bir sıralamayı da, iki modelin anlamı ne kadar kavradığını da ölçmüyor. 4. bölümün açık bıraktığı soruya cevap verdik — sıralı bir dizinin artık bir olasılığı var — ve cevap, kurgunun ima ettiği kadar zafer dolu değil; asıl ders de zaten bu.
6.10 Pencereden duruma
Bu bölümdeki her şeye rağmen ayakta kalan bir sınırlama var. Buraya kadarki her model — sayım tabanlı olsun, yapay sinir ağına dayalı olsun — sabit boyutlu bir pencereye koşullanıyor. Pencereyi genişletmenin bir bedeli var: ileri beslemeli bir ağda girdi katmanı pencereyle birlikte büyüyor, n-gram tablosu da seyrekleşiyor. Bu derlemde küçük ağ beş kelimelik pencereyi henüz kaldırabildi (yukarıdaki ablasyon); taramanın kötü ctx=5 satırında ise pencereyle birlikte kapasite de büyütülmüştü. Ama pencere ne kadar genişlerse genişlesin sabit: ondan eskisi hiç görülmüyor.
Tekrarlayan ağlar (recurrent neural network, RNN) (Elman 1990) pencereyi ortadan kaldırır. \(n-1\) embedding’i birleştirmek yerine, kelimeleri teker teker işleyip bir gizli durumu (hidden state) ileri taşırlar:
\[ h_t = \tanh(W_{h} h_{t-1} + W_{x} x_t), \qquad P(w_{t+1} \mid w_1 \ldots w_t) = \operatorname{softmax}(W_o h_t) \]
Koşullama çizgisinin sağında artık ön ekin tamamı var: son \(n-1\) kelime sınırı yok, geçmişin her parçası \(h_t\)’ye bir yoldan ulaşabiliyor. Markov varsayımı — bu bölümün ilk şeklindeki modelleme varsayımı — bu biçimiyle ortadan kalktı. Ama dikkat: model ön eki kelimesi kelimesine saklamıyor, sabit boyutlu \(h_t\)’de özetliyor (aşağıda). Mikolov ve arkadaşlarının (Mikolov vd. 2010) dil modellemesine uyguladığı bu yaklaşım, kendi kurulumlarında günün en iyi n-gram sistemlerini geçti; LSTM’ler (Hochreiter ve Schmidhuber 1997) ise uzun menzilli bağımlılıkları öğrenmeyi pratikte mümkün kılacak kadar kolaylaştırdı.
Tekrarlayan dil modellerinin karşılığını vermesinin Elman’dan Mikolov’a yirmi yıl sürmesinin bir nedeni var: gradyanlarını eğitmek zor. \(h_t\)’nin \(h_{t-k}\)’ye göre türevini almak, \(k\) tane Jacobian’ı (bir vektörün başka bir vektöre göre kısmi türevlerinin matrisi) birbiriyle çarpmak demek. Bir tanh birimi için her çarpan \(\operatorname{diag}(1 - h_t^2)\,W_h\) biçiminde — tekrarlayan ağırlıklar, ama ağın fiilen izlediği yörünge boyunca aktivasyon türeviyle ölçeklenmiş hâlde. Kaybolan ya da patlayan şey, bu çarpanların tekrarlanan çarpımları (Bengio vd. 1994). Tekrarlayan ağırlıklar ölçeği belirliyor; tek başlarına sonucu belirlemiyorlar. Skaler bir \(W_h = 2\), birim doyuma ulaşana kadar patlayıcı görünür: \(h_t = 0{,}99\)’da yerel türev \((1 - 0{,}99^2)\times 2 = 0{,}0398\) ve gradyan küçülüyor. Pratikte patlamayı durdurmak için gradyan normunu kırpıyorsunuz (Pascanu vd. 2013), kaybolmayı hafifletmek için de mimariyi değiştiriyorsunuz — bir LSTM’in hücre durumu bir ağırlık matrisiyle çarpılmıyor; yeni bilgi onun üstüne ekleniyor. Bu da gradyana, üzerinde tekrarlanan \(W_h\) bulunmayan bir yol açıyor. Ama o yol da sönümsüz değil: her adımda unutma kapısıyla ölçekleniyor; dolayısıyla değeri 1’in altında kalan bir kapı, gradyanı yine geometrik olarak küçültüyor. Mimari uzun menzilli öğrenmeyi mümkün kılıyor, ama kendiliğinden gerçekleştirmiyor.
Ama \(h_t\)’nin ne olduğuna yakından bakın: sabit boyutlu tek bir vektör. Keyfî uzunluktaki bir geçmişten işe yarayan her şeyi bu vektör taşımak zorunda.
Pencereyi kaldırmak darboğazı kaldırmadı; yerini değiştirdi. Kısıt “yalnızca son dört kelimeye bakabilirsin” olmaktan çıkıp “kelime kelime sıkıştırarak birkaç yüz sayıya (örneğin 512) ne sığıyorsa onu hatırlayabilirsin” hâline geldi.
Bir de ikinci bir bedel var ve sonradan bunun daha önemli olduğu ortaya çıktı. \(h_t\), \(h_{t-1}\)’e bağlı olduğu için hesaplama doğası gereği sıralı — bin token’lık bir belge, konumlar boyunca paralelleştirilemeyen bin adım demek. Ancak aynı anda çok iş yaptığında hızlı olan GPU’larda bu ciddi bir dezavantaj.
Demek ki iki darboğaz var: bir sıkıştırma darboğazı ve bir sıralılık darboğazı. Bölüm 7, ikisini birden hafifleten mimariyi anlatıyor: her konum, sonlu bir pencere içinde kendinden önceki her konuma tek bir duruma sıkıştırmadan doğrudan bakıyor ve eğitimde bütün konumların hesabı paralel yapılabiliyor. İkisini tümden kaldırmıyor: pencere yine sonlu, temsiller yine sonlu boyutlu ve metin üretirken her yeni token yine bir öncekini bekliyor. Bu bölümdeki her şey, bu adımın neden değerli olduğunun gerekçesi.
6.11 Aralarında seçim yapmak
İki model, neredeyse aynı perplexity ve birbirinden çok farklı faturalar. Hangisini gerçekten yayına alırdınız?
| n-gram + Kneser-Ney | İleri beslemeli yapay sinir ağı dil modeli | |
|---|---|---|
| Buradaki test perplexity’si | 333,5 (\(d = 0{,}75\)); indirim ayarlanınca ~320 (yeniden koşu) | 332,4; yeniden koşuda beş tohumda 331,9–335,6 |
| Bu uygulamada eğitim süresi | saniyeler | ~2 dakika, dizüstü GPU’sunda |
| Yeni bağlamlar | daha iyi — 526,7 | daha kötü — 554,4 |
| Görülmüş bağlamlar | 273,1; indirim ayarlanınca 259,0 (yeniden koşu) | 265,9: \(d = 0{,}75\)’e karşı önde, ayarlı Kneser-Ney’in gerisinde |
| Örneklerken eğitim metnini tekrarlıyor mu | Kneser-Ney ile neredeyse hiç (trigram: 9.262 pencerede 1); düzleştirilmemiş MLE ile evet (\(n=3\)’te %5,8, \(n=5\)’te %91,6) | 2.989 pencerede 0 (yeniden koşuda 8.385’te 0); daha kısa eşleşmeler ölçülmedi |
| Embedding veriyor mu | kelime düzeyindeki bu kurulumda hayır | evet, modelin parametresi olarak; başka bir görevde yararı ayrıca sınanmalı |
| Veri eklemek | saniyeler içinde yeniden eğitilir | dakikalar içinde yeniden eğitilir |
| Daha çok veriden getiri | 19.000 → 38.000 yorumda ~%16 iyileşiyor (yeniden koşu); daha büyük ölçek ölçülmedi | bu bölümde ölçülmedi; büyük ölçekteki kanıt Bölüm 8’de |
| Hata ayıklanabilirlik | sayımlara ve geri çekilme katkılarına bakarsınız | okunacak sayım yok; olay düzeyinde log kayıplar, embedding komşuları, aktivasyonlar ve örnekler incelenebilir |
Pratik okuma, yalnızca perplexity’ye ve maliyete bakarak: bu ölçekte n-gram modelini kullanın ve indirimini ayarlayın; gücünüz yetiyorsa ikisini birden kullanın — karışım, ayarlı Kneser-Ney’e karşı bile %16 kazandırıyor. Gerçekten yayına almak için hedef görevdeki başarıyı, gecikmeyi, belleği ve çıktının eğitim verisiyle örtüşmesini ayrıca ölçmeniz gerekir.
Yapay sinir ağı modeli yerini bu derlemdeki perplexity’siyle ya da kopyalama oranıyla hak etmiyor; o oran onu yalnızca düzleştirilmemiş sayımdan ayırıyor. Hak ettiği yer iki başka satırda: embedding üretiyor ve yüz kat daha fazla veriden aldığı getirinin sürüp gitmesi bekleniyor (bu bölüm bunu ölçmedi; ölçekteki kanıtı Bölüm 8 gösteriyor). Bu bir eğim karşılaştırması; saymanın artık iyileşmediği iddiası değil. Bu, geleceğe oynanmış bir bahis ve bu bölüm, kitapta bahsin yatırıldığı an.
6.12 Sezgi kontrolleri
NotYapay sinir ağı tabanlı dil modeliniz n-gram baseline’ınızı 40 puan geçiyor. Meslektaşınız tek bir soru soruyor. Nedir?
“Sözlük aynı mı?” Token başına perplexity yalnızca aynı test metnini, aynı sözlüğü, aynı tokenization’ı ve aynı olay tanımını paylaşan modeller arasında doğrudan karşılaştırılabilir. Perplexity’nin size söylemedikleri başlığı altındaki tablo, yalnızca sıklık eşiğini değiştirerek (ve sayımları o eşikle yeniden kurarak) aynı yöntemi 752,5’ten 10,9’a taşıdı. Yapay sinir ağı modeli 30 binlik bir sözlükle, baseline (karşılaştırma modeli) ise 72 binlikle eğitildiyse, o 40 puan bir sonuç değil, tümüyle <unk> oranının yan etkisi olabilir. Sözlük aynıysa sıradaki soru: </s> olayları ve kaybın ortalaması aynı biçimde mi sayıldı, ve baseline ayarlandı mı? Bu bölümdeki “beraberlik” de, ayarlanmamış bir Kneser-Ney indirimine karşıydı.
NotTaramayı neden en küçük yapay sinir ağı modeli kazandı?
Çünkü 38.000 yorum küçük bir derlem ve bağlayıcı kısıt kapasite değil, kanıt. Eğitim olayı başına kabaca on bir parametre düşen 9,6 milyon parametreli ilk deneme bile eğitim kümesini ezberledi ve geliştirme kümesi perplexity’si 3. epoch’tan sonra yeniden yükselmeye başladı; olay başına kabaca 22 parametre düşen 19,4 milyon parametreli model ise daha da kötü sonuç verdi. Model kapasitesi veri kümesinin büyüklüğüne göre seçilmeli; bunu da tarama yaparak öğrenirsiniz. Ama bu tarama “küçültmeye devam edin” demiyor: satırlar arasında bağlam, boyut ve dropout birlikte değişti. Yalnızca bağlamı değiştirdiğimiz ablasyonda en küçük ağ beş kelimelik bağlamla daha iyiydi (333,5’ten 324,1’e). Doğru sonraki adım, kapasiteyi, bağlamı ve düzenlileştirmeyi ayrı ayrı değiştiren yeni geliştirme koşuları.
Notİki model 333’te berabere kalıyorsa, karıştırmak neden %17 kazandırıyor?
Çünkü farklı şeylerde yanılıyorlar. Görülmüş ve görülmemiş bağlama göre yapılan bölme, yapay sinir ağı modelinin tanıdık bağlamlarda önde (265,9’a karşı 273,1), yeni bağlamlarda geride (554,4’e karşı 526,7) olduğunu gösteriyor; dolayısıyla bir karışım, her olay türünde hangi model daha iyiyse ondan yararlanabiliyor. Olay olay hangisine güveneceğini bilmiyor: her zaman ortalama alıyor ve getiriyi sağlayan da bu ortalama. Grup tablosu bunu araştırmak için iyi bir ayrım, ama %17’yi tek başına açıklamıyor: farklı tohumlu iki sinir ağının karışımı da %9,1 kazandırıyor (yeniden koşu). Kazancın yarısı kadarını sıradan ortalama, kalanını iki ailenin farklılığı veriyor gibi; bunu kesin ayırmak için olay düzeyindeki log kayıplara bakmak gerekir.
Genel iddiada dikkatli olun, çünkü onun alışıldık hâli yanlıştır. İnterpolasyonun garanti ettiği şey daha zayıf: Jensen eşitsizliği gereği karışımın log kaybı, iki modelin log kayıplarının \(\lambda\) ağırlıklı ortalamasından hiçbir zaman daha kötü olamaz — yani karışım daha kötü modelden hiçbir zaman daha kötü değildir. Burada “daha iyidir” değil, “daha kötü değildir” demek gerekir: \(\lambda\) 0 ya da 1 iken, ya da iki model her olaya aynı olasılığı verdiğinde eşitsizlik bir eşitliğe dönüşür. Karışımın daha iyi olanı geçmesi için iki modelin güçlü yanlarının gerçekten birbirini tamamlaması gerekir; zayıf bir modeli güçlü bir modele kötü seçilmiş bir \(\lambda\) ile eklemek sonucu bozar. Sizi koruyan şey \(\lambda\)’yı ayrılmış veride belirlemektir; değeri gerekirse 0’a ya da 1’e kadar gidebilir. Ama geliştirme verisinde seçilmiş bir ağırlık yine de bir bahistir: aynı dengenin test kümesinde de geçerli olacağına oynanır. Karışımın orada en iyi bileşenini geçeceğini garanti etmez. Burada 0,50 çıktı, ama bu iki modelin tek başına aynı değerde olduğunu göstermiyor: yeniden koşuda sinir ağından %4 daha iyi olan ayarlı Kneser-Ney ile de en iyi ağırlık 0,50. Ağırlık, iki modelin birlikte verdiği olasılıkların log kaybını en çok neyin düşürdüğünü söylüyor.
NotBir 5-gram modeli akıcı Türkçe yazıyor. Bu neden iyi değil de kötü haber?
Çünkü (düzleştirilmemiş, MLE) 5-gram’ın ürettiği sekiz kelimelik pencerelerin %91,6’sı eğitim verisinde birebir geçiyor; trigram için bu oran %5,8. Bu akıcılık büyük ölçüde ezberden okuma. Sebebi seyreklik: eğitimdeki 5-gram’ların %98’i bir kez geçiyor, dolayısıyla dört kelimelik bir bağlam çoğu zaman tek bir devama izin veriyor — geçen sefer gelen devama. Bu, bütün yorumların kopya olduğu ya da hukuki anlamda bir intihal hükmü değil; ama modelin çıktısı, eğitim verisiyle örtüşmesi denetlenmeden kullanıcıya gösterilmemeli. Pencere uzunluğunu, tohumu ve daha uzun eşleşmeleri de kontrol edin. Düzleştirme kopyalamayı neredeyse sıfırlıyor (Kneser-Ney 5-gram’ı %2 civarı) ama akıcılığı da götürüyor. Daha fazla verinin bu dengeyi nasıl değiştireceğini ise bu bölüm ölçmedi.
6.13 Mülakat soruları
Kaynak belirtme üzerine — Bölüm 2’deki çekincenin aynısı. Bunlar, ikisi de ücretsiz olan iki güvenilir açık kaynakta tekrar tekrar karşımıza çıkan sorular: Chip Huyen’in Introduction to Machine Learning Interviews kitabı (Huyen 2021) ve AIMLInterviews. Kaynak göstermeden “X şirketinin sorduğu sorular” diye liste veren sayfalara temkinle yaklaşın; bir soruyu bir şirkete atfetmek için doğrulanabilir bir kaynak arayın.
Perplexity’yi tanımlayın, sonra neyi ölçmediğini söyleyin. Cevap, token başına ortalama negatif log-olabilirliğin üssü — yani etkin dallanma çarpanı. Ölçmedikleri: herhangi bir alt görevdeki yararlılık. Ayrıca test metni, sözlük, tokenization ya da
</s>sayımı farklı olan modeller arasında token başına değerler doğrudan karşılaştırılamaz; iki model de ham metne kayıpsız olasılık veriyorsa bayt başına bit gibi ortak bir birime geçilebilir. Formülü verip susan adaylar sorunun yarısını cevaplamıştır.Add-one düzleştirmesi neden bu kadar kötü sonuç veriyor? Çünkü olasılık kütlesini kanıtla değil, sözlük büyüklüğüyle orantılı olarak dağıtıyor.
kargokelimesinden sonra 516 gözlenmiş, 29.257 gözlenmemiş devam var; dolayısıyla add-one olasılığın %90,7’sini hiç görülmemiş şeylere veriyor. Kusur düzleştirme yapması değil, ima ettiği önselin (prior) bu koşullarda fena hâlde yanlış olması: destek büyük (29.773) ve bağlam sayımı ona göre küçük (2.472) olduğunda, her türe bir sözde sayım vermek kanıtı ezer.Kneser-Ney’in devam sayımı, ham sayımın yapmadığı neyi yapıyor? Bir kelimenin ne sıklıkta geçtiğini değil, kaç farklı bağlamı tamamladığını soruyor.
Franciscosık geçiyor ama neredeyse her zamanSan’dan sonra geliyor; bu yüzden devam sayımı düşük ve yeni bir bağlamda haklı olarak kötü bir tahmin oluyor. Ham sıklık ise tam tersini söylüyor.Elinizde 10 milyon token var. 5-gram mı, yapay sinir ağı mı? Beklenen cevap bir karşı soru — görev ne? Yalnızca perplexity söz konusuysa, iyi ayarlanmış bir n-gram modeli saniyeler içinde eğitilen güçlü ve ucuz bir baseline’dır; indirimini ayarlamayı unutmayın. Ama bu bölümdeki sonucun sınırlarını bilin: o sonuç, bir milyonun altında token üzerinde küçük bir ileri beslemeli modele ait. İyi düzenlileştirilmiş tekrarlayan ya da transformer modeller yayımlanmış kıyaslamaların çoğunda bu büyüklükte Kneser-Ney’i geçiyor, ama bunu kendi verinizde, aynı test tanımıyla ve iki tarafı da ayarlayarak ölçün. Embedding’lere ihtiyacınız varsa, metni kopyalamadan akıcı biçimde üretmesi gerekiyorsa ya da derlemin kat kat büyümesini bekliyorsanız yapay sinir ağı modelini güçlü bir aday olarak deneyin; gecikme ve hesap bütçesini de hesaba katın.
Alan neden RNN’leri bırakıp transformer’lara geçti? İki darboğaz var ve mülakatçıların duymak istediği cevap ikincisi. Sıkıştırma: sabit boyutlu bir gizli durum, sınırsız bir geçmişi tutmak zorunda. Sıralılık: \(h_t\), \(h_{t-1}\)’e bağlı; dolayısıyla \(T\) uzunluğunda bir belge, eğitimde bile paralelleştirilemeyen \(T\) adıma mal oluyor ve bu, alanın tam da satın almaya başladığı donanımı boşa harcıyor. Transformer eğitimde konumları paralel hesaplıyor ve sonlu bir penceredeki her konuma doğrudan bakıyor; ama metin üretirken yeni token’lar yine teker teker seçiliyor.
Bildirilen bir perplexity’nin yanıltıcı olduğunu nasıl anlarsınız? Test metnini, sözlük büyüklüğünü, test kümesindeki
<unk>oranını, tokenizer’ı,</s>olaylarının sayılıp sayılmadığını ve toplam log kaybını sorun. %54,8<unk>oranıyla bildirilen 10,9 perplexity, yüzey biçimlerini kestirme başarısı olarak okunamaz: test kelimelerinin yarısından fazlası için kestirilen şey<unk>, kalanı da küçülmüş bir sözlükteki sık kelimeler.
6.14 Daha derine inmek için
| kaynak | ne olduğu |
|---|---|
| The spelled-out intro to language modeling: building makemore — Andrej Karpathy | karakter düzeyinde bir modeli sayımlardan başlayarak kuruyor; bu bölümün izlediği yolun aynısı, üstelik çalıştırabileceğiniz kodla |
| Large Language Models explained briefly — 3Blue1Brown | yedi dakikalık bir video; “sonraki token’ı tahmin et” ilkesini görselleştiren kısa bir giriş; bu bölümdeki olasılık hesabının yerini tutmaz |
| Speech and Language Processing — Jurafsky & Martin | 3. bölüm çevrimiçi ve ücretsiz; n-gram’ların, düzleştirmenin ve perplexity’nin klasik ele alınışı |
| Stanford CS224N | dil modelleme dersleri, slaytları ve ödevleriyle |
kenlm |
hızlı n-gram dil modeli kurmak ve sorgulamak için yaygın bir kütüphane; bir kelime dizisinin hızlı ve ucuz olasılığına ihtiyaç duyduğunuzda iyi bir seçenek |
- Speech and Language Processing, 3. bölüm (Jurafsky ve Martin 2026). N-gram’ların, düzleştirmenin ve perplexity’nin klasik anlatımı; çevrimiçi ücretsiz ve bu bölümdeki terimlerin çoğunun geldiği kaynak.
- An empirical study of smoothing techniques (Chen ve Goodman 1999). Düzleştirme yöntemlerini aynı koşullarda, düzgünce çalıştırarak karşılaştıran makale; değiştirilmiş Kneser-Ney’in öne çıktığı karşılaştırma bu. Sonuçların hangi veri ve ölçütlerde geçerli olduğunu da okuyun. Ampirik karşılaştırmanın nasıl yapılacağına dair bir örnek.
- A neural probabilistic language model (Bengio vd. 2003). Artık kendiniz bir tane kurduğunuza göre okumaya değer: makalenin 1. bölümündeki argüman, yukarıdaki istatistiksel gücü paylaşma argümanı — üstelik onu ikna edici biçimde gösterecek donanım daha ortada yokken yazılmış.
- Prediction and entropy of printed English (Shannon 1951). Yetmiş beş yaşında ve bir dil modelinin ne işe yaradığına dair hâlâ en net ifade.
- Recurrent neural network based language model (Mikolov vd. 2010). Tekrarlayan dil modellerinin n-gram’ları açıkça geçtiğini gösteren makalelerden biri. Sonuç tablosu için okuyun: kendi kurulumunda RNN açık ara kazanıyor ve bir n-gram modeliyle interpolasyonla birleştirildiğinde daha da fazla kazanıyor — yani bu bölümdeki 50/50 sonucunun daha büyük ölçekteki hâli. N-gram’lar bundan sonra da birçok uygulamada kullanılmaya devam etti.
- KenLM (Heafield 2011). Bir gün üretimde n-gram modeline ihtiyacınız olursa — cihaz üstü konuşma tanıma ve klavye kestirimi için hâlâ oluyor — ilk bakılacak kütüphanelerden biri; bellek, sözlük ve lisans koşullarını kendi kullanımınıza göre değerlendirin.
6.15 Alıştırmalar
- Felaketi yeniden üretin. Bigram MLE modelini kurun ve sıfır olasılık atadığı ilk test bigram’ını bulun. İki kelimeyi yazdırın. Sonra “düzleştirme” kelimesini kullanmadan açıklayın: daha fazla Türkçe yorum verisi bu belirli bigram’ı görünür kılabilir; peki yeni test metinlerinde görülmemiş birleşimler neden yine ortaya çıkıyor?
- Add-one otopsisi.
kargobağlamı için, add-one’ın 516 gözlenmiş devama ve diğer 29.257’ye toplamda ne kadar olasılık verdiğini hesaplayın; destek \(V = 29{.}773\) (29.771 kelime,<unk>ve</s>). Sonra bu iki kütlenin eşitlendiği \(k\) değerini bulun ve ayarlanmış \(k = 0{,}003\) ile karşılaştırın. - Geçiş noktasını kaydırın. İnterpolasyon ağırlıkları 4-gram’lara 0,0003 veriyor (5-gram modelinin içinde 0,0001). Modeli 5.000, 10.000, 20.000 yorumla ve 38.000 yorumun tamamıyla, aynı sözlük ve aynı geliştirme düzeniyle yeniden eğitin; belirlenen \(\lambda\) değerlerinin ve geliştirme perplexity’sinin derlem büyüklüğüyle nasıl değiştiğini, birkaç rastgele altküme tohumuyla çizdirin. 4-gram ağırlığındaki değişim hangi büyüklükte tohumlar arası dalgalanmadan ayrılıyor? Tek bir evrensel eşik varsaymadan eğilimi yorumlayın.
- Perplexity’yi bilerek kırın. Sözlük tablosunu yeniden üretin, sonra modelinizin bir okurun oyunu fark etmesini sağlayacak iki cümlelik tanımını yazın. Bu, kodlama alıştırması olduğu kadar bir yazma alıştırması.
- Kopyalamayı ölçün. Birebir parça ölçümünü 4-gram ve 6-gram’lara genişletin ve kopyalama oranını \(n\)’e karşı, hem MLE hem Kneser-Ney modelleri için ve birkaç tohumla çizdirin. Bölüm MLE için \(n=3\)’te %5,8, \(n=5\)’te %91,6 bildiriyor; eğrinin keskin biçimde yukarı döndüğü yeri bulun ve bu konumu seyreklik tablosundaki tek geçen n-gram (singleton) yüzdeleriyle yan yana koyun. İkisinin birlikte değişmesi tek başına sebep kanıtı değil; pencere uzunluğunu da değiştirip sonucun ne kadar değiştiğine bakın.
- Bölmeyi yeniden üretin. Görülmüş/görülmemiş bağlam tablosunu yeniden hesaplayın, ama test olaylarını bağlamın görülüp görülmediğine göre değil, hedef kelimenin sıklığına göre ayırın;
<unk>olaylarını ayrı bir grup olarak raporlayın. Yapay sinir ağı modelinin üstünlüğü sık kelimelerde mi, nadir kelimelerde mi yatıyor? Sonucun, embedding’lerin istatistiksel gücü paylaştığı iddiasıyla tutarlı olup olmadığını tartışın; bu bölmenin mekanizmayı tek başına kanıtlayamayacağını da belirtin. - Karışımı bozun. 50/50 interpolasyon perplexity’yi %17 düşürdü; bölüm, farklı rastgele tohumlarla (seed) eğitilmiş iki yapay sinir ağı modelinin karışımının %9,1 kazandırdığını bildiriyor. Bu kontrolü üç ile beş tohum çiftiyle, Kneser-Ney + sinir ağı karışımıyla aynı geliştirme ve test düzeninde tekrarlayın; tek modellerin perplexity’lerini ve karışım ağırlıklarını raporlayın. Sonra olay düzeyindeki log kayıplarda iki karışımın nerede ayrıştığını gösterin. Bu iki koşulun %17’yi “sıradan topluluk (ensemble)” ve “farklı model ailesi” paylarına neden kesin biçimde ayıramadığını açıklayın.
- Türkçeye özgü bir sınama. Türkçede olumsuzluk bir ektir; bu yüzden
beğendimilebeğenmedimfarklı kelimelerdir. Her modelin olumlu bir bağlamdan sonra olumsuz biçime ne kadar olasılık kütlesi verdiğini ölçün; bağlamları ve kelime sıklıklarını eşleştirerek karşılaştırın ve farkları kelime temsili ve ek bilgisi açısından yorumlayın. İngilizceyle karşılaştırmak isterseniz eşdeğer bir İngilizce derlem, aynı görev ve aynı tokenization düzeni kurmanız gerekir; tek dilli bir ölçümden “Türkçede daha iyi/kötü” sonucu çıkmaz. - Diğer yön. Aynı yorumlar üzerinde karakter düzeyinde bir n-gram modeli eğitin. Perplexity’sini bildirin, bu sayının bu bölümdeki hiçbir sayıyla doğrudan karşılaştırılamayacağını açıklayın ve sonra karşılaştırılabilecek bir nicelik bulun. İpucu: bayt başına bit, ancak iki model de ham metne kayıpsız olasılık veriyorsa işe yarar; kelime modeli
<unk>ile yüzey biçimlerini kaybediyorsa bunu nasıl ele aldığınızı yazın.