İçeriğe geç
academia.sh

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.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat