Ders 25 / 26
Damıtma
Büyük modelin etiketlediği 240 kurgu kayıtla eğitilen küçük bir modelin, yalnız altı insan etiketiyle eğitilen aynı modele göre ne kazandığının iki görevde ölçülmesi: konu görevinde 0,5000'den 0,6333'e çıkıyor ve öğretmenin isabetinin tamamını yakalıyor, ama 240 insan etiketinin verdiği 0,9000'e göre açığın yalnız üçte birini kapatıyor. Ayrı konu sayma görevinde damıtma geri götürüyor, 0,5833'ten 0,3667 ve 0,2417'ye düşüyor, çünkü öğretmen saymıyor. Damıtılmış modelin hatalarının 0,9545'i öğretmenin de yanıldığı kayıtlarda, altı etiketle eğitilende bu pay 0,3000.
İçindekiler
Bir önceki derste büyük modelin ağırlıkları elimizdeydi ve onların bir kısmını oynattık. Çoğu durumda elde ağırlık yoktur; elde olan tek şey, büyük modelin verdiği yanıtlardır. Bu yanıtlar bir etiket kümesi gibi kullanılıp küçük bir modelin eğitiminde girdi yapılabilir. Yapılan iş damıtmadır: büyük modelin davranışı, onun binde biri kadar sayı taşıyan bir modele aktarılmaya çalışılır.
Damıtmanın çekiciliği açıktır. İnsan etiketi pahalıdır, model etiketi ise bir çağrıdır. Ölçülmesi gereken şey de bu yüzden tek bir sayı değildir: küçük model öğretmenin isabetinin ne kadarını yakalıyor, aynı emeği insan etiketine harcasaydık nereye varırdık, ve hangi görevde bu aktarım hiç çalışmıyor.
- YM36. Kod bir benzeticidir. Büyük model, küçük model ve kayıtların tamamı kurgudur; gerçek bir uç nokta çağrılmaz. Tohum 20260218.
- YM37. Kayıt bir gövde cümlesi ve en çok iki kısa ektir. Etiketlerden biri konu (gövdenin konusu, beş sınıf), öteki ayrı konu adedi (metinde geçen ayrı konu sayısı, dört sınıf). Kayıtların bir payında gövde konuyu ele vermez.
- YM38. Büyük model konuyu bir anahtar tablosundan puanlar, ayrı konu adedini ise saymaz; uzunluk sınıfından tahmin eder. İkinci davranış, dil modellerinin sayma görevlerindeki zayıflığının kurgu karşılığıdır ve M28’in ilk kursunda ölçülmüştü.
- YM39. Küçük model belirteç torbasından doğrudan sınıfa giden tek bir dizeydir; öğretmenin taşıdığı yapının hiçbirini taşımaz. Eğitimi ders içinde yazılır.
- YM40. Üç kaynak karşılaştırılır: altı insan etiketi, iki yüz kırk öğretmen etiketi ve iki yüz kırk insan etiketi. Sonuncusu bir üst sınırdır, gerçek bir seçenek değil.
- YM41. İki koşum öğretmenin etiketleme tohumu değiştirilerek alınır (20260218 ve 20260219); kayıtlar ve sınama kümesi iki koşumda da aynıdır.
Öğretmen ve İki Görev
Damıtmanın sınırı öğretmenin kendisidir; bu yüzden önce öğretmen ölçülür. İki görev bilerek farklı seçildi: biri anahtar sözcük eşlemesiyle çözülebilen bir sınıflandırma, öteki metinde geçen ayrı konuların sayılması.
# BENZETICI -- KURGUDUR. Buyuk model, kucuk model ve kayitlarin tamami ders icinde # yazilir; gercek bir uc nokta cagrilmaz. Tohum 20260218. from math import exp TOHUM, M32 = 20260218, 0xFFFFFFFF def uretec(t): x = ((t ^ (t >> 16)) * 2246822507) & M32 x = ((x ^ (x >> 13)) * 3266489909) & M32 s = [(x ^ (x >> 16)) & M32] def sonraki(): s[0] = (s[0] * 1664525 + 1013904223) & M32 return s[0] / 4294967296 return sonraki def ayrik(u, w): t = 0.0 for i, x in enumerate(w): t += x if u < t: return i return len(w) - 1 def belirtecle(m): # KURGU belirtecleyici, parca en cok bes damga b = [] for s in m.lower().replace(",", " , ").split(): while len(s) > 5: b.append(s[:5]) s = s[5:] b.append(s) return b KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"] GOVDE = [("fatura tutari gecen aya gore yuksek geldi", "fatura"), ("faturami odedim ama sistemde borc gorunuyor", "fatura"), ("evde su akmiyor bir ariza var galiba", "ariza"), ("baglanti bozuk oldu ve hic calismiyor", "ariza"), ("sayac okumasi yanlis girilmis endeks tutmuyor", "sayac"), ("sayac degisimi icin randevu istiyorum", "sayac"), ("hangi tarife basamagindayim ogrenmek istiyorum", "tarife"), ("birim ucret abone tipine gore degisiyor mu", "tarife"), ("mahallede kesinti var ne zaman gelecek", "kesinti"), ("planli kesinti duyurusu nereden takip edilir", "kesinti")] KISA = {"fatura": "fatura notu", "ariza": "ariza kaydi", "sayac": "sayac formu", "tarife": "tarife grubu", "kesinti": "kesinti plani"} BELIRSIZ = ["gecen hafta bir sorun yasadim yardim gerekiyor", "bu durumu kime iletmem gerektigini bilmiyorum"] def kayitlar(n, tohum): """Bir govde cumlesi ve en cok iki kisa ek. Konu govdeninkidir; sayi ayri konu adedidir.""" r, k = uretec(tohum), [] for i in range(n): c = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])] if r() < 0.10: # govde konuyu ele vermiyor m, gecen = BELIRSIZ[int(r() * 2)], [] else: aday = [x for x in GOVDE if x[1] == c] m, gecen = aday[int(r() * len(aday))][0], [c] for esik in (0.62, 0.45): if r() < esik: b = KONU[int(r() * 5)] if b not in gecen: m += " ayrica " + KISA[b] gecen.append(b) k.append({"metin": m, "konu": c, "sayi": len(gecen)}) return k ETIKETLI = kayitlar(6, TOHUM + 1) # insan etiketi pahalidir: alti kayit ETIKETSIZ = kayitlar(240, TOHUM + 2) # etiketsiz yigin SINAMA = kayitlar(120, TOHUM + 3) IZ = {"fatur": "fatura", "tutar": "fatura", "borc": "fatura", "odedi": "fatura", "ariza": "ariza", "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza", "sayac": "sayac", "endek": "sayac", "okuma": "sayac", "randev": "sayac", "tarif": "tarife", "birim": "tarife", "abone": "tarife", "basam": "tarife", "kesin": "kesinti", "duyur": "kesinti", "mahal": "kesinti", "planl": "kesinti"} TUZAK = {"notu": "fatura", "kaydi": "ariza", "formu": "sayac", "grubu": "tarife", "plani": "kesinti"} # kisa ekler tabloda tam agirlikla duruyor CAGRI = [0, 0] def buyuk_model(metin, tohum, sicaklik=0.50): """KURGU buyuk model. Konuyu anahtar tablosundan puanlar; sayi gorevini SAYMAZ, uzunluk sinifindan tahmin eder. Ikinci davranis M28'in sayma zayifligina karsilik gelir.""" CAGRI[0] += 1 bel = belirtecle(metin) CAGRI[1] += len(bel) p = {k: 0.12 for k in KONU} for t in bel: for tablo, w in ((IZ, 1.0), (TUZAK, 0.70)): if tablo.get(t) in p: p[tablo[t]] += w r = uretec(tohum ^ sum((i + 1) * ord(c) for i, c in enumerate(metin))) ad = sorted(p) e = [exp(p[a] / sicaklik) for a in ad] s = sum(e) konu = ad[ayrik(r(), [x / s for x in e])] uzun = 0 if len(bel) <= 7 else (1 if len(bel) <= 10 else 2) sayi = ayrik(r(), ([0.10, 0.56, 0.24, 0.10], [0.06, 0.32, 0.40, 0.22], [0.04, 0.20, 0.36, 0.40])[uzun]) return konu, sayi def olc(kume, tohum): dk = ds = 0 for x in kume: k, s = buyuk_model(x["metin"], tohum) dk += k == x["konu"] ds += s == x["sayi"] return dk / len(kume), ds / len(kume) dag = {} for x in SINAMA: dag[x["sayi"]] = dag.get(x["sayi"], 0) + 1 print("sinama kayit", len(SINAMA), ", ayri konu adedi dagilimi", dict(sorted(dag.items()))) print("ornek kayit:", SINAMA[1]["metin"]) print(" konu", SINAMA[1]["konu"], ", ayri konu adedi", SINAMA[1]["sayi"]) print("\nbuyuk model konu isabeti sayi isabeti") for ad, th in (("kosum A (20260218)", TOHUM), ("kosum B (20260219)", TOHUM + 1)): a, b = olc(SINAMA, th) print(f"{ad:<24} {a:>12.4f} {b:>12.4f}") print(f"sinama olcumunun bedeli: cagri {CAGRI[0]} , giris belirteci {CAGRI[1]}")
sinama kayit 120 , ayri konu adedi dagilimi {0: 4, 1: 38, 2: 63, 3: 15}
ornek kayit: evde su akmiyor bir ariza var galiba
konu ariza , ayri konu adedi 1
buyuk model konu isabeti sayi isabeti
kosum A (20260218) 0.6333 0.3583
kosum B (20260219) 0.7167 0.3000
sinama olcumunun bedeli: cagri 240 , giris belirteci 3214
Büyük model konu görevinde 0,6333 / 0,7167, sayma görevinde 0,3583 / 0,3000 veriyor. Sayma görevinde dört sınıf var ve en kalabalık sınıf sınamanın 63 kaydını tutuyor; yani her kayda o sınıfı veren bir yordam 0,5250 alırdı. Öğretmen bunun altındadır. İki koşum arasındaki fark da konu görevinde 0,0834, sayma görevinde 0,0583: öğretmen belirsiz bir bileşendir ve etiketleri de belirsizdir.
Küçük Modelin Yakaladığı Pay
Küçük model her iki görevde üç ayrı kaynakla eğitilir. Öğretmenin etiketleri, iki yüz kırk etiketsiz kaydın her biri için bir çağrı yapılarak üretilir.
SOZLUK = {} for m in [x[0] for x in GOVDE] + BELIRSIZ + ["ayrica " + v for v in KISA.values()]: for t in belirtecle(m): SOZLUK.setdefault(t, len(SOZLUK)) V = len(SOZLUK) def parcala(metin): return sorted({SOZLUK[t] for t in belirtecle(metin) if t in SOZLUK}) def hedef(konu, sayi, alan): return KONU.index(konu) if alan == "konu" else sayi def egit(ornek, sinif, tohum, dongu=40, adim=0.12): """KUCUK model: belirtec torbasindan dogrudan sinifa tek dizey, V x sinif sayi.""" r = uretec(tohum) W = [[(r() - 0.5) * 0.2 for _ in range(sinif)] for _ in range(V)] for e in range(dongu): for tok, y in ornek: o = [sum(W[i][j] for i in tok) for j in range(sinif)] mx = max(o) d = [exp(x - mx) for x in o] s = sum(d) d = [x / s for x in d] d[y] -= 1.0 for i in tok: for j in range(sinif): W[i][j] -= adim * d[j] return W def kestir(W, tok, sinif): o = [sum(W[i][j] for i in tok) for j in range(sinif)] return max(range(sinif), key=lambda j: o[j]) def kucuk_isabet(W, sinif, alan): return sum(kestir(W, parcala(x["metin"]), sinif) == hedef(x["konu"], x["sayi"], alan) for x in SINAMA) / len(SINAMA) CAGRI[0] = CAGRI[1] = 0 DAMITMA = {t: [(x, *buyuk_model(x["metin"], t)) for x in ETIKETSIZ] for t in (TOHUM, TOHUM + 1)} # etiketsiz yigin ogretmene etiketletiliyor ETIKETLEME = (CAGRI[0], CAGRI[1]) KAYNAK = [("insan etiketi 6", lambda a, t: [(parcala(x["metin"]), hedef(x["konu"], x["sayi"], a)) for x in ETIKETLI]), ("ogretmen etiketi 240", lambda a, t: [(parcala(x["metin"]), hedef(k, s, a)) for x, k, s in DAMITMA[t]]), ("insan etiketi 240", lambda a, t: [(parcala(x["metin"]), hedef(x["konu"], x["sayi"], a)) for x in ETIKETSIZ])] OG = (olc(SINAMA, TOHUM), olc(SINAMA, TOHUM + 1)) AGIRLIK = {} print("gorev kucuk modelin kaynagi isabet A isabet B ogretmen A yakalanan pay") for alan, sinif in (("konu", 5), ("sayi", 4)): og = OG[0][0 if alan == "konu" else 1] for ad, veriyi_kur in KAYNAK: W = egit(veriyi_kur(alan, TOHUM), sinif, TOHUM) a = kucuk_isabet(W, sinif, alan) b = kucuk_isabet(egit(veriyi_kur(alan, TOHUM + 1), sinif, TOHUM + 1), sinif, alan) AGIRLIK[(alan, ad)] = (W, sinif) print(f"{alan:<6} {ad:<22} {a:>8.4f} {b:>8.4f} {og:>10.4f} {a / og:>13.4f}") print(f"{alan:<6} {'buyuk model (ogretmen)':<22} {og:>8.4f}" f" {OG[1][0 if alan == 'konu' else 1]:>8.4f}") print("\nkucuk modelin hatasi ogretmeninkiyle ne kadar ortusuyor (kosum A):") for alan in ("konu", "sayi"): for ad in ("insan etiketi 6", "ogretmen etiketi 240"): W, sinif = AGIRLIK[(alan, ad)] ortak = hata = 0 for x in SINAMA: dogru = hedef(x["konu"], x["sayi"], alan) k, s = buyuk_model(x["metin"], TOHUM) kh = kestir(W, parcala(x["metin"]), sinif) != dogru hata += kh ortak += kh and hedef(k, s, alan) != dogru print(f" {alan:<6} {ad:<22} kucuk hata {hata:>3} , ortak {ortak:>3}" f" , pay {ortak / hata:.4f}") print(f"\nkucuk model {V} x sinif sayi ; insan etiketi 6 ya da 240 ;" f" ogretmen cagrisi {ETIKETLEME[0] // 2} , giris belirteci {ETIKETLEME[1] // 2}")
gorev kucuk modelin kaynagi isabet A isabet B ogretmen A yakalanan pay konu insan etiketi 6 0.5000 0.5583 0.6333 0.7895 konu ogretmen etiketi 240 0.6333 0.6917 0.6333 1.0000 konu insan etiketi 240 0.9000 0.9000 0.6333 1.4211 konu buyuk model (ogretmen) 0.6333 0.7167 sayi insan etiketi 6 0.5833 0.5833 0.3583 1.6279 sayi ogretmen etiketi 240 0.3667 0.2417 0.3583 1.0233 sayi insan etiketi 240 0.9417 0.9417 0.3583 2.6279 sayi buyuk model (ogretmen) 0.3583 0.3000 kucuk modelin hatasi ogretmeninkiyle ne kadar ortusuyor (kosum A): konu insan etiketi 6 kucuk hata 60 , ortak 18 , pay 0.3000 konu ogretmen etiketi 240 kucuk hata 44 , ortak 42 , pay 0.9545 sayi insan etiketi 6 kucuk hata 50 , ortak 32 , pay 0.6400 sayi ogretmen etiketi 240 kucuk hata 76 , ortak 58 , pay 0.7632 kucuk model 103 x sinif sayi ; insan etiketi 6 ya da 240 ; ogretmen cagrisi 240 , giris belirteci 3256
Konu görevinde damıtma çalışıyor. Altı insan etiketiyle eğitilen küçük model 0,5000 / 0,5583 veriyor; iki yüz kırk öğretmen etiketiyle eğitilen aynı model 0,6333 / 0,6917’ye çıkıyor. Kazanç 0,1333, ve yakalanan pay 1,0000: küçük model öğretmenin isabetine tam olarak yetişiyor. Buraya kadar damıtma vaadini tutuyor.
Üçüncü satır vaadin sınırını gösteriyor. Aynı iki yüz kırk kayıt insan etiketiyle verilseydi küçük model 0,9000 verirdi. Damıtılmış modelin kapattığı açık, 0,5000 ile 0,9000 arasındaki mesafenin yalnız üçte biridir. Küçük modelin taşıyamadığı bir şey yok; taşıyamayan öğretmendir. Damıtma modeli değil, öğretmenin gördüğü kadarını kopyalar.
Sayma görevi bunu tersine çeviriyor ve dersin asıl sayısını veriyor. Altı insan etiketiyle eğitilen küçük model 0,5833 alıyor. İki yüz kırk öğretmen etiketiyle eğitilen aynı model 0,3667 / 0,2417’ye düşüyor. Kırk kat daha fazla etiket, iki yüz kırk çağrı ve 3256 giriş belirteci harcandı ve sonuç altı etiketle eğitilen modelden kötü. Öğretmen o görevde saymıyor, uzunluktan tahmin ediyor; damıtma bu tahmin alışkanlığını sadakatle aktarıyor. Üst sınır ise 0,9417: görev küçük model için zor değil, öğretmen için zor.
Hata örtüşmesi sütunu aktarımın ne kadar sadık olduğunu söylüyor. Konu görevinde damıtılmış modelin 44 hatasının 42’si, öğretmenin de yanıldığı kayıtlarda; pay 0,9545. Altı insan etiketiyle eğitilen modelde aynı pay 0,3000. İkisi de hata yapıyor, ama damıtılmış olan aynı hataları yapıyor. Bir sistemin iki bileşeni aynı yerde yanılıyorsa, ikisini yan yana koymak hiçbir şey yakalamaz.
Son olarak iki koşum sütunu damıtmanın kendine özgü bir kırılganlığını gösteriyor. Öğretmen etiketleme tohumu değiştiğinde damıtılmış modelin sayma isabeti 0,3667’den 0,2417’ye düşüyor; 0,1250’lik bir oynama. İnsan etiketiyle eğitilen satırlar iki koşumda da aynı sayıyı veriyor. Öğretmenin belirsizliği eğitim kümesine yazıldı ve orada kalıcı hâle geldi.
Özet
- Büyük model konu görevinde 0,6333 / 0,7167, ayrı konu sayma görevinde 0,3583 / 0,3000 veriyor; sayma görevinde en kalabalık sınıfı seçen bir yordamın 0,5250’sinin altında kalıyor.
- Konu görevinde damıtma altı insan etiketine göre 0,5000’den 0,6333’e çıkarıyor ve öğretmenin isabetinin tamamını yakalıyor.
- Aynı iki yüz kırk kaydın insan etiketi 0,9000 verir; damıtma açığın yalnız üçte birini kapatır, çünkü tavan küçük model değil öğretmendir.
- Sayma görevinde damıtma geri götürüyor: 0,5833’ten 0,3667 ve 0,2417’ye. Üst sınır 0,9417’dir, yani görev küçük model için değil öğretmen için zordur.
- Damıtılmış modelin 44 konu hatasının 42’si öğretmenin de yanıldığı kayıtlarda (pay 0,9545); altı insan etiketiyle eğitilen modelde bu pay 0,3000.
- Bedel iki yüz kırk öğretmen çağrısı ve 3256 giriş belirtecidir; karşılığında altı insan etiketi yerine iki yüz kırk model etiketi elde edilir ve öğretmenin koşum belirsizliği devralınır.
Sonraki Adım
Bu derste küçük model büyük modelin çıktısından doğdu. Ortaya çıkan ağırlıklar hiçbir insanın yazmadığı, tamamen başka bir modelin yanıtlarından türetilmiş sayılardır. Aynı şey bir önceki dersin uyarlama farkları için de geçerlidir: elde, bir başkasının modelinden türetilmiş bir nesne vardır. O nesneyi kendi sunucunda çalıştırmak, abonelere bir paket içinde vermek, bir başkasına satmak ya da yalnız çıktısını sunmak aynı şey değildir. Sonraki ders bu ayrımı sayar: dört kullanım koşulu sınıfı bir kullanım senaryosuna uygulandığında kaç dağıtım seçeneği kapanıyor, hangi koşul tek başına en çok seçeneği kapatıyor ve geriye kaç seçenek kalıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.