İçeriğe geç
academia.sh

Ders 14 / 14

Çok Kipli Modeller

Aynı olayın notunu ve kapsama karesini tek uzayda buluşturan ortak temsilin kendi tabanına karşı ölçülmesi: yirmi beş adaylık odalarda rastgele eşleştirme 0,0400 verirken karşıtlık hedefiyle öğrenilen ortak temsil 0,1660 veriyor ve kurgunun taşıdığı ortak bilginin tavanı 0,2659. Olay türü kararında en sık sınıf tabanı 0,4420, yalnız not 0,8940, yalnız kare 0,6140, ortak temsil 0,8660: eşleştirmeyi kazandıran temsil, sınıflandırmada notun tek başına verdiğinin altında kalıyor. Kurs kapanışı on dört dersin alan tabanını, yöntemin sayısını ve farkı tek tabloda toplar.

İçindekiler

Beş ders görüntüyü, ilk sekiz ders metni tek başına ölçtü; oysa saha ekibinin bir olay için düştüğü not ile aynı olayın kapsama karesi aynı olaya aittir.

Dersin ölçüsü bir doğruluk değil, eşleştirmedir: bir not verildiğinde aday kareler arasından doğru olanı seçebiliyor muyuz. Tabanı rastgele eşleştirmedir; tavanı ise 1 değildir, iki kipin ortak taşıdığı bilgi neyse tavan odur ve o da ders içinde hesaplanır.

  • BG48. Olay kaydı kurgudur ve iki kiplidir. Not üretici nlp konusundakiyle, kare 04. dersin 12x12 gri düzeyli kurgusuyla aynıdır. Tohum 20260218, bölme 1.100/500.
  • BG49. İki kip aynı bilgiyi eşit taşımaz. Kare olay türünü desenle (blok yok, okunamayan bant, bir blok, iki blok), hattı sönük bir bantla taşır; not türü sözcüklerle taşır ama hattı yalnız kimi zaman yazar. Gürültü iki yandadır: notta ödünç bir yan kayıt, karede eksik kalan desen ve beklenmedik parlak leke.
  • BG50. Eşleştirme ölçütü oda başına 25 adaydır. Tavan ayırt edilemeyen adaylardan hesaplanır: aynı türü ve — hat notta yazılıysa — aynı hattı taşıyan iki olay ayrılamaz.
  • BG51. Ortak temsil iki doğrusal izdüşümdür: biri sözlükten, öteki kareden aynı uzaya. Karşıtlık hedefi ile öğrenilir: doğru çiftin benzerliği yükseltilir, kümedeki öteki yirmi dört çiftinki düşürülür.
  • BG52. Olay türü kararı üç temsilde aynı yordamla okunur: sınıf ortalamasına açı benzerliği, taban en sık sınıf. Sözlük, ölçek ve ağırlıklar yalnız eğitimden öğrenilir; kütüphane çağrılmaz.

Aynı Olayın İki Kipi

# KURGU olay kaydi: ayni olayin NOTU (nlp konusundan) ve KAPSAMA KARESI
# (04. dersin 12x12 gri duzeyli kurgusu). Tohum 20260218.
import math

TOHUM, M32, BOY = 20260218, 0xFFFFFFFF, 12
ZEMIN, BLOK, GURULTU = 0.30, 0.74, 0.30
TUR = ("olagan", "erisilemedi", "sayac arizasi", "kacak suphesi")
PAY, DESEN = (0.46, 0.22, 0.19, 0.13), (0, 0, 1, 2)
OBEK = [s.split("|") for s in (
    "okuma normal|okuma normaldi|sayac erisimi saglandi|sayaca erisildi|olcum tekrarlandi|"
    "olcumu yineledik|vana kontrol edildi|vanada sorun yok|kapak temiz|kapakta iz yok|"
    "gosterge okunakli|gostergede rakam net",
    "abone evde degildi|abone bulunamadi|erisim saglanamadi|erisim yok|kapi zili calismiyor|"
    "zil calismadi|bahce kapisi kilitli|bahce kapisi kapali|bodrum katina inilemedi|"
    "bodrum kilitli|adres bulunamadi|adres eksik",
    "gosterge donmuyor|gostergede hareket yok|sayac cami kirik|sayacin cami catlak|"
    "rakam okunmuyor|rakamlar silik|ibre sabit kalmis|ibre kilitli|mekanizma takilmis|"
    "mekanizmada takilma|sayac durmus|sayac calismiyor",
    "muhur izi var|muhurde iz goruldu|muhur kopmus|muhurler kopuk|baglanti degistirilmis|"
    "baglantida degisiklik|kelepce gevsek|kelepcede gevseme|boru ek yeri yeni|boruda yeni ek|"
    "sayac ters takilmis|sayaci ters takmislar")]
EK = ("arac park halinde|kapak kirli|hava yagisli|adres teyit edildi|"
      "not kisa tutuldu|ikinci ziyaret|bahce icinde|kaldirim uzerinde").split("|")
BOLGE = "kuzey hatti|guney hatti|dogu hatti|bati hatti|merkez hatti".split("|")


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 olay(no):
    """Ayni olayin iki kipi: kisa Turkce saha notu ve 12x12 kapsama karesi."""
    r, k, t = uretec(TOHUM + 41000 + no), 0.0, 0
    u = r()
    for i, p in enumerate(PAY):
        k += p
        if u < k:
            t = i
            break
    par = [OBEK[t][int(r() * 12)]]
    if r() < 0.55:
        par.append(OBEK[t][int(r() * 12)])
    if r() < 0.34:                            # baska turden odunc alinan yan kayit
        par.append(OBEK[int(r() * 4)][int(r() * 12)])
    if r() < 0.62:
        par.append(EK[int(r() * 8)])
    hat, yazili = int(r() * 5), r() < 0.30    # hat notta yalnizca kimi zaman yazilir
    if yazili:
        par.append(BOLGE[hat])
    q = uretec(TOHUM + 600000 + no)
    g = [[ZEMIN + (q() + q() + q() - 1.5) * GURULTU for _ in range(BOY)] for _ in range(BOY)]
    for i in range(BOY):                      # okunan hat sonuk bir bant olarak gorunur
        g[i][hat * 2] += 0.16
        g[i][hat * 2 + 1] += 0.16

    def blok(sy, sx):
        for i in range(sy, min(BOY, sy + 2 + int(q() * 2))):
            for j in range(sx, min(BOY, sx + 2 + int(q() * 2))):
                g[i][j] = BLOK + (q() + q() + q() - 1.5) * GURULTU
    for b in range(DESEN[t]):
        if q() >= 0.12:                       # kimi karede desen eksik kalir
            blok(int(q() * (BOY - 3)), hat * 2 + b * 2)
    if t == 1:                                # erisilemedi: okunamayan bant
        for i in range(BOY):
            g[i][hat * 2] = g[i][hat * 2 + 1] = 0.02 + q() * 0.05
    if q() < 0.15:                            # baska yerde beklenmeyen parlak leke
        blok(int(q() * (BOY - 3)), int(q() * (BOY - 3)))
    return {"metin": ", ".join(par), "tur": TUR[t], "hat": hat, "yazili": yazili, "kare": g}


VERI = [olay(i) for i in range(1600)]
SIN = VERI[1100:]
say, SOZLUK, gec = {}, {}, {}
for x in VERI[:1100]:
    say[x["tur"]] = say.get(x["tur"], 0) + 1
    for s in set(x["metin"].split()):
        gec[s] = gec.get(s, 0) + 1
for s in sorted(gec):
    if gec[s] >= 2:
        SOZLUK[s] = len(SOZLUK)
EN_SIK = max(say, key=say.get)
TABAN = sum(x["tur"] == EN_SIK for x in SIN) / len(SIN)
print(f"kurgu: 1600 olay, egitim 1100, ayrilmis {len(SIN)}; sozluk {len(SOZLUK)} sozcuk")
print(f"olay turu tabani (en sik sinif '{EN_SIK}') {TABAN:.4f}; hat notta yazili olan "
      f"olay orani {sum(x['yazili'] for x in SIN) / len(SIN):.4f}")
x = VERI[1124]
print(f"not: {x['metin']}  ->  {x['tur']}, hat {x['hat']}")
for satir in x["kare"]:
    print("   " + "".join(str(min(9, max(0, int(v * 10)))) for v in satir))
kurgu: 1600 olay, egitim 1100, ayrilmis 500; sozluk 154 sozcuk
olay turu tabani (en sik sinif 'olagan') 0.4420; hat notta yazili olan olay orani 0.2860
not: boruda yeni ek, dogu hatti  ->  kacak suphesi, hat 2
   143245002250
   114254245050
   423337867534
   531264793421
   351236684120
   231245223341
   212444253203
   435135111311
   154587830332
   622058911323
   222433403040
   241331231422

Olay türü tabanı 0,4420’dir ve nlp konusunda ölçülen sayının aynısıdır. İkinci sayı dersin sorununu kuruyor: hat, sınama olaylarının yalnız 0,2860’ında notta yazılıdır, karede ise her zaman görünür. Basılan örnekte not “dogu hatti” diyor; karede o bant beşinci ile altıncı sütunda duruyor ve kaçak şüphesinin iki bloğu onun üstüne oturuyor.

Ortak Temsil ve Eşleştirme

G, BOYUT, OLCEK, TOPLU, ADAY = 15, 12, 10.0, 25, 25


def kare_oznitelik(g):
    """On iki sutun ortalamasi, ortalama, en parlak 3x3, esik ustu oran."""
    return [sum(g[i][j] for i in range(BOY)) / BOY for j in range(BOY)] + [
        sum(sum(s) for s in g) / (BOY * BOY),
        max(sum(g[i + a][j + b] for a in range(3) for b in range(3)) / 9.0
            for i in range(BOY - 2) for j in range(BOY - 2)),
        sum(1 for s in g for v in s if v > 0.55) / (BOY * BOY)]


KELIME = [[SOZLUK[s] for s in x["metin"].split() if s in SOZLUK] for x in VERI]
KO = [kare_oznitelik(x["kare"]) for x in VERI]
for k in range(G):                            # olcek yalniz egitim kumesinden ogrenilir
    m = sum(o[k] for o in KO[:1100]) / 1100
    sd = math.sqrt(sum((o[k] - m) ** 2 for o in KO[:1100]) / 1100)
    for o in KO:
        o[k] = (o[k] - m) / sd
r = uretec(TOHUM + 77)
WM = [[(r() * 2 - 1) * 0.5 for _ in range(BOYUT)] for _ in range(len(SOZLUK))]
WK = [[(r() * 2 - 1) * 0.3 for _ in range(BOYUT)] for _ in range(G)]


def gom(i):
    """Notu ve kareyi ayni uzaya tasiyan izdusumler. MODELDIR."""
    c = []
    for v in ([sum(WM[w][d] for w in KELIME[i]) for d in range(BOYUT)],
              [sum(KO[i][k] * WK[k][d] for k in range(G)) for d in range(BOYUT)]):
        n = math.sqrt(sum(a * a for a in v)) + 1e-9
        c.append(([a / n for a in v], n))
    return c


for adim in range(800):                       # KARSITLIK HEDEFI
    bas = (adim * TOPLU) % (1100 - TOPLU)
    E = [gom(i) for i in range(bas, bas + TOPLU)]
    U, V = [e[0][0] for e in E], [e[1][0] for e in E]
    dU = [[0.0] * BOYUT for _ in E]
    dV = [[0.0] * BOYUT for _ in E]
    for i in range(TOPLU):                    # dogru cift yakin, oteki 24 cift uzak
        s = [OLCEK * sum(a * b for a, b in zip(U[i], V[j])) for j in range(TOPLU)]
        e = [math.exp(v - max(s)) for v in s]
        t = sum(e)
        for j in range(TOPLU):
            k = OLCEK * (e[j] / t - (1.0 if i == j else 0.0))
            for d in range(BOYUT):
                dU[i][d] += k * V[j][d]
                dV[j][d] += k * U[i][d]
    for p, i in enumerate(range(bas, bas + TOPLU)):
        for yon, (dv, W) in enumerate(((dU[p], WM), (dV[p], WK))):
            u, n = E[p][yon]
            ic = sum(a * b for a, b in zip(u, dv))
            eg = [(dv[d] - u[d] * ic) / n for d in range(BOYUT)]
            for w in (KELIME[i] if yon == 0 else range(G)):
                for d in range(BOYUT):
                    W[w][d] -= 0.15 * eg[d] * (1.0 if yon == 0 else KO[i][w])

ORTAK = [[gom(i)[y][0] for y in (0, 1)] for i in range(1600)]
dogru = tavan = 0
for bas in range(1100, 1600, ADAY):
    oda = list(range(bas, bas + ADAY))
    for i in oda:
        dogru += i == max(oda, key=lambda j: sum(a * b for a, b in zip(ORTAK[i][0],
                                                                      ORTAK[j][1])))
        ayni = [j for j in oda if VERI[j]["tur"] == VERI[i]["tur"]]
        tavan += 1.0 / len([j for j in ayni if VERI[j]["hat"] == VERI[i]["hat"]]
                           if VERI[i]["yazili"] else ayni)
print(f"eslestirme, oda basina {ADAY} aday, {len(SIN)} sinama olayi; "
      f"rastgele eslestirme {1.0 / ADAY:.4f}")
print(f"ortak temsil {dogru / len(SIN):.4f}, kurgunun tavani {tavan / len(SIN):.4f}")
eslestirme, oda basina 25 aday, 500 sinama olayi; rastgele eslestirme 0.0400
ortak temsil 0.1660, kurgunun tavani 0.2659

Taban 0,0400’dür: yirmi beş adaydan birini rastgele seçmek. Ortak temsil 0,1660 veriyor, tabanın dört katından fazlası. Üçüncü sayı bu ölçütün tek başına niçin okunamayacağını söylüyor: kurgunun iki kipte ortak taşıdığı bilgi türden ve — notta yazılıysa — hattan ibarettir, o gruplardan hesaplanan tavan 0,2659‘dur. 1,0000 ile karşılaştırılan 0,1660 bir başarısızlık gibi görünür; 0,2659 ile karşılaştırıldığında **öğrenilebilirin yüzde 62’si** öğrenilmiştir. Bir ölçütün tavanı da tabanı kadar ölçülmesi gereken bir sayıdır.

Farkın kaynağı hedeftir: iki izdüşüm de doğrusaldır ve tek başlarına hiçbir şey yapmaz. Karşıtlık hedefi doğru çifti yaklaştırıp yanlışları uzaklaştırdığında, iki kipin ortak taşıdığı ne varsa izdüşümler onu aynı yöne çevirmek zorunda kalır.

Tek Kip Tek Başına

def sinif_ortalamasi(X):
    """Her sinifin ortalama vektorune aci benzerligi. MODELDIR."""
    def birim(v):
        n = math.sqrt(sum(a * a for a in v)) + 1e-9
        return [a / n for a in v]
    M = {}
    for t in TUR:
        d = [i for i in range(1100) if VERI[i]["tur"] == t]
        M[t] = birim([sum(X[i][k] for i in d) / len(d) for k in range(len(X[0]))])
    return sum(max(TUR, key=lambda t: sum(a * b for a, b in zip(birim(X[i]), M[t])))
               == VERI[i]["tur"] for i in range(1100, 1600)) / len(SIN)


TORBA = [[1.0 if k in KELIME[i] else 0.0 for k in range(len(SOZLUK))] for i in range(1600)]
print(f"olay turu karari, sinif ortalamasi ile; taban {TABAN:.4f}")
for ad, X in (("yalniz not", TORBA), ("yalniz kare", KO),
              ("ortak temsil", [ORTAK[i][0] + ORTAK[i][1] for i in range(1600)])):
    print(f"  {ad:<17} {sinif_ortalamasi(X):.4f}")
olay turu karari, sinif ortalamasi ile; taban 0.4420
  yalniz not        0.8940
  yalniz kare       0.6140
  ortak temsil      0.8660

Üç satır aynı yordamla ve aynı tabana karşı okundu; değişen yalnız temsildir. Yalnız not 0,8940, yalnız kare 0,6140: ikisi de tabanın üstünde, ama kare olay türünün ancak bir bölümünü taşıyor, çünkü dört türden ikisi karede blok taşımaz.

Üçüncü satır ortak temsilin ne olduğunu ve ne olmadığını söylüyor: 0,8660, yalnız notun 0,0280 altında. Bu temsil eşleştirme için öğrenildi ve orada tabanı dört kat geçti; olay türünde notun tek başına verdiğine ulaşamıyor. İki kipi bir araya getirmek kendiliğinden kazandırmaz ve bir temsilin iyiliği hangi görevde ölçüldüğüne bağlıdır.

Özet

  • İki kip aynı bilgiyi eşit taşımaz: kare hattı her zaman gösterir, notların yalnız 0,2860’ı yazar.
  • Ortak temsil eşleştirmede 0,1660 veriyor; taban 0,0400, kurgunun tavanı 0,2659, yani öğrenilebilirin yüzde 62’si.
  • Olay türünde taban 0,4420, yalnız not 0,8940, yalnız kare 0,6140, ortak temsil 0,8660: eğitildiği görevde tabanı dört kat geçen temsil, başka bir görevde tek kipin altında kalabilir.

Kurs Kapanışı

On dört dersin hesabı tek tabloda ve her sayı kendi dersinden okundu. Satırlar ortak birim taşımaz; son sütun her satırın ölçütünü ve yönünü yazar. Fark tek işaret düzeniyle verilir: yöntemin sayısı eksi alanın tabanı. Yön küçük iyi olduğunda artı fark tabanın kazandığını söyler.

Ders Alanın tabanı Yöntemin sayısı Fark Ölçüt
Metin 01 748 641 −107 sözlük boyu, küçük iyi
Metin 02 0,7383 0,8217 +0,0833 doğruluk, büyük iyi
Metin 03 0,4938 0,6049 +0,1111 komşuluk isabeti, büyük iyi
Metin 04 0,5061 0,9824 +0,4763 belirteç doğruluğu, büyük iyi
Metin 05 0,4420 0,9620 +0,5200 belge doğruluğu, büyük iyi
Metin 06 0,4420 0,7480 +0,3060 belge doğruluğu, büyük iyi
Metin 07 0,7777 0,9445 +0,1668 dengeli örtüşme, büyük iyi
Metin 08 0,3970 0,8378 +0,4408 belirteç doğruluğu, büyük iyi
Görü 01 0,5500 0,9250 +0,3750 doğruluk, büyük iyi
Görü 02 0,5500 0,6687 +0,1187 doğruluk, büyük iyi
Görü 03 0,3011 0,9076 +0,6065 ortalama örtüşme, büyük iyi
Görü 04 0,8731 0,9851 +0,1120 piksel doğruluğu, büyük iyi
Görü 05 0 99 +99 kararsızlık, küçük iyi
Görü 06 0,0400 0,1660 +0,1260 eşleştirme, büyük iyi

Kursun kuralı budur: bir alan ölçütü, o alanın en aptal yordamının aynı ölçütteki sayısı yazılmadan okunamaz; alanın tabanı yazılmayan sayı ölçülmemiş sayılır.

Kursun ikinci iddiası aynı tablodan okunur. Yedi derste alanın tabanı şaşırtıcı biçimde yüksek çıktı: bölütlemede 0,8731, metin 07’de 0,7777, metin 02’de 0,7383, metin 04’te 0,5061 — aynı yordam varlık düzeyinde 0,0000 alırken — görü 01 ile 02’de 0,5500 ve görü 05’te kararsızlık 0, ki bu ölçütte yenilemez bir sayıdır. İki derste hiçbir şey öğrenmemiş bir yordam birinci oldu: metin 07’de girdiyi kopyalayan, metin 08’de her belirteci işaretleyen yordam, ikisi de örtüşmenin duyarlılık yönünde 1,0000. Gizleyen ölçütler dört biçimdedir: dengesiz sınıfta pay olarak okunan doğruluk, sayılan birimden başka bir birimde okunan doğruluk, tek yönlü okunan örtüşme ve sabit bir çıktının kendiliğinden kazandığı kararlılık.

Otuz sekiz derste — on dördü alana özgü — model bir girdiye bakıp bir çıktı verdi ve doğru cevap ya elde vardı ya da bir ölçüt onu tarif ediyordu. Kararın sonucunu ancak verildikten sonra öğrendiği ve kararın kendisinin bir sonraki girdiyi değiştirdiği bir düzende neyin öğrenildiği hiç sorulmadı. Sonraki kurs, Pekiştirmeli Öğrenme ve Öneri Sistemleri, 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