Ders 14 / 26
Belirsizlik ve Yeniden Üretilebilirlik
Bir model çağrısının çıktısını belirleyen kalemlerin sayılması ve her birinin tek başına serbest bırakılması: on iki kalemin 11'i yanıtları oynatıyor, en büyük oynama yönergenin biçim sözcüğünde (bütün yanıtlar değişiyor, isabet 0,9125'ten 0,5525'e iniyor). Anlamı hiç değiştirmeyen boşluk düzeni yanıtların 0,0700'ünü, istemci normalleştirmesi 0,1300'ünü oynatıyor. Tek başına hiçbir şey oynatmayan en büyük çıktı uzunluğu, yönerge sözcüğüyle birlikte serbest bırakıldığında isabeti 0,5525'ten 0,2675'e indiriyor. Kalemlerin 9'u istemcide, 3'ü sağlayıcıdadır ve üçü birlikte serbest kaldığında yanıtların 0,1150'si oynuyor, isabet 0,0200 düşüyor: önceki iki dersin eşiği budur.
İçindekiler
Önceki iki derste bir eşik tekrar tekrar kullanıldı: iki koşum arasındaki fark. Maliyet defterinde 0,0200 çıktı, kesinti tablosunda yine 0,0200 çıktı, ve bu sayının altında kalan her kazanç ölçülmemiş sayıldı. Eşiğin kendisi hiç sorulmadı. Aynı kod, aynı iş yükü ve aynı istem iki koşumda niçin iki ayrı sayı veriyor.
Sorunun bir bölümü daha önce kapandı. Görselleştirme, Raporlama ve Ölçekli Analiz kursu bir raporun yeniden üretilmesini elli dokuz kalem olarak yazdı: hazırlama defterinin otuz dokuz kararı, çalışma ortamının dokuz kalemi ve raporun kendi on bir kalemi. Derin Öğrenme kursu aynı hesabı bir eğitim için yaptı, eğitime özgü sekiz kalemi ekledi ve altmış yediye çıkardı. Bu hesap burada tekrarlanmaz. Eklenen soru şudur: bir model çağrısının kendi kalemleri nelerdir ve kaçı bizim elimizdedir.
- UK45. Kod bir benzeticidir; gerçek bir uç nokta çağrılmaz. Talepler, konuşmalar ve belgeler kurgudur, tohum 20260218.
- UK46. İş yükü önceki iki dersinkiyle aynıdır: 154 kurgu konuşmadan gelen 400 istek.
- UK47. Kalem, çağrının çıktısını belirleyebilecek ve koşumdan koşuma taşınması gereken her karardır. Her kalem eşit ölçüde savunulabilir bir alternatife geçirilir; yanlış bir değere değil.
- UK48. İki ölçü basılır: değişen yanıt payı (400 yanıttan kaçı taban koşumdakinden farklı) ve isabet. İkisi ayrı şeylerdir.
- UK49. Kalemler iki tarafa ayrılır. Dokuzu istemcide, üçü sağlayıcıdadır. Sağlayıcı kalemleri benzeticide sabitlenebilir ama gerçek bir uç noktada sabitlenemez; bu derste sabitlenemez sayılırlar.
- UK50. Devralınan kalemler: hazırlama defterinin 39 kararı ve çalışma ortamının 9 kalemi. Eğitime özgü sekiz kalem devralınmaz, çünkü model verilmiştir ve eğitilmez.
- UK51. Yönergenin biçim sözcüğü kalemi listenin uç noktasıdır: benzetici yanıtın biçimini
istemdeki
teksözcüğüne bağlar. Bu, biçim uyumunun yüzey sözcüğüne bağlı olmasının modellenmiş hâlidir. - UK52. Sağlayıcının sürüm değişikliği, iz tablosuna iki girdi eklenmesiyle modellenir.
Bir Çağrının Kalemleri
# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz; talepler, konusmalar # ve belgeler kurgudur, tohum 20260218. import math TOHUM, M32 = 20260218, 0xFFFFFFFF PENCERE = 240 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): h = 2166136261 for c in m: h = ((h ^ ord(c)) * 16777619) & M32 return h KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"] KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"] 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"]} IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura", "borc": "odeme", "odedi": "odeme", "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", "yardi": "bilgi", "nered": "bilgi", "kayit": "sikayet", "bekle": "sikayet"} SERBEST = ["talebiniz {k} konusunda kaydedildi ve ekibe iletildi", "{k} ile ilgili kaydiniz olusturuldu en kisa surede donulecek", "kaydiniz alindi ilgili birim sizinle iletisime gececek"] SAYAC = [0] def oku(y): return next((s for s in y.split() if s in KONU), None) BELGE = ["TR1 tarife basamaklari abone tipine gore belirlenir ve yilda bir guncellenir", "FT2 fatura itirazi kayit acildiktan sonra on is gunu icinde sonuclanir", "SY3 sayac degisimi randevusu saha ekibinin bolge programina baglidir", "AR4 ariza kaydi acilan adreste ekip ayni gun icinde yonlendirilir", "KS5 planli kesinti duyurulari bir hafta once ilan panosuna asilir"] KONUS, i = [], 0 while sum(len(c["tur"]) for c in KONUS) < 400: # KURGU is yuku: konusmalar r = uretec(TOHUM + 900 + i) i += 1 k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])] u = [1, 2, 3, 5, 8, 12][ayrik(r(), [0.46, 0.24, 0.14, 0.09, 0.05, 0.02])] KONUS.append({"no": i, "belge": ayrik(r(), [0.74, 0.16, 0.07, 0.03]), "tur": [{"konu": k, "metin": KALIP[k][(i + t) % 3]} for t in range(u)]}) ISTEK = [{"kon": c, "sira": t, "talep": c["tur"][t]} for c in KONUS for t in range(len(c["tur"]))][:400] VAR = dict(tohum=TOHUM, sicaklik=0.6, en_uzun=24, soz="tek", etiket="kurgu", bosluk="tek", durum="tam", parca="belge sonra", normal="ham", deneme=3, iz="surum a", esik=37) IZ_B = dict(IZ, gecen="fatura", ekip="kesinti") # saglayicinin surum degisikligi def cagir3(istem, a): """Ayar sozlugu ile cagri: her kalem ayri bir anahtardir.""" SAYAC[0] += 1 bel = belirtecle(istem) if len(bel) > PENCERE: return {"durum": "baglam_asimi", "yanit": ""} if SAYAC[0] % a["esik"] == 0: return {"durum": "hiz_siniri", "yanit": ""} r = uretec(a["tohum"] ^ izno(istem)) if len(bel) > 90 and r() < 0.04: return {"durum": "zaman_asimi", "yanit": ""} iz = IZ if a["iz"] == "surum a" else IZ_B aday = [k for k in KAVRAM if k[:5] in bel] p = {k: 0.15 for k in (aday if len(aday) >= 3 else KAVRAM)} for t in bel: if iz.get(t) in p: p[iz[t]] += 1.0 w = [math.exp(p[q] / a["sicaklik"]) for q in sorted(p)] k = sorted(p)[ayrik(r(), [x / sum(w) for x in w])] y = k if "tek" in bel else SERBEST[int(r() * 3)].format(k=k) cb = belirtecle(y) return {"durum": "tamam", "yanit": " ".join(cb[:a["en_uzun"]]) if len(cb) > a["en_uzun"] else y} def istem_kur(x, a): et = KONU if a["etiket"] == "kurgu" else sorted(KONU) yon = ("Talebi su etiketlerden birine ata: " + " , ".join(et) + " . Yanit olarak " + ("tek" if a["soz"] == "tek" else "yalnizca") + " etiket yaz . Talep: ") t = x["kon"]["tur"][:x["sira"]] g = "".join(f"Onceki: {o['metin']} Yanit: {o['konu']} . " for o in (t[-2:] if a["durum"] == "iki tur" else t)) b = "".join(BELGE[(x["kon"]["no"] + j) % 5] + " . " for j in range(x["kon"]["belge"])) s = yon + (b + g if a["parca"] == "belge once" else g + b) + x["talep"]["metin"] if a["bosluk"] == "cift": s = s.replace(" ", " ") if a["normal"] == "sadelesmis": s = " ".join(s.lower().split()) return s def kos(**d): a = dict(VAR, **d) SAYAC[0] = 0 cikti = [] for x in ISTEK: ist = istem_kur(x, a) for i in range(a["deneme"]): s = cagir3(ist, dict(a, tohum=a["tohum"] + i)) if s["durum"] == "tamam": break cikti.append(s["yanit"]) return cikti def isabet(c): return sum(oku(y) == x["talep"]["konu"] for y, x in zip(c, ISTEK)) / 400 def degisen(c, ref): return sum(a != b for a, b in zip(ref, c)) / 400 KALEM = [("saglayici", "ornekleme durumu", dict(tohum=TOHUM + 1)), ("saglayici", "model surumu", dict(iz="surum b")), ("saglayici", "hiz siniri esigi", dict(esik=31)), ("istemci", "dagilim sicakligi", dict(sicaklik=0.8)), ("istemci", "en buyuk cikti uzunlugu", dict(en_uzun=10)), ("istemci", "yonerge bicim sozcugu", dict(soz="yalnizca")), ("istemci", "etiket kumesi sirasi", dict(etiket="alfabetik")), ("istemci", "bosluk duzeni", dict(bosluk="cift")), ("istemci", "konusma durumu", dict(durum="iki tur")), ("istemci", "baglam parcasi sirasi", dict(parca="belge once")), ("istemci", "istemci normallestirmesi", dict(normal="sadelesmis")), ("istemci", "yeniden deneme sayisi", dict(deneme=1))] REF = kos() print("taban isabet %.4f , kalem sayisi %d" % (isabet(REF), len(KALEM))) print("taraf kalem degisen isabet fark") for taraf, ad, d in KALEM: c = kos(**d) print(f"{taraf:<10} {ad:<25} {degisen(c, REF):>7.4f} {isabet(c):>7.4f}" f" {isabet(c) - isabet(REF):>+8.4f}") print("oynatan kalem", sum(degisen(kos(**d), REF) > 0 for _, _, d in KALEM), "/", len(KALEM))
taban isabet 0.9125 , kalem sayisi 12 taraf kalem degisen isabet fark saglayici ornekleme durumu 0.1200 0.8925 -0.0200 saglayici model surumu 0.0150 0.9175 +0.0050 saglayici hiz siniri esigi 0.0050 0.9075 -0.0050 istemci dagilim sicakligi 0.0600 0.8575 -0.0550 istemci en buyuk cikti uzunlugu 0.0000 0.9125 +0.0000 istemci yonerge bicim sozcugu 1.0000 0.5525 -0.3600 istemci etiket kumesi sirasi 0.1100 0.9100 -0.0025 istemci bosluk duzeni 0.0700 0.9325 +0.0200 istemci konusma durumu 0.0050 0.9125 +0.0000 istemci baglam parcasi sirasi 0.0025 0.9150 +0.0025 istemci istemci normallestirmesi 0.1300 0.8775 -0.0350 istemci yeniden deneme sayisi 0.0375 0.8750 -0.0375 oynatan kalem 11 / 12
On iki kalemin on biri tek başına serbest bırakıldığında yanıtları oynatıyor. Listenin en öğretici satırları, oynatması beklenmeyenlerdir. Boşluk düzeni istemin anlamına hiç dokunmuyor, aynı sözcükleri aynı sırada gönderiyor ve yanıtların 0,0700’ünü değiştiriyor. İstemci normalleştirmesi aynı biçimde anlamı korurken 0,1300’ünü değiştiriyor. Etiket kümesinin sırası beş etiketi başka sırada yazıyor ve 0,1100 oynatıyor. Bir istemin metni, anlamıyla değil birebir kendisiyle bir girdidir.
Değişen yanıt ile bozulan yanıt aynı şey değildir ve tablo bunu ayrı sütunlarda tutuyor. Boşluk düzeni yanıtların yüzde yedisini değiştiriyor ama isabeti 0,9125’ten 0,9325’e yükseltiyor; kazanç tesadüfidir ve bir sonraki koşumda tersine dönebilir. Etiket sırası 0,1100 oynatıp isabeti yalnız 0,0025 düşürüyor. Buna karşılık dağılım sıcaklığı yalnız 0,0600 oynatıp isabeti 0,0550 düşürüyor: az sayıda yanıt değişiyor ama değişenlerin neredeyse tamamı doğrudan yanlışa gidiyor. Oynama payı tek başına bir zarar ölçüsü değildir.
İki satır beklenenden küçük çıkıyor. Konuşma durumu yalnız 0,0050 oynatıyor, oysa 400 isteğin 113’ünde istem metni değişti; bağlam parçası sırası 0,0025 oynatıyor, oysa 60 istekte iki parça birden vardı. Uzun konuşmalar en kararlı isteklerdir, çünkü aynı konudan gelen izler birikince seçim tek bir kavramda toplanır ve çekiliş onu bozamaz. Kararlılık isteğe göre değişir; tek bir oynama payı bütün iş yükünü anlatmaz.
En büyük satır ise ölçek olarak diğerlerinden ayrılır. Yönergenin biçim sözcüğü eşanlamlısıyla değiştirildiğinde yanıtların tamamı değişiyor ve isabet 0,9125’ten 0,5525’e iniyor. Bu kalem çekilişi değil görevi değiştiriyor: biçim kısıtı kalkınca model tek etiket yerine cümle yazmaya başlıyor ve cümlelerin bir bölümü hiçbir etiket taşımıyor. Eşanlamlı bir sözcük, ölçüyü 0,3600 düşürdü.
Birlikte Serbest Bırakılan Kalemler
ikili = kos(en_uzun=10, soz="yalnizca") tek_kalem = kos(soz="yalnizca") print("yalniz en buyuk cikti uzunlugu degisen %.4f isabet %.4f" % (degisen(kos(en_uzun=10), REF), isabet(kos(en_uzun=10)))) print("yalniz yonerge bicim sozcugu degisen %.4f isabet %.4f" % (degisen(tek_kalem, REF), isabet(tek_kalem))) print("ikisi birlikte degisen %.4f isabet %.4f" % (degisen(ikili, REF), isabet(ikili))) uc = kos(tohum=TOHUM + 1, iz="surum b", esik=31) print("dokuz istemci kalemi sabit, uc saglayici kalemi serbest:" " degisen %.4f isabet %.4f" % (degisen(uc, REF), isabet(uc))) print("sabitlenebilir kalem 39 + 9 + 9 =", 39 + 9 + 9, ", sabitlenemeyen 3 , toplam", 39 + 9 + 12)
yalniz en buyuk cikti uzunlugu degisen 0.0000 isabet 0.9125 yalniz yonerge bicim sozcugu degisen 1.0000 isabet 0.5525 ikisi birlikte degisen 1.0000 isabet 0.2675 dokuz istemci kalemi sabit, uc saglayici kalemi serbest: degisen 0.1150 isabet 0.8925 sabitlenebilir kalem 39 + 9 + 9 = 57 , sabitlenemeyen 3 , toplam 60
Tablonun tek sıfırı en büyük çıktı uzunluğuydu. Sınır yirmi dörtten ona indirildiğinde hiçbir yanıt değişmiyor, çünkü tek etiketlik yanıtlar iki belirteçten uzun değil. Bir sabitleme listesi hazırlarken bu kalemi atmak akla yatkın görünür.
İkinci ve üçüncü satır bunun niçin yanlış olduğunu gösteriyor. Biçim sözcüğü tek başına serbest bırakıldığında isabet 0,5525’e iniyor; ikisi birlikte serbest bırakıldığında 0,2675‘e iniyor. Aradaki 0,2850, tek başına hiçbir şey oynatmayan kalemin hesabıdır: cümleye dönen yanıtlar on belirteçte kesiliyor ve kesilen metinde etiket okunamıyor. Aynı sonuca iki kurs daha varmıştı: Görselleştirme, Raporlama ve Ölçekli Analiz kursu tek başına raporu oynatmayan bir kalemin başka bir kalemle birlikte oranı 87,168’den 94,432’ye taşıdığını, Derin Öğrenme kursu tek başına sıfır oynatan tur sayısının toplu boyla birlikte iki aboneyi kaydırdığını ölçtü. Tek başına oynatmayan kalem, sabitlenmesi gerekmeyen kalem değildir.
Sabitlenemeyen Üç Kalem
Son iki satır bu konunun kapanış sayısını veriyor. Bir model çağrısının yeniden üretilmesi 60 kalemin sabitlenmesini ister: hazırlama defterinin 39 kararı, çalışma ortamının 9 kalemi ve bu derste sayılan 12 kalem. Bunların 57’si bizim elimizdedir. Kalan üçü — örnekleme durumu, model sürümü ve hız sınırı eşiği — sağlayıcının elindedir ve hiçbir dosyaya yazılarak sabitlenemez.
Dokuz istemci kalemi sabitken bu üçü birlikte serbest bırakıldığında yanıtların 0,1150‘si oynuyor ve isabet 0,9125’ten 0,8925’e iniyor. Düşüş 0,0200. Önceki iki dersin eşiği tam olarak budur: maliyet defterindeki 0,0200 ve kesinti tablosundaki 0,0200, bir gürültü değil, bu üç kalemin adıdır. Eşik keyfi seçilmiş bir sayı değil, sabitlenemeyen kalemlerin ölçülmüş payıdır.
Buradan çıkan sonuç, önceki iki kursunkinden yapıca farklıdır. Bir rapor 59 kalemin 59’uyla, bir eğitim 67 kalemin 67’siyle sabitlenebilir; ikisi de eksiksiz yeniden üretilebilir. Bir model çağrısı sabitlenemez. Bu yüzden belirlenimcilik bir hedef değil bir sınırdır ve ulaşılabilecek en iyi şey oynamanın ölçülmüş olmasıdır. Bunun uygulamadaki karşılığı tek bir kuraldır: her ölçüm raporunun yanına iki koşum farkı yazılır ve o farkın altındaki hiçbir kazanç kazanç sayılmaz.
Özet
- Bir model çağrısının yeniden üretilmesi 60 kalem ister: devralınan 39 hazırlama kararı, 9 ortam kalemi ve çağrıya özgü 12 kalem.
- On iki kalemin 11’i tek başına serbest bırakıldığında yanıtları oynatıyor; en büyüğü yönergenin biçim sözcüğüdür ve isabeti 0,9125’ten 0,5525’e indiriyor.
- Anlamı hiç değiştirmeyen kalemler de oynatıyor: boşluk düzeni 0,0700, istemci normalleştirmesi 0,1300, etiket kümesi sırası 0,1100.
- Değişen yanıt ile bozulan yanıt ayrı sayılır: boşluk düzeni 0,0700 oynatıp isabeti yükseltirken dağılım sıcaklığı 0,0600 oynatıp 0,0550 düşürüyor.
- Tek başına 0,0000 oynatan en büyük çıktı uzunluğu, biçim sözcüğüyle birlikte serbest bırakıldığında isabeti 0,5525’ten 0,2675’e indiriyor.
- Üç kalem sağlayıcıdadır ve sabitlenemez; birlikte serbest kaldıklarında yanıtların 0,1150’si oynuyor ve isabet 0,0200 düşüyor, yani önceki iki dersin eşiği ölçülmüş olur.
Sonraki Adım
On dört derste çağrı bir ürünün içinde ele alındı. Mesaj tabanlı arayüzün ne sunduğu, akışın ne değiştirdiği, bir araç çağrısının kaçının geçerli olduğu, hız sınırının ne kadara mal olduğu, önbelleğin ne kazandırdığı, gecikmenin hangi sınıfa indiği, faturanın hangi kalemlerden oluştuğu, kesintinin kaliteyi nasıl sessizce düşürdüğü ve aynı girdinin niçin iki çıktı verdiği sayıldı. Bütün bu ölçümlerde çağrıyı yapan bir uygulamaydı ve o uygulamayı yazan kişi ölçümün dışında durdu. Oysa aynı model geliştiricinin kendi masasında da çalışıyor: kod tamamlarken, var olan bir işlevi açıklarken, bir dosyayı dönüştürürken, hatta çok adımlı bir görevi devralırken. Sonraki konu ölçüyü oraya taşır ve aynı soruyu sorar: kurgu bir kod tabanında hangi görev sınıfında düzeneksiz çağrı çöküyor, hangi bağlam kaç belirtece mal oluyor ve kabul edilen önerinin kaçı gerçekten doğru.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.