İçeriğe geç
academia.sh

Ders 23 / 24

Deney Takibi

Aynı eğitimin ikinci kez aynı sayıyı vermesi için sabitlenmesi gereken kalemin sayılması: M26/K03'ün 39, M26/K04'ün 9 ve M26/K06'nın 11 kaleminin üstüne eğitime özgü 8 kalem eklenir ve toplam 67 olur. Sekiz kalemin 6'sı tek başına serbest bırakıldığında sonucu oynatıyor ve en büyük oynama 0,0159, yani dört abone — o kalem modelin hiçbir ayarı değil, başlangıç değerleri. Toplama sırası parametreleri 6,66e-16 oynatıp hiçbir kararı değiştirmezken tur sayısı parametreleri 0,2098 oynatıp yine hiçbir kararı değiştirmiyor; tek başına oynatmayan tur sayısı toplu boyla birlikte serbest bırakıldığında sonucu iki abone kaydırıyor.

İçindekiler

Önceki üç derste eğitimin düzeneği parça parça açıldı ve her parçada bir karar çıktı: eğim hangi yolla hesaplanacak, örnekler hangi sırayla verilecek, kaç tanesi bir arada, adım ne olacak. Her karar sonucu oynattı ve hiçbiri modelin kendisi değildi. Bir eğitimin ikinci kez aynı sayıyı vermesi için bu kararların kaçının yazılı olması gerektiği ise sorulmadı.

Soru yeni değil ve bir bölümü kapandı. Veri Toplama ve Hazırlama kursu hazırlama defterini otuz dokuz karar olarak yazdı; Python ile Veri Analizi kursu çalışma ortamını dokuz kalem olarak; Veri Görselleştirme ve Raporlama kursu raporun kendisini on bir kalem olarak saydı ve toplamı elli dokuz buldu. M27/K02 boru hattı dersinde bu listenin yanına bir sayı daha koydu: hazırlama zinciri eğitim kümesinden 131 sayı öğreniyordu ve o sayıların hepsinin doğru kümeden okunması gerekti. Bu hesaplar tekrarlanmaz, girdi alınır. Bu dersin eklediği şey eğitimin kendisidir.

  • EP18. Küme, ağ, taban çizgisi ve geri yayılım 01. dersten devralınır. Eğitim döngüsünün kalemleri tek bir sözlükte toplanır ve koşum bu sözlükten okunur; yalnız ölçekleme kalemi döngünün dışında, veri hazırlanırken uygulanır.
  • EP19. Bir kalemi serbest bırakmak, onu silmek değil, eşit ölçüde savunulabilir bir başka değere geçirmek demektir. Otuz yerine yirmi beşlik toplu, 0,30 yerine 0,25’lik adım, kırk yerine elli tur: hiçbiri yanlış değildir.
  • EP20. Kalemler tek tek serbest bırakılır, öbürleri sabit kalır. Ölçüt sınama kümesindeki doğruluktur ve sınama kümesi hiçbir kurulumda değişmez.
  • EP21. “Toplama sırası” kalemi eşzamanlılığın izidir: bir toplunun eğimleri paralel toplandığında hangi terimin önce eklendiği koşumdan koşuma değişebilir. Burada bu, topludaki örneklerin ters sırada toplanmasıyla modellenir; kayan noktalı toplama birleşmeli olmadığı için sonuç son basamaklarda ayrılır.
  • EP22. İki büyüklük ayrı sayılır: parametrelerin oynaması ve sonucun oynaması. Birinci sıfır değilken ikincisi sıfır olabilir; eşik, kararın sınırından ne kadar uzakta durulduğudur.
  • EP23. Hiçbir deney takip aracı, not defteri uygulaması ya da depo adı anılmaz. Takip burada kalem listesinin kendisidir: liste taşınabiliyorsa koşum taşınabilir.

Küme, Ağ ve Kalem Sözlüğü

# ORTAK — KURGUDUR. M27/K01-K04'un abone tablosu ayni tohumla (20260218) uretilir;
# egitim kumesi 756'dan 300 satira kucultulmustur. Egitim dongusunun kalemleri tek
# bir sozlukte toplanir ve kosum bu sozlukten okunur.
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]
ALAN = ["b_guney", "b_dogu", "b_bati", "b_merkez",
        "hane", "memnuniyet", "donem", "ortalama"]


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 karistir(dizi, tohum):
    r, s = uretec(tohum), list(dizi)
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return s


VERI = []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[1] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() < 0.046:
        continue
    no = 10001 + i
    r, v = uretec(TOHUM + 7000 + no), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            b[2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + no)
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn
         + 0.24 * (hane >= 5) - 0.20 * (memnun >= 4) + b[3]
         + 0.9 * (no - 10001) / 1399 + (r() + r() + r() - 1.5) * 1.30)
    x = {"hane": hane, "memnuniyet": memnun, "donem": len(v),
         "ortalama": round(ort, 2), "supheli": int(z > 1.35)}
    for q in BOLGE[1:]:
        x["b_" + q[0]] = int(b[0] == q[0])
    VERI.append(x)

K = karistir(VERI, TOHUM + 90000)
EGT, SIN = K[:300], K[1008:]


def tablo(satirlar, ist=None):
    X = [[float(s[a]) for a in ALAN] for s in satirlar]
    if ist is None:                       # olcek yalniz egitim kumesinden ogrenilir
        ist = []
        for j in range(4, 8):
            m = sum(v[j] for v in X) / len(X)
            ist.append((j, m, math.sqrt(sum((v[j] - m) ** 2 for v in X) / len(X))))
    for v in X:
        for j, m, sd in ist:
            v[j] = (v[j] - m) / sd
    return X, [s["supheli"] for s in satirlar], ist


XE, yE, IST = tablo(EGT)
XS, yS, _ = tablo(SIN, IST)
TABAN = sum(v == 0 for v in yS) / len(yS)

G, H = len(ALAN), 8


def ilklendir(tohum):                    # kazanc olcekli ilklendirme
    r = uretec(tohum)
    return [(r() * 2 - 1) * math.sqrt(2.0 / G) for _ in range(H * G)] + [0.0] * H \
        + [(r() * 2 - 1) * math.sqrt(2.0 / H) for _ in range(H)] + [0.0]


def egim(p, X, y, par):                  # 01. dersin elle yazilan geri yayilimi
    g = [0.0] * len(p)
    for k in par:
        x, hh = X[k], [0.0] * H
        for j in range(H):
            s = p[H * G + j] + sum(p[j * G + i] * x[i] for i in range(G))
            hh[j] = s if s > 0 else 0.0
        s = p[-1] + sum(p[H * G + H + j] * hh[j] for j in range(H))
        d = (1.0 / (1.0 + math.exp(-s)) if s > -30 else 0.0) - y[k]
        g[-1] += d
        for j in range(H):
            g[H * G + H + j] += d * hh[j]
            if hh[j] > 0:
                g[H * G + j] += d * p[H * G + H + j]
                for i in range(G):
                    g[j * G + i] += d * p[H * G + H + j] * x[i]
    return [v / len(par) for v in g]


VARSAYILAN = {"tohum": TOHUM + 1, "sira": TOHUM + 700, "toplu": 30, "adim": 0.30,
              "tur": 40, "bolme": "dilim", "toplama": "ileri", "olcek": "egitim"}


def egit(X, y, **kalem):
    a = dict(VARSAYILAN, **kalem)
    p = ilklendir(a["tohum"])
    for t in range(a["tur"]):
        d = karistir(range(len(X)), a["sira"] + t)
        n = len(d) // a["toplu"]
        for b in range(n):
            par = d[b * a["toplu"]:(b + 1) * a["toplu"]] if a["bolme"] == "dilim" \
                else d[b::n]
            if a["toplama"] == "geri":
                par = par[::-1]
            p = [u - a["adim"] * v for u, v in zip(p, egim(p, X, y, par))]
    return p


def dogruluk(p, X, y):
    n = 0
    for k in range(len(X)):
        x = X[k]
        o = p[-1] + sum(p[H * G + H + j] * max(0.0, p[H * G + j]
                        + sum(p[j * G + i] * x[i] for i in range(G)))
                        for j in range(H))
        n += (o >= 0.0) == (y[k] == 1)
    return n / len(X)


print(f"kurgu: egitim {len(XE)} satir (756'dan kucultuldu), sinama {len(XS)}, "
      f"parametre {len(ilklendir(TOHUM))}; taban cizgisi {TABAN:.4f}")
kurgu: egitim 300 satir (756'dan kucultuldu), sinama 252, parametre 81; taban cizgisi 0.7579

Kaç Kalem

# Sabitlenecek kalemler. Ilk uc kaynak ONCEKI KURSLARDAN devralinir ve burada
# tekrarlanmaz; bu ders yalniz EGITIME OZGU olanlari ekler.
DEVRALINAN = [("hazirlama defteri (M26/K03)", 39),
              ("calisma ortami (M26/K04)", 9),
              ("raporun kendisi (M26/K06)", 11)]
EGITIM = ["ilklendirme tohumu", "ornek sirasi tohumu", "toplu boy",
          "toplu bolme bicimi", "ogrenme adimi", "tur sayisi",
          "toplama sirasi (eszamanlilik)", "olcegin okundugu kume"]
for ad, n in DEVRALINAN:
    print(f"  {ad:<30} {n:>3} kalem")
print(f"  {'egitimin kendisi (bu ders)':<30} {len(EGITIM):>3} kalem")
print(f"  {'toplam':<30} {sum(n for _, n in DEVRALINAN) + len(EGITIM):>3} kalem")
print("\negitime ozgu kalemler ve varsayilan degerleri:")
print("  " + ", ".join(f"{a}={VARSAYILAN[k]}" for a, k in
                       zip(EGITIM, ("tohum", "sira", "toplu", "bolme", "adim",
                                    "tur", "toplama", "olcek"))))
  hazirlama defteri (M26/K03)     39 kalem
  calisma ortami (M26/K04)         9 kalem
  raporun kendisi (M26/K06)       11 kalem
  egitimin kendisi (bu ders)       8 kalem
  toplam                          67 kalem

egitime ozgu kalemler ve varsayilan degerleri:
  ilklendirme tohumu=20260219, ornek sirasi tohumu=20260918, toplu boy=30, toplu bolme bicimi=dilim, ogrenme adimi=0.3, tur sayisi=40, toplama sirasi (eszamanlilik)=ileri, olcegin okundugu kume=egitim

Toplam altmış yedi. Elli dokuzu bu dersten önce sayıldı ve burada tekrarlanmadı; sekizi eğitimin kendisine aittir. Sekizin hiçbiri modelin mimarisi değildir — katman sayısı, birim sayısı ve etkinleştirme bu listeye girmez, çünkü onlar raporlanan modelin tanımıdır. Listedekiler rapor edilen sayının nasıl üretildiğine dair kararlardır ve çoğu tek satırda geçer.

Her Kalem Tek Tek

# Her kalem TEK BASINA serbest birakilir: esit olcude savunulabilir bir baska
# degere gecirilir, oburleri sabit kalir. Olcek kalemi serbest birakildiginda
# olcek istatistigi egitim yerine egitim+sinama kumesinden okunur.
XE2, yE2, _ = tablo(EGT, tablo(EGT + SIN)[2])
TEMEL, P0 = dogruluk(egit(XE, yE), XS, yS), egit(XE, yE)
ALTERNATIF = [({"tohum": TOHUM + 2}, "20260220"), ({"sira": TOHUM + 800}, "20261018"),
              ({"toplu": 25}, "25"), ({"bolme": "adimli"}, "adimli"),
              ({"adim": 0.25}, "0.25"), ({"tur": 50}, "50"),
              ({"toplama": "geri"}, "geri"), (None, "egitim+sinama")]
print(f"taban cizgisi {TABAN:.4f}, butun kalemler sabitken {TEMEL:.4f}\n")
print(f"{'serbest birakilan kalem':<30} {'yeni deger':<14} {'sinama':>7} {'oynama':>8} "
      f"{'abone':>6} {'parametre':>10}")
OYNAMA = []
for ad, (d, yeni) in zip(EGITIM, ALTERNATIF):
    p = egit(XE, yE, **d) if d else egit(XE2, yE2)
    v = dogruluk(p, XS, yS)
    OYNAMA.append(abs(v - TEMEL))
    print(f"{ad:<30} {yeni:<14} {v:>7.4f} {v - TEMEL:>+8.4f} "
          f"{round(abs(v - TEMEL) * len(XS)):>6} "
          f"{max(abs(a - b) for a, b in zip(p, P0)):>10.2e}")
print(f"\n{len(OYNAMA)} kalemin {sum(1 for u in OYNAMA if u > 1e-9)} tanesi tek basina "
      f"sonucu oynatiyor; en buyuk oynama {max(OYNAMA):.4f} "
      f"({round(max(OYNAMA) * len(XS))} abone)")
for d, ad in (({"tur": 50, "toplama": "geri"}, "tur 50 + toplama geri"),
              ({"tur": 50, "toplu": 25}, "tur 50 + toplu 25")):
    v = dogruluk(egit(XE, yE, **d), XS, yS)
    print(f"  {ad:<24} {v:.4f}  oynama {v - TEMEL:+.4f} "
          f"({round(abs(v - TEMEL) * len(XS))} abone)")
taban cizgisi 0.7579, butun kalemler sabitken 0.8095

serbest birakilan kalem        yeni deger      sinama   oynama  abone  parametre
ilklendirme tohumu             20260220        0.7937  -0.0159      4   1.46e+00
ornek sirasi tohumu            20261018        0.8016  -0.0079      2   7.45e-02
toplu boy                      25              0.8056  -0.0040      1   2.76e-01
toplu bolme bicimi             adimli          0.8135  +0.0040      1   4.80e-01
ogrenme adimi                  0.25            0.8056  -0.0040      1   1.98e-01
tur sayisi                     50              0.8095  +0.0000      0   2.10e-01
toplama sirasi (eszamanlilik)  geri            0.8095  +0.0000      0   6.66e-16
olcegin okundugu kume          egitim+sinama   0.8056  -0.0040      1   3.18e-01

8 kalemin 6 tanesi tek basina sonucu oynatiyor; en buyuk oynama 0.0159 (4 abone)
  tur 50 + toplama geri    0.8095  oynama +0.0000 (0 abone)
  tur 50 + toplu 25        0.8016  oynama -0.0079 (2 abone)

Sekiz kalemin altısı tek başına sonucu oynatıyor ve en büyük oynama 0,0159, dört abone. O kalem şudur: ilklendirme tohumu. Modelin hiçbir ayarı değil, hiçbir hazırlama kararı değil; ağırlıkların başladığı yer. Bu kursun imzası olan üçüncü sayı, yeniden üretilebilirlik listesinde de en büyük satırdır. Öğrenme adımının ve toplu boyun oynattığı birer abone, tohumun oynattığının dörtte biri kadardır.

Son sütun iki kalemi birbirinden ayırıyor. Toplama sırası serbest bırakıldığında parametreler 6,66e-16 oynuyor, yani kayan noktalı toplamanın son basamağı kadar; sınama kümesinin hiçbir kararı değişmiyor. Tur sayısı kırktan elliye çıktığında parametreler 0,2098 oynuyor — toplama sırasının on dört basamak üstünde — ve sınama kümesinin yine hiçbir kararı değişmiyor. İki sıfır aynı sıfır değildir: birincisinde ağ aynı ağdır, ikincisinde ağ başka bir ağdır ve yalnızca kararların hiçbiri sınırı geçmemiştir.

Bu ayrımın bedeli son iki satırda. Tur sayısı tek başına sıfır oynatıyor, toplu boy tek başına bir abone; ikisi birlikte serbest bırakıldığında iki abone oynuyor. Tek başına oynatmayan bir kalem, sabitlenmesi gerekmeyen bir kalem değildir. Ölçeğin okunduğu küme kalemi de bunu doğruluyor: sınama kümesi ölçek istatistiğine karıştığında sayı yalnız bir abone oynuyor, oysa aynı sızıntı M27/K02’de karar ağacıyla 0,0476 şişme üretmişti. Sızıntının küçük görünmesi yokluğunun kanıtı değildir.

Özet

  • Bir eğitimin yeniden üretilmesi 67 kalemin sabitlenmesini istiyor: M26/K03’ün 39, M26/K04’ün 9 ve M26/K06’nın 11 kaleminin üstüne eğitime özgü 8 kalem eklenir.
  • Sekiz kalemin altısı tek başına serbest bırakıldığında sonucu oynatıyor; bütün kalemler sabitken sınama sayısı 0,8095, taban çizgisi 0,7579.
  • En büyük oynama 0,0159 (dört abone) ve kaynağı ilklendirme tohumudur — modelin hiçbir ayarı değil, bu kursun üçüncü sayısı.
  • Parametrelerin oynaması ile sonucun oynaması ayrı şeylerdir: toplama sırası parametreleri 6,66e-16, tur sayısı 0,2098 oynatıyor ve ikisi de hiçbir kararı değiştirmiyor.
  • Tek başına sıfır oynatan tur sayısı, toplu boyla birlikte serbest bırakıldığında iki abone oynatıyor; ve ölçeğin sınama kümesinden okunması burada bir abone oynatırken M27/K02’de aynı sızıntı 0,0476 şişirmişti.

Sonraki Adım

Bu derste kalemlerin hepsi sabit tutuldu ve teker teker serbest bırakıldı. Gerçek bir eğitimde bunun tersi yapılır: birkaç kalem bilerek serbest bırakılır, bir aday listesi kurulur ve en iyisi seçilir. Arama yöntemleri M27/K03’te ölçüldü ve tekrarlanmayacak; ama o kursta her adayın sayısı tek bir koşumdan okunuyordu. Bu derste ölçülen şey bunu sorgulatıyor: aynı adayın iki koşumu arasındaki fark dört aboneyse ve iki aday arasındaki fark bir aboneyse, arama neyi seçmektedir. Sonraki ders ayar değişkeni aramasını bu soruyla ele alır ve kursu kapatır.

İ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