Ders 15 / 22
İstem Topluluğu
Aynı 120 kurgu destek talebine üç ayrı yönergeyle bakılıyor ve topluluğun dayandığı varsayım sınanıyor: farklı istemler farklı hatalar yapar mı. Üç istem tek başına 0,7750, 0,6583 ve 0,7833 veriyor, dokuz kayıtta üçü birden yanılıyor ve tavan 0,9250 çıkıyor. Çoğunluk oyu 0,8000'de kalıyor: tavanın 0,1250 altında, en iyi tek istemin yalnız 0,0167 üstünde ve bu kazanç aynı istemlerin iki koşum arasındaki 0,0833 ile 0,1333 farkının altında. Bedel çağrı sayısıyla yazılıyor: 120 çağrı 360 çağrıya, doğru etiket başına 61,1 belirteç 180,7 belirtece çıkıyor.
İçindekiler
Önceki ders tek bir istemin ne kadar uzatılabileceğini ölçtü: yanıt öncesinde görünmeyen ara adımlar üreten bir model sınıfı aynı görevde daha çok belirteç harcıyordu ve farkın bir görevde ölçülemez kaldığı yazıldı. Altı dersin ortak yanı şudur — ortada hep tek bir istem vardı. O istem uzatıldı, adım adım çözüme zorlandı, dallandırıldı, ikiye bölündü. Aynı soruya birden çok ayrı istemin bakması hiç denenmedi.
Bu dersin düzeneği budur: aynı görev, aynı benzetici, aynı küme; üç ayrı yazılmış yönerge ve sonunda bir oy. Adı istem topluluğudur. Çoğunluk oyunun yordamı Denetimli Öğrenme kursunun topluluk yöntemleri dersinde ölçüldü ve tekrarlanmaz. Eklenen iki şey var: bedelin çağrı sayısıyla yazılması ve topluluğun dayandığı varsayımın sınanması. O varsayım şudur — farklı istemler farklı hatalar yapar. Dersin sayısı, varsayımın ne kadar tuttuğudur: kaç kayıtta üç istem birden yanılıyor.
- AY61. Görev, küme ve benzetici sabittir. Değişen tek şey yönerge metnidir; üç yönerge de aynı beş etiketi ve aynı biçim kısıtını taşır.
- AY62. Kod gerçek bir model uç noktası çağırmaz; standart kitaplıkla yazılmış bir benzetici çağırır. Destek talepleri ve konular kurgudur.
- AY63. Üç yönerge üç ayrı tasarım kararını taşır: yalın etiket kümesi, rol belirtme, ve önce işlem alanını sorma.
- AY64. Ölçüt etiket isabetidir. Yanıttan etiket okunamazsa kayıt yanlış sayılır.
- AY65. Topluluğun kararı çoğunluk oyudur. Üç etiket de ayrıysa ilk istemin etiketi geçerlidir; bu durumların sayısı ayrıca basılır.
- AY66. Örtüşme şudur: üç istem bir kayıtta birden yanılıyorsa o kayıt topluluğun erişemeyeceği kayıttır. Kalan kayıtların payı topluluğun tavanıdır.
- AY67. Bedel çağrı sayısıyla yazılır: üç üyeli topluluk her kayıt için üç çağrı harcar. Belirteç ve doğru etiket başına birim bedel yanına konur.
- AY68. Her ölçü iki koşumda basılır (tohum 20260218 ve 20260219). Topluluğun kazancı iki koşum farkından küçükse ölçülmemiş sayılır.
Aynı Göreve Bakan Üç İstem
# BENZETICI -- KURGUDUR. Bu kod gercek bir model uc noktasi cagirmaz; standart # kitaplikla yazilmis bir dil modeli benzeticisini cagirir. Talepler de kurgudur. import math TOHUM, M32 = 20260218, 0xFFFFFFFF PENCERE, EN_UZUN = 240, 24 # baglam penceresi ve en buyuk cikti, belirtec 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 def izno(m): # istemin icerigine bagli, kosumdan bagimsiz iz h = 2166136261 for c in m: h = ((h ^ ord(c)) * 16777619) & M32 return h KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"] KALIP = { "fatura": ["bu ayki fatura tutari gecen aya gore cok yuksek geldi", "faturami odedim ama sistemde borc gorunuyor", "fatura ayrintisini nereden gorebilirim"], "ariza": ["evde su akmiyor bir ariza var galiba", "baglanti bozuk oldu ve hic calismiyor", "ariza kaydi actim ama ekip gelmedi"], "sayac": ["sayac okumasi yanlis girilmis endeks tutmuyor", "sayac degisimi icin randevu istiyorum", "sayac uzerindeki endeks ile fatura ayni degil"], "tarife": ["hangi tarife basamagindayim ogrenmek istiyorum", "tarife degisikligi icin ne yapmam gerekiyor", "birim ucret abone tipine gore degisiyor mu"], "kesinti": ["mahallede kesinti var ne zaman gelecek", "planli kesinti duyurusu nereden takip edilir", "aksamdan beri kesinti yasiyoruz"], } EK = ["ayrica gecen ay da ayni sorun olmustu", "bu konuda memnun degilim", "acil bilgi almam gerekiyor", "kayit numaram elimde yok"] TALEP = [] 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, "metin": m, "konu": k}) KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"] IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura", "ariza": "ariza", "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza", "sayac": "sayac", "endek": "sayac", "okuma": "sayac", "tarif": "tarife", "birim": "tarife", "abone": "tarife", "basam": "tarife", "kesin": "kesinti", "duyur": "kesinti", "mahal": "kesinti", "borc": "odeme", "odedi": "odeme", "ucret": "odeme", "memnu": "sikayet", "sorun": "sikayet", "acil": "sikayet", "bilgi": "bilgi", "ogren": "bilgi", "nered": "bilgi"} TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura", "ekip": "kesinti", "takip": "tarife", "giril": "fatura"} # yaniltici baglar SERBEST = ["talebiniz {k} konusuyla ilgili gorunuyor", "bu kayit {k} basligina girer , ilgili ekibe yonlendirildi", "kaydiniz alindi , konuyu inceleyip donus yapacagiz"] SAYAC = [0] def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN): SAYAC[0] += 1 bel = belirtecle(istem) if len(bel) > PENCERE: return {"durum": "baglam_asimi", "giris": len(bel), "cikis": 0, "yanit": ""} if SAYAC[0] % 37 == 0: return {"durum": "hiz_siniri", "giris": len(bel), "cikis": 0, "yanit": ""} r = uretec(tohum ^ izno(istem)) if len(bel) > 90 and r() < 0.04: return {"durum": "zaman_asimi", "giris": len(bel), "cikis": 0, "yanit": ""} aday = [k for k in KAVRAM if k[:5] in bel] # istemde adi gecen kavramlar if len(aday) < 3: aday = KAVRAM p = {k: 0.15 for k in aday} for t in bel: for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)): if tablo.get(t) in p: p[tablo[t]] += w if sicaklik <= 0.0: k = max(sorted(p), key=lambda a: p[a]) # en olasi secim else: e = [math.exp(p[a] / sicaklik) for a in sorted(p)] k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])] y = k if "tek" in bel else SERBEST[ayrik(r(), [0.42, 0.26, 0.32])].format(k=k) cb = belirtecle(y) if len(cb) > en_uzun: # durdurma kosulu cb = cb[:en_uzun] y = " ".join(cb) return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y} def oku(y): # yanittan etiket cikarma for s in y.lower().split(): if s in KONU: return s return None UC = { "yalin": ("Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , " "kesinti . Yanit olarak tek etiket yaz . Talep: "), "rol": ("Sen destek masasi gorevlisisin . Talebi fatura , ariza , sayac , tarife , " "kesinti etiketlerinden birine ata , tek etiket yaz . Talep: "), "alan": ("Once talebin hangi islem alanina girdigini belirle , sonra fatura , " "ariza , sayac , tarife , kesinti icinden tek etiket yaz . Talep: "), } def kosum(yonerge, tohum=TOHUM): SAYAC[0] = 0 et, g, c, h = [], 0, 0, 0 for x in TALEP: s = cagir(yonerge + x["metin"], tohum=tohum) g, c, h = g + s["giris"], c + s["cikis"], h + (s["durum"] != "tamam") et.append(oku(s["yanit"])) return {"et": et, "giris": g, "cikis": c, "cagri": SAYAC[0], "hata": h} def isabet(et): return sum(e == x["konu"] for e, x in zip(et, TALEP)) / len(TALEP) K1 = {ad: kosum(y) for ad, y in UC.items()} K2 = {ad: kosum(y, TOHUM + 1) for ad, y in UC.items()} print(f"{'istem':<7} {'belirtec':>8} {'kosum 1':>8} {'kosum 2':>8} {'fark':>8} " f"{'giris':>7} {'cikis':>6}") for ad in UC: a, b = isabet(K1[ad]["et"]), isabet(K2[ad]["et"]) print(f"{ad:<7} {len(belirtecle(UC[ad])):>8d} {a:>8.4f} {b:>8.4f} {b - a:>+8.4f} " f"{K1[ad]['giris']:>7d} {K1[ad]['cikis']:>6d}") i = next(i for i in range(len(TALEP)) if len({K1[ad]["et"][i] for ad in UC}) == 3) print(f"\ntalep {TALEP[i]['no']} ({TALEP[i]['konu']}): {TALEP[i]['metin']}") print("uc istemin etiketi: " + " , ".join(f"{ad} -> {K1[ad]['et'][i]}" for ad in UC))
istem belirtec kosum 1 kosum 2 fark giris cikis yalin 32 0.7750 0.6917 -0.0833 5300 192 rol 37 0.6583 0.7917 +0.1333 5900 210 alan 34 0.7833 0.7500 -0.0333 5540 201 talep 4023 (fatura): bu ayki fatura tutari gecen aya gore cok yuksek geldi bu konuda memnun degilim uc istemin etiketi: yalin -> fatura , rol -> tarife , alan -> sayac
Üç istem üç ayrı sayı verdi; aralarındaki en büyük fark 0,1250. Asıl bilgi ikinci koşum
sütunundadır. Birinci koşumda en iyi istem alan (0,7833), en kötüsü rol (0,6583); ikinci
koşumda sıralama tersine dönüyor ve rol 0,7917 ile başa geçiyor. Aynı istemin iki koşum
arasındaki farkı 0,0833, 0,1333 ve 0,0333: istemler arası fark ile aynı istemin kendi
içindeki oynaması aynı büyüklükte. Bu ölçekte “en iyi istem” kararlı bir kavram değildir.
Son iki satır topluluğun umududur. 4023 numaralı talep fatura konusundadır ve üç istem üç ayrı etiket veriyor; biri doğru bildi. Topluluğun bütün iddiası bu gözlemdir — hatalar farklı yerlere düşüyorsa oy birleştirme onları eler.
Hataların Örtüşmesi ve Tavan
from collections import Counter def oyla(satir): # cogunluk; uc etiket de ayriysa ilk istem karar verir s = Counter(e for e in satir if e is not None) if not s: return None en = max(s.values()) return next((e for e in satir if e is not None and s[e] == en), None) def cozumle(K): sat = [[K[ad]["et"][i] for ad in UC] for i in range(len(TALEP))] d = [[s[j] == TALEP[i]["konu"] for j in range(3)] for i, s in enumerate(sat)] top = [oyla(s) for s in sat] return {"top": top, "hepsi_yanlis": sum(not any(x) for x in d), "tavan": sum(any(x) for x in d) / len(TALEP), "uzlasma_yok": sum(len(set(s)) == 3 for s in sat), "yanlista_uzlasma": sum(1 for i, s in enumerate(sat) if Counter(s).most_common(1)[0][1] >= 2 and top[i] != TALEP[i]["konu"]), "isabet": isabet(top), "cagri": sum(K[a]["cagri"] for a in UC), "belirtec": sum(K[a]["giris"] + K[a]["cikis"] for a in UC)} C1, C2 = cozumle(K1), cozumle(K2) en_iyi = max(isabet(K1[a]["et"]) for a in UC) print(f"{'olcu':<26} {'kosum 1':>9} {'kosum 2':>9}") for ad, k, b in (("ucu birden yanlis", "hepsi_yanlis", "{:d}"), ("en az biri dogru (tavan)", "tavan", "{:.4f}"), ("uc ayri etiket", "uzlasma_yok", "{:d}"), ("yanlista uzlasma", "yanlista_uzlasma", "{:d}"), ("topluluk isabeti", "isabet", "{:.4f}")): print(f"{ad:<26} {b.format(C1[k]):>9} {b.format(C2[k]):>9}") print(f"\nen iyi tek istem {en_iyi:.4f} -> topluluk {C1['isabet']:.4f} " f"({C1['isabet'] - en_iyi:+.4f}); tavana uzaklik " f"{C1['isabet'] - C1['tavan']:+.4f}") tek = K1["alan"]["giris"] + K1["alan"]["cikis"] print(f"bedel: cagri {K1['alan']['cagri']} -> {C1['cagri']} " f"({C1['cagri'] / K1['alan']['cagri']:.1f} kat), belirtec {tek} -> " f"{C1['belirtec']} ({C1['belirtec'] / tek:.2f} kat)") print(f"dogru etiket basina {tek / (en_iyi * 120):.1f} -> " f"{C1['belirtec'] / (C1['isabet'] * 120):.1f} belirtec") print("\nkosumlar arasi etiket degisimi (120 kayitta):") for ad in UC: print(f" {ad:<9} {sum(a != b for a, b in zip(K1[ad]['et'], K2[ad]['et'])):>3d}") print(f" {'topluluk':<9} {sum(a != b for a, b in zip(C1['top'], C2['top'])):>3d}")
olcu kosum 1 kosum 2 ucu birden yanlis 9 16 en az biri dogru (tavan) 0.9250 0.8667 uc ayri etiket 1 8 yanlista uzlasma 24 18 topluluk isabeti 0.8000 0.8000 en iyi tek istem 0.7833 -> topluluk 0.8000 (+0.0167); tavana uzaklik -0.1250 bedel: cagri 120 -> 360 (3.0 kat), belirtec 5741 -> 17343 (3.02 kat) dogru etiket basina 61.1 -> 180.7 belirtec kosumlar arasi etiket degisimi (120 kayitta): yalin 39 rol 43 alan 40 topluluk 24
İlk satır bu dersin sorusuna doğrudan cevap veriyor. 120 kaydın 9’unda üç istem birden yanılıyor; örtüşme 0,0750. Yani topluluğun ulaşabileceği en yüksek sayı 0,9250 ve en iyi tek istemin 0,1417 üstünde bir boşluk duruyor. Örtüşme düşük, tavan yüksek: buraya kadar topluluğun gerekçesi ayakta.
Gerçekleşen sayı 0,8000, tavanın 0,1250 altında. Aradaki fark sayılabilir bir yerdedir: yanlışta uzlaşma satırı çoğunluğun 24 kayıtta yanlış bir etikette buluştuğunu söylüyor. Bunların 9’u zaten kimsenin bilemediği kayıtlar; kalan 15 kayıtta bir istem doğruyu biliyordu ve oylamada yenildi. Üç üyeli bir toplulukta doğru bilen tek üye her zaman azınlıktadır. Örtüşme tavanı belirler, oylama da o tavanın ne kadarına erişileceğini; ikisi ayrı sayılardır ve yalnız birincisini yazan bir rapor topluluğun kazancını iki kat abartır.
İkinci koşum sütunu ölçünün kendisinin ne kadar oynadığını gösteriyor: yalnız tohum değişti, örtüşme 9’dan 16’ya çıktı, tavan 0,8667’ye indi. Örtüşme tek bir koşumdan okunamayan bir büyüklüktür.
Üç Kat Çağrının Aldığı Şey
Kazanç, en iyi tek isteme göre +0,0167. Aynı istemlerin iki koşum arasındaki farkı ise 0,0333 ile 0,1333 arasındaydı. Kazanç, koşum farkının en küçüğünün bile yarısı kadar değildir; bu kursun kuralına göre ölçülmemiş sayılır. İkinci koşumda kazanç +0,0083; bir sonraki koşumda işaretinin ne olacağı bilinmiyor.
Bedel ise ölçülmüş ve kesindir. Çağrı sayısı 120’den 360’a çıktı — tam üç kat, çünkü üye sayısı doğrudan çarpandır. Toplam belirteç 3,02 kat arttı ve isabetteki kırıntı bu çarpanı kapatmıyor: doğru etiket başına bedel 61,1 belirteçten 180,7 belirtece çıkıyor. Üç kat pahalı bir düzeneğin ölçülemez bir kazanç vermesi bu kursun ikinci iddiasının tam karşılığıdır — akıl yürütme teknikleri pahalıdır ve her görevde kazandırmaz.
Son tablo, üç çağrının karşılığında gerçekten alınan tek şeyi gösteriyor. Tek istemler iki koşum arasında 39, 43 ve 40 kaydın etiketini değiştiriyor; topluluk 24 kayıtta değiştiriyor. Oylamanın yaptığı iş isabeti yükseltmek değil çıktıyı sabitlemektir, ve bunu da yarı yolda bırakıyor. İki koşumun isabeti 0,8000 ve 0,8000 çıktı; bu iki eşit sayının altında değişen 24 etiket var. Toplam eşit diye kararlı sanmak, bu kursun uyardığı hatanın kendisidir.
Bir istem topluluğu, üyelerin hataları gerçekten ayrı yerlere düştüğünde kazandırır. Burada üç yönerge de aynı beş etiketi ve aynı biçim kısıtını taşıyordu; farkları yazımda kaldı, kararda değil. Aynı bilgiyi üç ayrı cümleyle söylemek üç bakış açısı üretmez, üç fatura üretir.
Özet
- Üç ayrı yönerge aynı görevde 0,7750, 0,6583 ve 0,7833 veriyor; ikinci koşumda sıralama tersine dönüyor. İstemler arası fark ile koşum farkı aynı büyüklükte.
- Örtüşme sayılır: 120 kaydın 9’unda üçü birden yanılıyor, tavan 0,9250. İkinci koşumda bu sayılar 16 ve 0,8667.
- Çoğunluk oyu 0,8000’de kalıyor — tavanın 0,1250 altında. 15 kayıtta bir istem doğruyu biliyordu ve oylamada yenildi; çoğunluk 24 kayıtta yanlışta uzlaştı.
- Kazanç en iyi tek isteme göre +0,0167, iki koşum farkı ise 0,0333 ile 0,1333 arasında. Kazanç ölçülmemiş sayılır.
- Bedel çağrı sayısıyla yazılır: 120 çağrı 360 çağrı, doğru etiket başına 61,1 belirteç 180,7 belirteç. Alınan tek şey koşumlar arası değişimin 40’tan 24’e inmesi.
Sonraki Adım
Bu derste üç istem elle yazıldı ve hangisinin daha iyi olduğu koşuma göre değişti. Elde bir ölçüt, bir küme ve aday istemler vardı; yalnız seçim gözle ve tek koşuma bakılarak yapıldı. Aynı işi bir döngüye çevirmek mümkündür: adaylar üretilir, hepsi aynı ölçütle puanlanır ve en yükseği seçilir. Sonraki ders bu döngüyü kurar ve tek bir soruyu sorar — arama bütçesi büyüdükçe doğrulama kümesinde yükselen sayı, hiç görülmemiş bir sınama kümesine ne kadar taşınıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.