Ders 23 / 26
İnce Ayar
Aynı etiketli örneklerin isteme konmasıyla ağırlıklara işlenmesinin aynı 60 kurgu sınama kaydında yan yana ölçülmesi: düzeneksiz taban 0,6000, dört örnekle ince ayar hiçbir ağırlığı oynatmıyor ve 0,6000'de kalıyor, sekiz örnekte 0,7333 ile istem düzeneğinin 0,6500'ünü geçiyor, on altı örnekte 0,8833. Otuz iki örnekte iki yol 0,9000 ile 0,9500 bandında örtüşüyor, altmış örnekte istem düzeneği 0,9667 veriyor ve ince ayar 0,9500'de kalıyor: ince ayar kazanmıyor. Bedel iki ayrı birimdedir; istem düzeneği istek başına bağlamı 28,48'den 623,48 belirtece, yani 21,9 katına çıkarıyor, ince ayar bir kerelik 180 güncelleme adımı ve 605 ağırlığın 0,2992 payını oynatıyor.
İçindekiler
Önceki iki derste ağırlıklar hep verilmiş kabul edildi: ölçek seçildi, basamak sayısı düşürüldü, bellek ve isabet yan yana yazıldı. Ağırlıkların kendisine dokunulmadı. Oysa yerel bir kurulumun uzak bir uç noktada bulunmayan asıl imkânı budur; ağırlıklar elinde olduğu için değiştirilebilirler.
İkinci dersin sonundaki tablo bir seçim dayatmıştı: bütçe küçük ölçeği seçtirdiğinde bu görevdeki isabet düşük kalıyor. Bunu yükseltmenin iki yolu var ve ikisi de aynı şeye ihtiyaç duyuyor, etiketli örneğe. Birinci yol örnekleri isteme koymaktır; her istekle birlikte modele birkaç çözülmüş talep gösterilir. İkinci yol örnekleri ağırlığa işlemektir; model bir kez eğitilir ve istem kısa kalır. Bu ders ikisini aynı örnek sayısında yan yana ölçer ve ince ayarın kazanmadığı noktayı gösterir. Önceden eğitim ile ince ayarın iki aşamalı yapısı Makine Öğrenmesi kursunun mimariler konusunda ve Yapay Zekâ Mühendisliğine Giriş kursunun dil modelleri konusunda ele alındı; o ayrım burada tekrarlanmaz, yalnız iki yolun sayısı karşılaştırılır.
- YM21. Kod bir benzeticidir; talepler kurgudur, tohum 20260218. Ölçek önceki derslerin küçük ölçeğidir, çünkü bütçe onu seçtirdi.
- YM22. 120 kurgu talebin ilk 60’ı eğitim havuzu, son 60’ı sınama kümesidir. Sınama kümesine hiçbir düzenek dokunmaz.
- YM23. İstem düzeneği: seçilen örnekler isteme konur. Bağlamdaki bir örnek, kendi parçalarına kendi konusu için geçici bir destek verir; destek istekten isteğe taşınmaz.
- YM24. İnce ayar: aynı örnekler üzerinde hata güdümlü güncelleme. Yalnız yanlış bilinen örneklerde ağırlık oynar, ve oynayan ağırlık kalıcıdır.
- YM25. Koşum sayısı, eğitim kümesinin baştan sona kaç kez geçildiğidir; güncelleme adımı sayısı örnek sayısı çarpı koşum sayısıdır.
- YM26. İki yol aynı örnekleri kullanır. Karşılaştırma eşit etiketli örnek sayısındadır; değişen tek şey örneğin nereye konduğudur.
- YM27. İki koşum, örneklerin iki ayrı çekilişidir (tohum 20260218 ve 20260219). Altmış örnekte iki çekiliş aynı kümeyi verir, bu yüzden orada fark sıfırdır.
- YM28. Kazanç kuralı: bir yolun üstünlüğü iki çekilişin ikisinde de aynı yönde değilse ölçülmemiş sayılır.
- YM29. Bedel iki ayrı birimdedir: istem düzeneği istek başına belirteç, ince ayar bir kerelik örnek ve koşum sayısı.
- YM30. Ağırlık tablosu 121 satır çarpı beş konu, yani 605 ağırlıktır; ince ayarın oynattığı kayıt sayısı bunun içinden sayılır.
Aynı Örnekler, İki Ayrı Yer
Benzetici önceki derslerinkiyle aynı; değişen tek şey, puanın üstüne bir düzeltme tablosu eklenebilmesi. Düzeltme istemden geliyorsa geçicidir ve o isteğin bağlamıyla birlikte gider; eğitimden geliyorsa kalıcıdır ve istem kısa kalır. İkisinin de girdisi aynı etiketli örneklerdir.
# YEREL BENZETICI -- KURGUDUR. Onceki derslerin benzeticisi kisaltilarak kurulur. 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().split(): while len(s) > 5: b.append(s[:5]) s = s[5:] b.append(s) return b KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"] KALIP = {"fatura": ["bu ayki tutar gecen aya gore cok yuksek", "odedim ama sistemde borc gorunuyor", "ayrintili dokumu nereden gorebilirim"], "ariza": ["evde su akmiyor bir sorun var", "baglanti bozuk oldu ve hic calismiyor", "ariza kaydi actim ama ekip gelmedi"], "sayac": ["okuma yanlis girilmis endeks tutmuyor", "cihaz degisimi icin randevu istiyorum", "endeksi ile fatura ayni degil"], "tarife": ["hangi basamaktayim ogrenmek istiyorum", "tarife degisikligi icin ne yapmaliyim", "birim ucret abone tipine gore degisir mi"], "kesinti": ["mahallede elektrik yok ne zaman gelecek", "planli duyuru nereden takip edilir", "aksamdan beri kesinti yasiyoruz"]} EK = ["ayrica gecen hafta da aradim", "kayit numarasi verildi", "ekip bilgi verecekti", "degisiklik talebim de var"] TALEP = [] # 120 KURGU destek talebi for i in range(120): r = uretec(TOHUM + i) k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])] m = KALIP[k][int(r() * 3)] if r() < 0.34: m += " " + EK[int(r() * 4)] TALEP.append({"no": 4001 + i, "konu": k, "metin": m}) GECIS = {} for k, liste in KALIP.items(): for m in liste: for t in set(belirtecle(m)): GECIS.setdefault(t, {})[k] = 1 for e in EK: for t in set(belirtecle(e)): GECIS.setdefault(t, {}) TABAN, AGIRLIK = 0.50, {} for i, t in enumerate(sorted(GECIS)): r = uretec(TOHUM + 7919 * (i + 1)) satir = {k: TABAN for k in KONU} if GECIS[t]: for k in GECIS[t]: satir[k] = TABAN + 0.05 + 0.40 * r() else: satir[KONU[int(r() * 5)]] = TABAN + 0.02 + 0.10 * r() AGIRLIK[t] = satir SATIR = 12 # kucuk olcek: butcenin sectigi olcek OGRENILMIS = set(sorted(AGIRLIK, key=lambda t: (TABAN - max(AGIRLIK[t].values()), t))[:SATIR]) EGITIM, SINAMA = TALEP[:60], TALEP[60:] YONERGE = "Talebi su etiketlerden birine ata: fatura ariza sayac tarife kesinti . " def puan(metin, duzeltme=None): """Taban puan ogrenilmis satirlarin en yuksek degeri; duzeltme ustune eklenir.""" parca = belirtecle(metin) p = {k: TABAN for k in KONU} for t in parca: if t in OGRENILMIS: for k in KONU: p[k] = max(p[k], AGIRLIK[t][k]) for t in parca: for k in KONU: p[k] += (duzeltme or {}).get((t, k), 0.0) return max(sorted(p), key=lambda a: p[a]) def olc(duzeltme=None): return sum(puan(x["metin"], duzeltme) == x["konu"] for x in SINAMA) / 60 print("egitim havuzu", len(EGITIM), "kayit ; sinama", len(SINAMA), "kayit") print("taban isabet (duzeneksiz kucuk olcek):", f"{olc():.4f}") print("yonerge belirteci:", len(belirtecle(YONERGE)), "; ortalama talep belirteci:", round(sum(len(belirtecle(x["metin"])) for x in SINAMA) / 60, 2))
egitim havuzu 60 kayit ; sinama 60 kayit taban isabet (duzeneksiz kucuk olcek): 0.6000 yonerge belirteci: 18 ; ortalama talep belirteci: 10.48
Taban 0,6000. Bu, ikinci dersin sonunda bütçenin dayattığı ölçeğin bu görevdeki hâlidir ve iki yolun da aşması gereken sayıdır. Ortalama bir talep 10,48 belirteç, yönerge 18 belirteç; yani düzeneksiz bir istek yaklaşık 28 belirteçtir. Bu sayı istem düzeneğinin bedelini okurken ölçü olacak.
Örnek Sayısı Arttıkça
Aşağıdaki kod aynı örnek kümesini iki yere de koyar ve yalnız sınama kümesinde ölçer. Örnekler eğitim havuzundan iki ayrı çekilişle seçilir; ikinci çekiliş kazancın ölçülmüş sayılıp sayılmayacağına karar vermek içindir.
ORNEK, ADIM = 0.30, 0.05 # baglamdan gelen destek ve ince ayar adimi def sec_ornek(n, tohum): r, h = uretec(tohum), list(range(60)) for i in range(59, 0, -1): j = int(r() * (i + 1)) h[i], h[j] = h[j], h[i] return [EGITIM[i] for i in sorted(h[:n])] def baglamdan(ornekler): # isteme konan ornekler: gecici destek return {(t, o["konu"]): ORNEK for o in ornekler for t in belirtecle(o["metin"])} def egit(ornekler, gecis): # hata gudumlu guncelleme; agirliklar kalici D = {} for _ in range(gecis): for o in ornekler: s = puan(o["metin"], D) if s != o["konu"]: for t in belirtecle(o["metin"]): D[(t, o["konu"])] = D.get((t, o["konu"]), 0.0) + ADIM D[(t, s)] = D.get((t, s), 0.0) - ADIM return D print(" n istem A istem B ayar k=1 ayar k=3 ayarB k=3 istem bel oynayan") for n in (4, 8, 16, 32, 60): a, b = sec_ornek(n, TOHUM), sec_ornek(n, TOHUM + 1) ia, ib = olc(baglamdan(a)), olc(baglamdan(b)) y1, y3, yb = olc(egit(a, 1)), olc(egit(a, 3)), olc(egit(b, 3)) bel = sum(len(belirtecle(o["metin"])) for o in a) print(f"{n:>2} {ia:.4f} {ib:.4f} {y1:.4f} {y3:.4f} {yb:.4f}" f" {bel:>6} {len(egit(a, 3)):>7}") print("\nn=60 sabit , kosum sayisi degisiyor:") print(" k isabet guncelleme adimi oynayan kayit") for k in (1, 2, 3, 6, 10): D = egit(sec_ornek(60, TOHUM), k) print(f" {k:>2} {olc(D):.4f} {60 * k:>16} {len(D):>13}") ort = sum(len(belirtecle(x["metin"])) for x in SINAMA) / 60 bel60 = sum(len(belirtecle(o["metin"])) for o in sec_ornek(60, TOHUM)) gi = len(belirtecle(YONERGE)) + bel60 + ort ga = len(belirtecle(YONERGE)) + ort D60 = egit(sec_ornek(60, TOHUM), 3) print(f"\nistek basina baglam: istem duzenegi {gi:.2f} , ince ayar {ga:.2f} belirtec" f" ({gi / ga:.1f} kat)") print(f"ince ayarin bedeli n=60 , k=3: {60 * 3} guncelleme adimi , {len(D60)} kayit ," f" 605 agirligin {len(D60) / 605:.4f} payi")
n istem A istem B ayar k=1 ayar k=3 ayarB k=3 istem bel oynayan 4 0.5667 0.6500 0.6000 0.6000 0.7333 38 0 8 0.6500 0.6667 0.7333 0.7333 0.8000 73 35 16 0.8333 0.7500 0.8833 0.8833 0.8667 138 49 32 0.9000 0.9500 0.8500 0.9167 0.9000 292 101 60 0.9667 0.9667 0.9333 0.9500 0.9500 595 181 n=60 sabit , kosum sayisi degisiyor: k isabet guncelleme adimi oynayan kayit 1 0.9333 60 121 2 0.9333 120 162 3 0.9500 180 181 6 0.9500 360 181 10 0.9500 600 181 istek basina baglam: istem duzenegi 623.48 , ince ayar 28.48 belirtec (21.9 kat) ince ayarin bedeli n=60 , k=3: 180 guncelleme adimi , 181 kayit , 605 agirligin 0.2992 payi
En üstteki satır iki yolun da işe yaramadığı yerdir. Dört örnekle ince ayar hiçbir ağırlığı oynatmıyor: oynayan kayıt sayısı 0, çünkü model o dört örneği zaten doğru biliyordu ve hata güdümlü güncellemenin tetiklenmesi için bir hata gerekiyor. İsabet tabanda, 0,6000’de kalıyor. Aynı dört örnek isteme konduğunda ise isabet 0,5667’ye düşüyor; bağlamdaki dört örnek, sınama kayıtlarının bir bölümünü kendi konularına doğru çekiyor. İkinci çekilişte aynı iki sayı 0,6500 ve 0,7333, yani yön bile aynı değil. Dört örnekle ölçülmüş hiçbir şey yoktur.
Sekiz ve on altı örnekte ince ayar açık ara önde. Sekizde 0,7333 ve 0,8000, istem düzeneğinin iki çekilişteki en iyisi olan 0,6667’nin üstünde; on altıda 0,8833 ve 0,8667, istem düzeneğinin 0,8333 ve 0,7500’ünün üstünde. Her iki çekilişte de aynı yönde olduğu için bu üstünlük ölçülmüş sayılır. Nedeni yapısaldır: hata güdümlü güncelleme örneği birden çok kez kullanır ve yalnız yanlış bilinen yerleri düzeltir, bağlama konan örnek ise bir kez okunur ve doğru bildiği yerleri de oynatır.
İnce Ayarın Kazanmadığı Nokta
Otuz iki örnekte tablo dönüyor. İnce ayar üç koşumla 0,9167 ve 0,9000 veriyor, istem düzeneği 0,9000 ve 0,9500. Bantlar örtüşüyor ve iki çekilişte üstünlük aynı yöne bakmıyor; YM28’e göre burada ölçülmüş bir kazanç yoktur. Aynı satırda tek koşumluk ince ayar 0,8500, yani istem düzeneğinin iki değerinin de altında. İkinci koşumu eklemek 0,0667 kazandırıyor ve bu, örnek eklemekten değil aynı örneği yeniden geçmekten gelen bir kazançtır.
Altmış örnekte belirsizlik kalmıyor. İki çekiliş de bütün havuzu seçtiği için sayılar birbirinin aynı: istem düzeneği 0,9667, ince ayar 0,9500. Fark 0,0167 ve koşum değişkenliği sıfır. Bu, ince ayarın kazanmadığı noktadır ve tesadüf değildir. Altmış örneğin tamamı bağlamda duruyorsa model her isteği çözülmüş bir kümeyle birlikte okuyor; ince ayar ise aynı örneklerden yalnız hata verdiklerini kullanmış, 605 ağırlığın 181’ini oynatmış ve geri kalanına dokunmamış. Elinde bütün etiketli veri varken onu bir eğitim koşumuna sıkıştırmak, bu görevde kayıptır.
Koşum sayısı bu farkı kapatamıyor. Altmış örnek sabit tutulup koşum sayısı artırıldığında isabet tek koşumda 0,9333, üç koşumda 0,9500 ve orada duruyor; altı ve on koşum aynı 0,9500’ü veriyor. Üçüncü koşumdan sonra eğitim kümesinde düzeltilecek hata kalmadığı için oynayan kayıt sayısı da 181‘de sabitleniyor. Güncelleme adımı 180’den 600’e çıkıyor ve karşılığında hiçbir şey alınmıyor. İnce ayarın bu görevdeki tavanı 0,9500’dür ve o tavan koşum ekleyerek değil ancak başka bir yolla yükselir.
Kararı veren şey isabet sütunu değil, son iki satırdır. İstem düzeneği altmış örnekle isteğin bağlamını 28,48 belirteçten 623,48 belirtece, yani 21,9 katına çıkarıyor ve bu bedel her istekte yeniden ödeniyor. İlk dersin hesabına göre bağlam uzunluğu istek başına ara durumla doğru orantılıdır; yirmi bir kat bağlam, aynı bütçede yirmi bir kat az eşzamanlı istek demektir. İnce ayarın bedeli ise bir kereliktir: altmış etiketli örnek, üç koşum, 180 güncelleme adımı ve 0,2992 payında oynayan ağırlık. Sonraki her istek yine 28,48 belirteç.
Karşılaştırma bu yüzden tek sayıyla kapanmaz. Etiketli örnek azken ince ayar üstün ve ucuzdur. Örnek çoğaldıkça istem düzeneği isabette yakalar ve geçer, ama bunu bağlamı büyüterek yapar; kaç isteğin aynı anda işleneceği önemliyse, 0,0167’lik bir isabet farkı yirmi bir kat kapasiteye değmez. Ölçülmesi gereken ikisidir, ve bu iki sayı aynı birimde değildir.
Özet
- İki yol da aynı girdiyi ister: etiketli örnek. Değişen tek şey örneğin isteme mi ağırlığa mı konduğudur; bu yüzden karşılaştırma eşit örnek sayısında yapılır.
- Dört örnekle ince ayar hiçbir ağırlığı oynatmıyor ve taban 0,6000’de kalıyor; aynı dört örnek isteme konduğunda isabet 0,5667’ye düşüyor. İki çekilişin yönü bile aynı değil.
- Sekiz ve on altı örnekte ince ayar iki çekilişte de önde: 0,7333 ile 0,8833’e karşı 0,6500 ile 0,8333. Bu üstünlük ölçülmüş sayılır.
- Otuz iki örnekte bantlar örtüşüyor (0,9000 ile 0,9500’e karşı 0,9000 ile 0,9167); ölçülmüş bir kazanç yoktur ve tek koşumluk ince ayar 0,8500 ile geride kalır.
- Altmış örnekte istem düzeneği 0,9667, ince ayar 0,9500; koşum değişkenliği sıfır olduğu için ince ayarın kaybı gerçektir.
- Bedeller aynı birimde değildir: istem düzeneği bağlamı istek başına 21,9 katına çıkarır, ince ayar bir kerelik 180 güncelleme adımı ve 605 ağırlığın 0,2992 payını oynatır.
Sonraki Adım
Son satırdaki 0,2992 payı sorulmadan geçildi. İnce ayar hangi ağırlığın oynayacağına karar vermedi; hata güdümlü güncelleme, yanlış bilinen bir örnekte hangi parça geçtiyse ona dokundu ve 181 kayıt öylece ortaya çıktı. Bu sayı bir tasarım kararı değil, bir yan üründür. Oysa oynayan ağırlık sayısı doğrudan bir maliyettir: saklanacak, taşınacak, geri alınacak ve her görev için ayrıca tutulacak olan şey odur. Aynı isabet daha az ağırlık oynatılarak alınabilir miydi, hangi ağırlıkların dondurulacağına önceden karar verilse ne kaybedilirdi, ve güncellemenin kendisi tabloya bir ek olarak yazılsa saklanan sayı adedi ne olurdu — bunların hiçbiri denenmedi. Sonraki ders tam güncellemeyi, katman dondurmayı ve tabloya eklenen düşük ranklı bir düzeltmeyi yan yana ölçer ve iki sayıyı basar: güncellenen parametre payı ile isabet.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.