İçeriğe geç
academia.sh

Ders 24 / 24

Ayar Değişkeni Araması

Koşum değişkenliğinin aramayı yanıltmasının ölçülmesi: on aday aynı bütçeyle iki kez koşturulduğunda adaylar arası açıklık doğrulama kümesinde 0,0317 iken tek bir adayın iki koşumu arasındaki fark 0,0238'e çıkıyor ve kırk beş aday çiftinin yirmi üçü ayırt edilemiyor, yedisinde sıralama ters dönüyor. Birinci koşumdan bakan arama on altı birimli adayı seçip sınamada 0,8135 alırken ikinci koşumdan bakan arama dört birimli adayı seçip 0,8016 alıyor; on adayın sınama ortalaması 0,8036, taban çizgisi 0,7579. Kurs kapanışı yirmi dört dersin taban çizgisini, ağın sayısını ve ikinci koşumunu tek tabloda toplar.

İçindekiler

Önceki ders eğitimin kalemlerini saydı ve hepsini sabitledi; en büyük oynamayı yapan kalem başlangıç değerleriydi. Gerçek bir eğitimde kalemlerin bir bölümü bilerek serbest bırakılır: bir aday listesi kurulur, hepsi koşturulur ve doğrulama kümesinden en iyisi seçilir.

Arama yöntemleri M27/K03’ün model değerlendirme konusunda ölçüldü — ızgara, rastgele ve model temelli arama aynı elli adaylık bütçede sınamada 0,7937, 0,7857 ve 0,8016 vermişti — ve burada tekrarlanmaz. Değişen tek şey şudur: orada her adayın sayısı tek bir koşumdan okunuyordu. Dersin sorusu şudur: aday sayısı aynıyken, aynı adayın iki koşumu arasındaki fark adaylar arasındaki farktan büyük olduğunda arama neyi seçiyor.

  • EP24. Küme, ağ ve taban çizgisi 01. dersten devralınır; ayrıca doğrulama kümesi kullanılır (252 satır) ve seçim ondan, rapor sınamadan okunur.
  • EP25. Aday sayısı on, bütçe her adayda eşittir (40 tur) ve adaylar elle listelenir; arama yöntemi seçimi bu dersin konusu değildir.
  • EP26. Ayar uzayı üç eksenlidir: gizli birim (4, 8, 16), öğrenme adımı (0,15, 0,30, 0,60) ve toplu boy (20, 30, 50). Her aday iki kez koşturulur ve iki koşum yalnız başlangıç değerlerinde ayrılır; öbür kalemler 04. dersteki gibi sabittir.
  • EP27. İki aday, farkları her ikisinin de koşum farkından küçükse ayırt edilemez sayılır; eşik ölçünün kendisinden gelir. Beraberlik listedeki ilk adaya verilir ve bu da bir karardır.

Küme, Ağ ve Aday Listesi

# ORTAK — KURGUDUR. M27/K01-K04'un abone tablosu ayni tohumla (20260218) uretilir;
# egitim kumesi 756'dan 300 satira kucultulmustur. Bu derste DOGRULAMA kumesi de
# kullanilir: secim ondan, rapor sinama kumesinden okunur. Ag 01. dersten gelir,
# gizli birim sayisi h adaya gore degisir.
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, DOG, SIN = K[:300], K[756:1008], 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)
XD, yD, _ = tablo(DOG, IST)
XS, yS, _ = tablo(SIN, IST)
TABAN = sum(v == 0 for v in yS) / len(yS)

G = len(ALAN)


def ilklendir(tohum, h):
    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, h):
    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]


def egit(tohum, h, adim, toplu, tur):
    p = ilklendir(tohum, h)
    for t in range(tur):
        d = karistir(range(len(XE)), TOHUM + 700 + t)
        for b in range(0, len(d) - toplu + 1, toplu):
            p = [u - adim * v for u, v in zip(p, egim(p, XE, yE, d[b:b + toplu], h))]
    return p


def dogruluk(p, X, y, h):
    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), dogrulama {len(XD)}, "
      f"sinama {len(XS)}; taban cizgisi {TABAN:.4f}")
kurgu: egitim 300 satir (756'dan kucultuldu), dogrulama 252, sinama 252; taban cizgisi 0.7579

On Aday, İki Koşum

# ON ADAY, her biri IKI KOSUM. Arama yontemleri M27/K03'te olculdu ve burada
# tekrarlanmaz; degisen tek sey her adayin sayisinin KAC KOSUMDAN okundugudur.
# Secim dogrulama kumesinden yapilir, rapor sinama kumesinden.
ADAY = [(4, 0.15, 30), (4, 0.30, 30), (8, 0.15, 30), (8, 0.30, 30), (8, 0.60, 30),
        (8, 0.30, 20), (8, 0.30, 50), (16, 0.15, 30), (16, 0.30, 30), (16, 0.60, 30)]
DOGRULAMA, SINAMA = [], []
print(f"{'aday':>4} {'gizli':>6} {'adim':>5} {'toplu':>6} {'dog k1':>7} {'dog k2':>7} "
      f"{'|fark|':>7} {'sin k1':>7} {'sin k2':>7}")
for no, (h, adim, toplu) in enumerate(ADAY, 1):
    P = [egit(TOHUM + k, h, adim, toplu, 40) for k in (1, 2)]
    d = [dogruluk(p, XD, yD, h) for p in P]
    s = [dogruluk(p, XS, yS, h) for p in P]
    DOGRULAMA.append(d)
    SINAMA.append(s)
    print(f"{no:>4} {h:>6} {adim:>5.2f} {toplu:>6} {d[0]:>7.4f} {d[1]:>7.4f} "
          f"{abs(d[0] - d[1]):>7.4f} {s[0]:>7.4f} {s[1]:>7.4f}")
aday  gizli  adim  toplu  dog k1  dog k2  |fark|  sin k1  sin k2
   1      4  0.15     30  0.8135  0.8175  0.0040  0.8095  0.8056
   2      4  0.30     30  0.8016  0.8254  0.0238  0.8095  0.8016
   3      8  0.15     30  0.8135  0.8175  0.0040  0.8016  0.8056
   4      8  0.30     30  0.8095  0.8175  0.0079  0.8095  0.7937
   5      8  0.60     30  0.8016  0.8056  0.0040  0.7857  0.8056
   6      8  0.30     20  0.7976  0.8095  0.0119  0.7976  0.7976
   7      8  0.30     50  0.8095  0.8175  0.0079  0.8016  0.8056
   8     16  0.15     30  0.8294  0.8254  0.0040  0.8135  0.8056
   9     16  0.30     30  0.8294  0.8175  0.0119  0.8095  0.8016
  10     16  0.60     30  0.8016  0.8016  0.0000  0.7976  0.7976

Birinci doğrulama sütunu alışıldık bir sonuç veriyor: en yüksek iki sayı 0,8294 ve ikisi de on altı birimli adaylara ait, yani kapasite kazandırmış görünüyor. İkinci sütun bunu bozuyor: iki numaralı aday — listenin en küçük ağı — birinci koşumda 0,8016 verirken ikinci koşumda 0,8254’e çıkıp sekiz numaralı adayla başa baş geliyor.

Arama Neyi Seçiyor

# Aramanin sectigi aday, hangi kosumdan bakildigina bagli.
ADAYLAR_ARASI = max(d[0] for d in DOGRULAMA) - min(d[0] for d in DOGRULAMA)
KOSUM_ICI = [abs(d[0] - d[1]) for d in DOGRULAMA]
print(f"adaylar arasi yayilim (kosum 1, dogrulama) {ADAYLAR_ARASI:.4f}")
print(f"ayni adayin iki kosumu arasindaki fark: en cok {max(KOSUM_ICI):.4f}, "
      f"ortanca {sorted(KOSUM_ICI)[len(KOSUM_ICI) // 2]:.4f}")
CIFT = [(i, j) for i in range(len(ADAY)) for j in range(i + 1, len(ADAY))]
belirsiz = sum(1 for i, j in CIFT
               if abs(DOGRULAMA[i][0] - DOGRULAMA[j][0]) <= max(KOSUM_ICI[i], KOSUM_ICI[j]))
ters = sum(1 for i, j in CIFT
           if (DOGRULAMA[i][0] - DOGRULAMA[j][0]) * (DOGRULAMA[i][1] - DOGRULAMA[j][1]) < 0)
print(f"{len(CIFT)} aday ciftinin {belirsiz}'i kosum farkiyla ayirt edilemiyor; "
      f"{ters} ciftte siralama iki kosum arasinda TERS donuyor")
for k in (0, 1):
    en = max(range(len(ADAY)), key=lambda i: (DOGRULAMA[i][k], -i))
    print(f"kosum {k + 1}'e gore secilen aday {en + 1} (gizli {ADAY[en][0]}, "
          f"adim {ADAY[en][1]:.2f}, toplu {ADAY[en][2]}): dogrulama "
          f"{DOGRULAMA[en][k]:.4f}, sinama {SINAMA[en][k]:.4f}")
ort = sum(s[0] for s in SINAMA) / len(SINAMA)
print(f"on adayin sinama ortalamasi {ort:.4f}; taban cizgisi {TABAN:.4f}")
adaylar arasi yayilim (kosum 1, dogrulama) 0.0317
ayni adayin iki kosumu arasindaki fark: en cok 0.0238, ortanca 0.0079
45 aday ciftinin 23'i kosum farkiyla ayirt edilemiyor; 7 ciftte siralama iki kosum arasinda TERS donuyor
kosum 1'e gore secilen aday 8 (gizli 16, adim 0.15, toplu 30): dogrulama 0.8294, sinama 0.8135
kosum 2'e gore secilen aday 2 (gizli 4, adim 0.30, toplu 30): dogrulama 0.8254, sinama 0.8016
on adayin sinama ortalamasi 0.8036; taban cizgisi 0.7579

Dersin sayısı ilk iki satırda. Adaylar arası açıklık 0,0317, aynı adayın iki koşumu arasındaki en büyük fark 0,0238; ikisi aynı büyüklük sırasındadır. Kırk beş aday çiftinin yirmi üçü, yani yarıdan fazlası, koşum farkıyla ayırt edilemiyor ve yedi çiftte sıralama iki koşum arasında ters dönüyor.

Birinci koşumdan bakan arama sekiz numaralı adayı seçiyor: on altı birim. İkinci koşumdan bakan arama iki numaralı adayı: dört birim. Aynı liste, aynı bütçe ve kapasite sorusuna iki ayrı yanıt; seçilenlerin sınama sayıları 0,8135 ve 0,8016.

On adayın sınama ortalaması 0,8036: birinci koşumdan seçilen aday bunun 0,0099 üstünde, ikinci koşumdan seçilen 0,0020 altında. Arama, hangi koşumdan bakıldığına göre iki buçuk abone kazandırıyor ya da yarım abone kaybettiriyor. Ayar bütçesi M27/K03’te sayının şişmesini üretiyordu; burada ondan önce gelen bir sorun var — arama sıralaması gürültüden kurulmuşsa şişecek bir kazanç da yoktur. Çaresi pahalıdır: her adayı birden çok koşumla ölçüp sayısını koşumların ortalaması olarak yazmak; bütçe on adaydan beşe iner.

Özet

  • Adaylar arası açıklık doğrulama kümesinde 0,0317, tek bir adayın iki koşumu arasındaki en büyük fark 0,0238; ikisi aynı büyüklük sırasındadır.
  • Kırk beş aday çiftinin yirmi üçü koşum farkıyla ayırt edilemiyor, yedisinde sıralama ters dönüyor.
  • Birinci koşumdan bakan arama on altı birimli, ikinci koşumdan bakan dört birimli adayı seçiyor: aynı liste kapasite sorusuna iki ayrı yanıt veriyor, sınama sayıları 0,8135 ile 0,8016.
  • On adayın sınama ortalaması 0,8036 ve taban çizgisi 0,7579; arama hangi koşumdan bakıldığına göre iki buçuk abone kazandırıyor ya da yarım abone kaybettiriyor.

Kurs Kapanışı

Yirmi dört dersin hesabı tek tabloda ve her sayı kendi dersinden okundu. Satırlar ortak birim taşımaz: kurs üç ayrı kurgu küme kullandı ve son sütun hangisinden okunduğunu yazar. Ölçüt yirmi üç satırda doğruluktur ve büyük olan iyidir; son satır etiketsizdir, geri kurma hatasıyla okunur ve orada küçük olan iyidir. İkinci koşum, aynı kurulumun yalnız başlangıç değerleri değiştirilerek yeniden eğitilmesidir.

Ders Taban çizgisi Ağın sayısı İkinci koşum Küme
Temeller 01 0,7579 0,7857 0,7698 abone
Temeller 02 0,7579 0,7937 0,7976 abone
Temeller 03 0,7579 0,7540 0,7738 abone
Temeller 04 0,7579 0,7619 0,7897 abone
Temeller 05 0,7579 0,7857 0,7698 abone
Temeller 06 0,7579 0,7857 0,7698 abone
Temeller 07 0,7579 0,7817 0,7778 abone
Temeller 08 0,7579 0,7937 0,7738 abone
Temeller 09 0,7579 0,7698 0,7857 abone
Mimariler 01 0,5850 0,8000 0,8150 ızgara
Mimariler 02 0,5850 0,8050 0,8050 ızgara
Mimariler 03 0,5850 0,8150 0,8900 ızgara
Mimariler 04 0,7100 0,7350 0,7150 dizi
Mimariler 05 0,7100 0,9750 0,9150 dizi
Mimariler 06 0,6333 0,8889 0,9944 dizi
Mimariler 07 0,6611 0,8778 0,8833 dizi
Mimariler 08 0,6444 0,9722 0,9833 olay kodu
Mimariler 09 0,6444 0,8333 0,8500 olay kodu
Mimariler 10 2,9007 0,7949 0,7638 dizi (hata)
Eğitim 01 0,7579 0,8095 0,7937 abone
Eğitim 02 0,7579 0,8016 0,8095 abone
Eğitim 03 0,7579 0,8056 0,7937 abone
Eğitim 04 0,7579 0,8095 0,7937 abone
Eğitim 05 0,7579 0,8135 0,8016 abone

Kursun kuralı budur: bir ağın sayısı, kapasitesinden değil eğitiminden gelebilir; aynı kapasitenin iki koşumda iki ayrı sayı verdiği yazılmayan sonuç ölçülmemiş sayılır. Üçüncü sütun tek bir sayıya iner: kapasitenin ya da mimarinin kattığı farkın kendi dersinde yazıldığı yirmi bir derste on dördünde ikinci koşumun farkı o farktan büyük çıktı — evrişimli mimaride derinliğin kattığı 0,0575’e karşı 0,0750, çok başlı dikkatte baş sayısının kattığı 0,0250’ye karşı 0,0500, algılayıcıda kapasitenin kattığı bir aboneye karşı dört abone. Kalan yedide kapasitenin kattığı fark koşum farkına eşit ya da ondan büyüktü.

Kursun ikinci iddiası aynı tablodan okunur ve saklanmaz. Abone tablosunun on dört satırında karşılaştırma çizgileri M27/K03’ten gelir: karar ağacı 0,7857, doğrusal model 0,8016. Sinir ağı temellerinin dokuz dersinde ağın sayısı hiçbir koşumda 0,8016’yı geçmedi; on sekiz koşumun en yükseği 0,7976 ve üç dersin ağın sayısı tam olarak ağacın sayısında durdu. Eğitim pratiğinin beş dersinde ağın sayısı 0,8016 ile 0,8135 arasında, yani doğrusal modelin çizgisinde ya da üstünde kaldı; ama sekiz sütunlu bir öznitelik kümesiyle koştular ve birinci dersin on ilklendirmesi 0,7857–0,8095 arasına yayıldı, iki çizgi de bu aralığın içinde. Derin ağ bu kurgu tablo verisinde karar ağacını ve doğrusal modeli, koşum değişkenliğinden ayrılabilir biçimde geçemedi. Kazanç kapasiteden değil eğitim pratiğinden geldi ve en az bir derste daha derin ağ daha sığ ağı geçemedi.

Yirmi dört derste mimari kuruldu ve her sayının yanına ikinci koşumu yazıldı. Ama girdiler hep hazır sayılardı: bir sütun, bir ızgara hücresi, bir okuma dizisi, bir olay kodu. Bir metnin ya da bir görüntünün sayıya nasıl çevrildiği, o çevirinin hangi tabana karşı ölçüldüğü ve alanın kendi ölçütlerinin ne olduğu hiç sorulmadı. Sonraki kurs, Doğal Dil İşleme ve Bilgisayarla Görme, bu soruyla açılı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