Ders 02 / 12
Deney Takibi
Parametre, ölçüt ve çıktı kaydının bir koşumu yeniden bulunabilir kılmasının ölçülmesi: on sekiz koşumluk bir uzayda kayıt tutulmadığında bildirilen bir sayıyı üreten ağırlığı bulmak için 0,8078 hedefinde 3, 0,7955 hedefinde 2, 0,7950 hedefinde 5, 0,8067 hedefinde 1 ve hiç üretilmemiş bir hedefte 18 koşum yeniden koşturuluyor, tam kayıtla beşinde de 0 koşum tekrarlanıyor; sayının kendisi koşumu tanımlamıyor çünkü on sekiz koşumun on dördü 0,8067 veriyor ve yeniden koşturarak bulunan aday on dört adaydan yalnız biri oluyor; kaydın bedeli koşum başına dokuz alan ve toplam 162 alan, yalnız ölçüt kaydeden 36 alanlık defter ise beş aramadan yalnız birini kısaltıyor.
İçindekiler
Önceki derste üç koşum yapıldı ve üç ayrı sayı çıktı. Üçünü yan yana görebilmemizin tek sebebi üçünün de aynı blokta koşturulmuş olmasıydı. Gerçek bir çalışmada bu koşumlar günlere yayılır, farklı kişiler tarafından yapılır ve geriye yalnız bir sayı kalır: bir sunumda yazılı, bir iletide aktarılmış ya da bir kişinin hatırladığı bir isabet.
Bu ders o sayının peşine düşer. Elimizde bir koşum uzayı olsun ve birinden şu bilgi gelsin: “bir koşum 0,8078 verdi”. Soru tek: o koşumun ağırlıklarını ve kullandığı kalemleri bulmak ne kadar işe mal olur. Ölçü, tekrar koşturulan koşum sayısıdır.
- YU12. Koşum uzayı on sekiz koşumdur: altı sabitleme düzeyi (sıfırdan beş kaleme kadar) çarpı üç tur. Uzay bir seçimdir ve ona duyarlı her sayı uzay boyutuyla birlikte yazılır.
- YU13. Deney takibi, bir koşumun parametrelerini, ölçütünü ve çıktısını koşumun kendisiyle birlikte saklamaktır. Bir ürün değil, bir kayıt disiplinidir.
- YU14. Taban çizgisi kayıtsız kurulumdur: hiçbir koşum yazılmamıştır, elde yalnız bildirilen sayı vardır.
- YU15. Kayıtsız aramanın yordamı şudur: uzay baştan sona sırayla yeniden koşturulur ve bildirilen sayı tuttuğu anda durulur. Tekrar sayısı bu sıraya bağlıdır ve sıra bir seçimdir.
- YU16. Kaydın bedeli saklanan alan olarak sayılır: kayıt başına alan sayısı çarpı koşum sayısı. Ham bayt yazılmaz.
- YU17. Eğitim pratiği, koşum değişkenliği ve ayar bütçesi Derin Öğrenme kursunda ölçüldü; burada tekrarlanmaz. Bu ders yalnız kaydın aramayı ne kadar kısalttığını sayar.
- YU18. Etiket dağılımı önceki derste kurulduğu gibi
{0: 1752, 1: 448}, taban sınıf oranı 0,7964’tür ve bu dersteki isabet sayıları o oranın üstünde bir başarım iddiası taşımaz. Çözünürlük 0,0017’dir.
Koşum Uzayı ve Defter
İlk blok önceki dersin kurgu kaynağını, hattını ve modelini aynen yeniden kurar.
# KURGUDUR. Sayac okumalari, hat ve model ders icinde tanimlanir; gercek bir # ogrenme kitapligi ya da deney takip urunu cagrilmaz. 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 BOLGE = ["dogu", "bati", "kuzey", "guney", "merkez"] TIP = ["mesken", "isyeri"] DONEM = [f"2026-{a:02d}" for a in range(1, 13)] ABONE = {} for i in range(200): r = uretec(TOHUM + 37 * i) ABONE[f"A{i + 1:03d}"] = {"bolge": BOLGE[int(r() * 5)], "tip": TIP[int(r() * 2)], "baslangic": 10000 + int(r() * 60000)} def kaynak_uret(): kayit = [] for i, (ab, a) in enumerate(ABONE.items()): e = a["baslangic"] for d in DONEM: r = uretec(TOHUM + 101 * i + 7 * DONEM.index(d)) e += 4 + int(r() * 46) kayit.append({"abone": ab, "donem": d, "bolge": a["bolge"], "tip": a["tip"], "endeks": e, "birim": "m3"}) return kayit def a1_ayikla(kayit): ZOR = ("abone", "donem", "bolge", "endeks", "birim") tut = [k for k in kayit if all(a in k for a in ZOR)] return tut, len(kayit) - len(tut) def a2_tekille(kayit): gor, tut = set(), [] for k in kayit: ad = (k["abone"], k["donem"]) if ad in gor: continue gor.add(ad) tut.append(k) return tut, len(kayit) - len(tut) def a3_tuketim(kayit): tablo = {(k["abone"], k["donem"]): k for k in kayit} cikti, dusen = [], 0 for k in kayit: i = DONEM.index(k["donem"]) if i == 0: continue onceki = tablo.get((k["abone"], DONEM[i - 1])) if onceki is None: dusen += 1 continue try: f = int(k["endeks"]) - int(onceki["endeks"]) except (TypeError, ValueError): dusen += 1 continue cikti.append(dict(k, m3=f)) return cikti, dusen EGITIM = DONEM[1:9] SINAMA = DONEM[9:] ESIK = 40 def satirlar(): v, _ = a1_ayikla(kaynak_uret()) v, _ = a2_tekille(v) v, _ = a3_tuketim(v) return v def etiket(k): return 1 if k["m3"] > ESIK else 0 def oznitelikler(kayitlar, pencere=None, basamak=4): """Agirliktan bagimsizdir , bir kez hesaplanir.""" sirali = sorted(kayitlar, key=lambda k: DONEM.index(k["donem"])) ab, bo = {}, {} for k in sirali: ab.setdefault(k["abone"], []).append((DONEM.index(k["donem"]), k["m3"])) bo.setdefault(k["bolge"], []).append((DONEM.index(k["donem"]), k["m3"])) def ortalama(dizi, i): secili = [v for d, v in dizi if (d < i and (pencere is None or d >= i - pencere))] return round(sum(secili) / len(secili), basamak) if secili else 0.0 oz = {} for k in kayitlar: i = DONEM.index(k["donem"]) oz[(k["abone"], k["donem"])] = { "abone_ort": ortalama(ab[k["abone"]], i), "bolge_ort": ortalama(bo[k["bolge"]], i), "isyeri": 1 if k["tip"] == "isyeri" else 0} return oz IZGARA = [(a, b, c) for a in (0.6, 0.8, 1.0) for b in (0.0, 0.2, 0.4) for c in (0, 4, 8)] def puan(o, w): return w[0] * o["abone_ort"] + w[1] * o["bolge_ort"] + w[2] * o["isyeri"] def egit(kayitlar, oz, izgara=None, esik=ESIK, donemler=None): izgara = IZGARA if izgara is None else izgara donemler = EGITIM if donemler is None else donemler kume = [k for k in kayitlar if k["donem"] in donemler] en_iyi, en_iyi_w = -1.0, None for w in izgara: d = sum(1 for k in kume if (1 if puan(oz[(k["abone"], k["donem"])], w) > esik else 0) == etiket(k)) o = d / len(kume) if o > en_iyi: en_iyi, en_iyi_w = o, w return {"agirlik": en_iyi_w, "egitim_isabeti": round(en_iyi, 4), "aday": len(izgara), "egitim_satiri": len(kume)} def sina(kayitlar, model, oz, esik=ESIK, donemler=None): donemler = SINAMA if donemler is None else donemler kume = [k for k in kayitlar if k["donem"] in donemler] d = sum(1 for k in kume if (1 if puan(oz[(k["abone"], k["donem"])], model["agirlik"]) > esik else 0) == etiket(k)) return round(d / len(kume), 4) KALEM = ("veri_surumu", "oznitelik_kodu", "bolunme", "izgara", "yuvarlama") def kosum(kayitlar, sabit, tur=0): """Sabitlenmeyen her kalem tur'a gore degisir.""" kay = kayitlar if "veri_surumu" in sabit else kayitlar[: len(kayitlar) - 20 * tur] pencere = None if "oznitelik_kodu" in sabit else (None if tur == 0 else 12 - tur) basamak = 4 if "yuvarlama" in sabit else max(4 - tur, 0) izgara = IZGARA if "izgara" in sabit else IZGARA[: len(IZGARA) - 6 * tur] donemler = SINAMA if "bolunme" in sabit else DONEM[9 + (tur % 2):] oz = oznitelikler(kay, pencere, basamak) m = egit(kay, oz, izgara) return {"agirlik": m["agirlik"], "egitim": m["egitim_isabeti"], "sinama": sina(kay, m, oz, donemler=donemler)}
Bir deney kaydı, koşum bittikten sonra yazılan bir satır değildir; koşumun kendi içinde
üretilir, çünkü koşumun hangi kalemleri kullandığını yalnız koşumun kendisi bilir. Aşağıdaki
kayit_uret bunu yapar: uzaydaki bir koşumu çalıştırır ve o koşumun okuduğu satır sayısını,
denediği aday sayısını, öznitelik penceresini, sınama dönemi sayısını, bulduğu ağırlığı ve elde
ettiği isabeti tek bir kayda yazar.
S = satirlar() UZAY = [(KALEM[:n], tur) for n in range(6) for tur in range(3)] def kayit_uret(no): """Uzaydaki no'lu kosumu calistirir ve kullandigi kalemleri kaydeder.""" sabit, tur = UZAY[no - 1] r = kosum(S, sabit, tur) return {"kosum": no, "sabit": len(sabit), "tur": tur, "satir": len(S) if "veri_surumu" in sabit else len(S) - 20 * tur, "aday": len(IZGARA) if "izgara" in sabit else len(IZGARA) - 6 * tur, "pencere": None if "oznitelik_kodu" in sabit else (None if tur == 0 else 12 - tur), "sinama_donemi": len(SINAMA) if "bolunme" in sabit else len(DONEM) - 9 - (tur % 2), "agirlik": r["agirlik"], "sinama": r["sinama"]} DEFTER = [kayit_uret(no) for no in range(1, len(UZAY) + 1)] print("kosum:", len(DEFTER), " kayit basina alan:", len(DEFTER[0]), " saklanan alan:", len(DEFTER) * len(DEFTER[0])) print() print(f"{'kosum':<7}{'sabit':>6}{'tur':>5}{'satir':>7}{'aday':>6}{'pencere':>9}{'donem':>7}{'sinama':>9}") for k in DEFTER[:3] + DEFTER[-3:]: print(f"{k['kosum']:<7}{k['sabit']:>6}{k['tur']:>5}{k['satir']:>7}{k['aday']:>6}" f"{str(k['pencere']):>9}{k['sinama_donemi']:>7}{k['sinama']:>9.4f}") say = {} for k in DEFTER: say[k["sinama"]] = say.get(k["sinama"], 0) + 1 print() print("farkli sinama sayisi:", len(say), " sayi -> kac kosum:", dict(sorted(say.items())))
kosum: 18 kayit basina alan: 9 saklanan alan: 162
kosum sabit tur satir aday pencere donem sinama
1 0 0 2200 27 None 3 0.8067
2 0 1 2180 21 11 2 0.7955
3 0 2 2160 15 10 3 0.8078
16 5 0 2200 27 None 3 0.8067
17 5 1 2200 27 None 3 0.8067
18 5 2 2200 27 None 3 0.8067
farkli sinama sayisi: 4 sayi -> kac kosum: {0.795: 2, 0.7955: 1, 0.8067: 14, 0.8078: 1}
Defterin ilk üç satırı önceki dersin sabitlemesiz tabanıdır; son üç satırda beş kalemin hepsi sabitlenmiştir ve üç tur da aynı satırı, aynı adayı, aynı pencereyi ve aynı sınama dönemini kullanır. Son satır asıl bulguyu verir: on sekiz koşum yalnız dört ayrı sayı üretmiştir ve bunlardan 0,8067 on dört koşumda çıkmıştır.
Bir Sayıyı Üreten Koşumu Aramak
Şimdi kaydın işe yaradığı yer ölçülebilir. Kayıtsız kurulumda elde yalnız bildirilen sayı vardır ve tek yordam uzayı baştan yeniden koşturmaktır. Kayıtlı kurulumda defter okunur. Arada bir üçüncü durum daha vardır ve pratikte en sık görülen odur: yalnız ölçüt kaydedilmiştir, yani koşum numarası ile isabet yazılmış ama parametreler yazılmamıştır.
HEDEF = (0.8078, 0.7955, 0.7950, 0.8067, 0.8100) def kayitsiz_ara(hedef): """Kayit yok: uzay bastan tekrar kosturulur, sayi tutunca durulur.""" tekrar = 0 for sabit, tur in UZAY: tekrar += 1 if kosum(S, sabit, tur)["sinama"] == hedef: return tekrar return tekrar OLCUT = [(k["kosum"], k["sinama"]) for k in DEFTER] print("yalniz olcut kaydi -- alan:", len(OLCUT) * 2, " tam kayit -- alan:", len(DEFTER) * len(DEFTER[0])) print() print(f"{'hedef':<9}{'kayitsiz':>10}{'yalniz olcut':>14}{'tam kayit':>11}{'ayni sayiyi veren':>19}") for h in HEDEF: a = kayitsiz_ara(h) aday = [k["kosum"] for k in DEFTER if k["sinama"] == h] o = 0 if not any(s == h for _, s in OLCUT) else a print(f"{h:<9.4f}{a:>10}{o:>14}{0:>11}{len(aday):>19}") print() print("0,8067 veren kosumlar:", [k["kosum"] for k in DEFTER if k["sinama"] == 0.8067])
yalniz olcut kaydi -- alan: 36 tam kayit -- alan: 162 hedef kayitsiz yalniz olcut tam kayit ayni sayiyi veren 0.8078 3 3 0 1 0.7955 2 2 0 1 0.7950 5 5 0 2 0.8067 1 1 0 14 0.8100 18 0 0 0 0,8067 veren kosumlar: [1, 4, 6, 7, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]
İlk sütun kayıtsız kurulumun bedelidir ve hedefe göre 1 ile 18 arasında değişir. Son satır en pahalısıdır: bildirilen 0,8100 bu uzayda hiç üretilmemiştir, dolayısıyla arama on sekiz koşumun tamamını tekrarlar ve elde hiçbir şey kalmaz. Bu, kayıtsız aramanın en sık karşılaşılan sonucudur, çünkü bildirilen sayı çoğu zaman uzayın o günkü hâlinden gelir ve uzay değişmiştir.
Üçüncü sütun her hedefte 0’dır. Tam kayıtla arama bir koşum tekrarı gerektirmez; defter okunur ve o kadar.
Sayı Koşumu Tanımlamaz
Tablonun asıl bulgusu son sütunda durur ve tekrar sayılarından daha önemlidir. 0,8067 hedefinde kayıtsız arama bir koşumda “başarılı” olur: uzayın birinci koşumu bu sayıyı verir ve arama durur. Ama aynı sayıyı on dört koşum veriyor. Aramanın bulduğu birinci koşum, bildirilen sayıyı üreten koşum olmak zorunda değildir; on dört adaydan yalnız biridir.
Bunun sonucu şudur: yeniden koşturma bir sayıyı yeniden üretebilir, ama bir koşumu teşhis edemez. Bildirilen sayı 0,8067 ise, o koşumun 2200 satır mı 2160 satır mı okuduğu, 27 aday mı 15 aday mı denediği ve sınamayı üç döneme mi iki döneme mi ayırdığı sayıdan çıkarılamaz. Defter bu soruların hepsini tek satırda yanıtlar ve on dört adayı birbirinden ayırır. Kaydın verdiği şey tekrar tasarrufu değil, teşhistir; tekrar tasarrufu yan üründür.
Kaydın Bedeli
Defterin bedeli iki kalemdir. Birincisi saklanan alandır: her koşum dokuz alan yazar, on sekiz
koşum 162 alan tutar. Bu alan koşum sayısıyla doğru orantılı büyür; bir ayar taramasında yüzlerce
koşum yapılırsa defter de o oranda büyür ve bir saklama politikası gerektirir. İkincisi eklenen
adımdır: kayit_uret koşumun içinde çalışır, yani eğitim hattına bir yazma adımı girer ve o adım
koşumun kullandığı kalemleri okumak zorundadır. Kalemi okuyamayan bir kayıt onu yazamaz.
İkinci sütun bu bedelin nasıl boşa harcanabileceğini gösterir. Yalnız ölçüt kaydeden defter 36 alan tutar, yani tam defterin beşte birinden azdır, ve beş aramadan yalnız birini kısaltır: hiç üretilmemiş 0,8100 hedefinde on sekiz tekrarı sıfıra indirir. Kalan dört hedefte tekrar sayısı kayıtsız kurulumla birebir aynıdır, çünkü parametre yazılmadığında koşum yine yeniden koşturulmak zorundadır. Bir defter tutuluyor olması bir güvence değildir; hangi alanları tuttuğu ölçülmedikçe defter bir bedelden ibarettir.
Özet
- Deney takibi bir koşumun parametrelerini, ölçütünü ve çıktısını koşumun kendi içinde yazmaktır; kalemleri yalnız koşumun kendisi bildiği için kayıt sonradan tamamlanamaz.
- On sekiz koşumluk uzay yalnız dört ayrı sayı üretir ve 0,8067 on dört koşumda çıkar.
- Kayıtsız kurulumda bildirilen bir sayıyı üreten koşumu bulmak 1, 2, 3, 5 ya da 18 koşum tekrarına mal olur; hiç üretilmemiş bir sayıda uzayın tamamı boşa koşturulur. Tam kayıtla beş hedefte de tekrar sayısı 0’dır.
- Yeniden koşturma bir sayıyı yeniden üretir ama koşumu teşhis edemez: 0,8067 hedefinde arama bir tekrarda durur ve bulduğu koşum on dört adaydan yalnız biridir.
- Kaydın bedeli koşum başına dokuz alan, toplam 162 alan ve eğitim hattına eklenen bir yazma adımıdır.
- Yalnız ölçüt kaydeden 36 alanlık defter beş aramadan yalnız birini kısaltır; bir defterin varlığı değil, hangi alanları tuttuğu ölçülür.
Sonraki Adım
Defter koşumun kullandığı satır sayısını yazdı, ama satırların hangileri olduğunu yazmadı. On sekiz koşumun hepsi verisini aynı yerden okudu ve o yerin adı hiç değişmedi; içeriğinin değişip değişmediği ise sorulmadı. Bir koşum 2200 satır okuduğunu kaydettiğinde, bir hafta sonraki koşum da 2200 satır okuduğunu kaydeder ve iki sayı aynı görünür. Sonraki ders bu adın altındaki içeriği ölçer: sürümsüz bir kurulumda kaç koşum aynı adı gösterip farklı sonuç veriyor, sürümle kaç, ve sürümün kendi bedeli ne kadar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.