İçeriğe geç
academia.sh

Ders 18 / 24

Öğrenme Aktarımı

Kurgu bir kaynak görevden kendi elimizle üretilen önceden eğitilmiş bir modelin hedef göreve taşınmasının ne kattığının ölçülmesi: en sık sınıf tabanı 0,6444 iken yirmi etiketle sıfırdan eğitim 0,7194, dondurmalı aktarım 0,8417 ve ince ayarlı aktarım 0,8083 veriyor. Dondurma dört ölçümde de 0,83 dolayında düz duruyor ve sıfırdan eğitim onu kırk ile seksen örnek arasında geçiyor; ince ayar dört noktanın üçünde sıfırdanın üstünde kalıyor ama yüz altmış örnekte fark 0,0028'e iniyor. Kaynak görevden gelen tablo bakım ayrımını 3,6373, şüpheli ayrımını 2,4767 taşıyor; ince ayardan sonra bu iki sayı 2,4685 ve 3,7991 oluyor.

İçindekiler

Gömme tablosu önceki derste görevin kendi etiketleriyle öğrenildi ve iki yüz örnek buna yetti. Etiketin pahalı olduğu durumlarda bu varsayım düşer. Şüpheli olarak işaretlenmiş bir abone kaydı, bir denetçinin sahada geçirdiği saatin karşılığıdır; elde yirmi ya da kırk tane olabilir. Yüz üç parametrenin hepsini yirmi etiketten öğrenmek, kapasitenin veriyi geçtiği durumdur ve M27/K01 genelleme bunu ölçmüştü.

Bir yol daha vardır. Aynı kodlar başka bir soruya da cevap verir ve o soru için etiket boldur. Temsil orada öğrenilip buraya taşınabilir. Bu dersin sorusu ikilidir: taşımak hangi sayıyı oynatır, ve kaç etiketle. İkinci soru birincisinden önemlidir, çünkü aktarımın değeri son sayıda değil, o sayıya kaç etiketle varıldığındadır.

  • MI73. Bu payın dizi kurgusu mimariler/06’da, olay kodları mimariler/08’de kuruldu ve kurgudur. Bu derste ikinci bir kurgu etiket eklenir. Tohum 20260218.
  • MI74. Kaynak görev kurgudur ve etiketi boldur: on iki adımın en az altısında bir bakım kodu bulunması. Bakım kodları on tanedir.
  • MI75. Hedef görev mimariler/08’in görevidir: en az beş adımda şüpheli kod. Şüpheli kodlar sekiz tanedir ve sekizi de bakım kodları arasındadır; bakım kümesinde onların dışında iki kod daha vardır. İki görev ilişkilidir ama aynı değildir.
  • MI76. Önceden eğitilmiş model bu derste üretilir. Hiçbir hazır model, ağırlık deposu ya da dış kaynak kullanılmaz; kaynak görev üç yüz örnekle burada eğitilir ve modeldir.
  • MI77. Kaynak ile hedef ayrı dizilerde çalışır: kaynak ilk üç yüz dizi, hedef havuzu sonraki iki yüz kırk, ayrılmış küme son yüz seksen. Önceden eğitilmiş model hedef görevin hiçbir etiketini görmez.
  • MI78. Üç kurulum karşılaştırılır: sıfırdan (tablo rastgele ilklendirilir), aktarım + dondurma (tablo kaynaktan alınır ve hiç güncellenmez), aktarım + ince ayar (tablo kaynaktan alınır ve güncellenir).
  • MI79. Hedef etiket sayısı dört değerde ölçülür: 20, 40, 80, 160. Ayrılmış küme her dördünde aynıdır.
  • MI80. Taban çizgisi en sık sınıftır ve ayrılmış kümeden okunur; etiket sayısı değişse de taban değişmez.
  • MI81. Her sayı iki koşumla basılır; koşumlar ilklendirme tohumunda ayrılır.

Kaynak Görev ve Önceden Eğitilmiş Model

Aktarımın öznesi bir dosya değil, bir temsildir. Burada taşınan şey gömme tablosudur: yirmi dört kodun üç boyutlu vektörleri. Kaynak görev bu tabloyu kendi sorusuna göre yerleştirir ve hedef görev onu devralır.

# ORTAK — MODELDIR. `mimariler/06`'nin KURGU dizi kumesi + `08`'in KURGU olay kodlari.
import math

TOHUM, M32, ADIM = 20260218, 0xFFFFFFFF, 12
KOD = 24
BAK = (1, 2, 4, 5, 7, 9, 13, 16, 20, 22)     # KURGU kaynak gorev: bakim kodlari
SUP = (1, 4, 5, 9, 13, 16, 20, 22)           # KURGU hedef gorev: supheli kodlar


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 dizi_kur(n, tohum):
    D = []
    for i in range(n):
        r = uretec(tohum + i)
        r()
        [round((r() + r() + r() - 1.5) * 1.9, 3) for _ in range(ADIM - 1)]
        r()
        o = uretec(tohum + 8000 + i)
        kod = [int(o() * KOD) for _ in range(ADIM)]
        D.append({"kod": kod, "kaynak": 1 if sum(c in BAK for c in kod) >= 6 else 0,
                  "y": 1 if sum(c in SUP for c in kod) >= 5 else 0})
    return D


VERI = dizi_kur(720, TOHUM)
KAYNAK, HAVUZ, SIN = VERI[:300], VERI[300:540], VERI[540:]
oran = sum(x["y"] for x in SIN) / len(SIN)
TABAN = max(oran, 1 - oran)
ORTAK = [c for c in SUP if c in BAK]
print(f"kod {KOD}, bakim {len(BAK)}, supheli {len(SUP)}, ortak {len(ORTAK)}")
print(f"kaynak gorev orani {sum(x['kaynak'] for x in KAYNAK) / len(KAYNAK):.4f}, "
      f"kaynak ornek {len(KAYNAK)}")
print(f"hedef gorev orani ayrilmis {oran:.4f}, taban cizgisi {TABAN:.4f}, "
      f"havuz {len(HAVUZ)}")
kod 24, bakim 10, supheli 8, ortak 8
kaynak gorev orani 0.3533, kaynak ornek 300
hedef gorev orani ayrilmis 0.3556, taban cizgisi 0.6444, havuz 240

İki görevin ilişkisi tek satırdadır: sekiz şüpheli kodun sekizi de bakım kümesindedir, ama bakım kümesinde iki fazla kod vardır. Kaynak görevi çözen bir temsil, hedef görevin istediği ayrımı yaklaşık olarak taşır; tam olarak taşımaz.

GIZ, GOM = 6, 3


def temsil(T, kod):
    h = [0.0] * GOM
    for c in kod:
        for j in range(GOM):
            h[j] += T[c][j] / ADIM
    return h


def yeni_tablo(tohum):
    r = uretec(tohum)
    return [[(r() + r() + r() - 1.5) * 1.1 for _ in range(GOM)] for _ in range(KOD)]


def egit(tohum, T, D, alan, tur, ogren, adim=0.9):
    r = uretec(tohum + 500)
    g = lambda: (r() + r() + r() - 1.5) * 0.9
    W1 = [[g() for _ in range(GOM)] for _ in range(GIZ)]
    b1, w, b, n = [0.0] * GIZ, [g() for _ in range(GIZ)], [0.0], len(D)
    for _ in range(tur):
        gW1 = [[0.0] * GOM for _ in range(GIZ)]
        gb1, gw, gb = [0.0] * GIZ, [0.0] * GIZ, 0.0
        gT = [[0.0] * GOM for _ in range(KOD)] if ogren else None
        for x in D:
            h = temsil(T, x["kod"])
            z = [sum(W1[i][j] * h[j] for j in range(GOM)) + b1[i] for i in range(GIZ)]
            o = sum(w[i] * z[i] for i in range(GIZ) if z[i] > 0) + b[0]
            df = 1.0 / (1.0 + math.exp(-max(-30.0, min(30.0, o)))) - x[alan]
            gb += df
            da = [df * w[i] if z[i] > 0 else 0.0 for i in range(GIZ)]
            for i in range(GIZ):
                gw[i] += df * max(0.0, z[i])
                gb1[i] += da[i]
                for j in range(GOM):
                    gW1[i][j] += da[i] * h[j]
            if ogren:                   # dondurmada tablonun egimi hic hesaplanmaz
                dh = [sum(da[i] * W1[i][j] for i in range(GIZ)) for j in range(GOM)]
                for c in x["kod"]:
                    for j in range(GOM):
                        gT[c][j] += dh[j] / ADIM
        for i in range(GIZ):
            w[i] -= adim * gw[i] / n
            b1[i] -= adim * gb1[i] / n
            for j in range(GOM):
                W1[i][j] -= adim * gW1[i][j] / n
        b[0] -= adim * gb / n
        if ogren:
            for c in range(KOD):
                for j in range(GOM):
                    T[c][j] -= adim * gT[c][j] / n
    return {"T": T, "W1": W1, "b1": b1, "w": w, "b": b[0]}


def dogruluk(P, D, alan="y"):
    s = 0
    for x in D:
        h = temsil(P["T"], x["kod"])
        z = [sum(P["W1"][i][j] * h[j] for j in range(GOM)) + P["b1"][i]
             for i in range(GIZ)]
        o = sum(P["w"][i] * max(0.0, z[i]) for i in range(GIZ)) + P["b"]
        s += (o > 0) == (x[alan] == 1)
    return s / len(D)


def kopya(T):
    return [u[:] for u in T]


ONCEDEN = []
print(f"kaynak gorev ornegi {len(KAYNAK)}, tur 400, gomme boyutu {GOM}, "
      f"gizli birim {GIZ}")
for k in (1, 2):
    P = egit(TOHUM + k, yeni_tablo(TOHUM + 900 + k), KAYNAK, "kaynak", 400, True)
    ONCEDEN.append(P)
    print(f"onceden egitilmis model kosum {k}: kaynak gorevde egitim "
          f"{dogruluk(P, KAYNAK, 'kaynak'):.4f}, ayrilmis "
          f"{dogruluk(P, SIN, 'kaynak'):.4f}")
print(f"bu iki model hedef gorevin hicbir etiketini gormedi")
kaynak gorev ornegi 300, tur 400, gomme boyutu 3, gizli birim 6
onceden egitilmis model kosum 1: kaynak gorevde egitim 1.0000, ayrilmis 1.0000
onceden egitilmis model kosum 2: kaynak gorevde egitim 1.0000, ayrilmis 1.0000
bu iki model hedef gorevin hicbir etiketini gormedi

Dondurma, İnce Ayar ve Kaç Etiket

Aktarımın iki biçimi vardır. Dondurmada taşınan tablo sabittir ve yalnız üstündeki gövde öğrenilir: otuz bir parametre. İnce ayarda tablo da güncellenir: yüz üç parametre. İkisi arasındaki seçim, elde kaç etiket olduğuna bağlıdır ve bu bağın kendisi ölçülebilir.

ORNEK, KURULUM = (20, 40, 80, 160), (("sifirdan", False, True),
                                     ("aktarim + dondurma", True, False),
                                     ("aktarim + ince ayar", True, True))
SONUC = {}
print(f"hedef tur 250, taban cizgisi {TABAN:.4f}, ayrilmis {len(SIN)}")
print(f"{'kurulum':<21}{'ogrenilen':>10}{'kosum':>7}"
      + "".join(f"{'n=' + str(n):>9}" for n in ORNEK))
for ad, kaynakli, ogren in KURULUM:
    SONUC[ad] = {}
    for k in (1, 2):
        sat = []
        for n in ORNEK:
            T = kopya(ONCEDEN[k - 1]["T"]) if kaynakli else yeni_tablo(TOHUM + 900 + k)
            P = egit(TOHUM + 30 + k, T, HAVUZ[:n], "y", 250, ogren)
            SONUC[ad].setdefault(n, []).append(dogruluk(P, SIN))
            sat.append(SONUC[ad][n][-1])
            if n == ORNEK[-1] and k == 1:
                SONUC[ad]["T"] = P["T"]
        print(f"{ad if k == 1 else '':<21}"
              f"{GIZ * GOM + 2 * GIZ + 1 + (0 if not ogren else KOD * GOM):>10}"
              f"{k:>7}" + "".join(f"{v:>9.4f}" for v in sat))
hedef tur 250, taban cizgisi 0.6444, ayrilmis 180
kurulum               ogrenilen  kosum     n=20     n=40     n=80    n=160
sifirdan                    103      1   0.7222   0.8056   0.8167   0.9556
                            103      2   0.7167   0.8389   0.8611   0.9722
aktarim + dondurma           31      1   0.8333   0.8278   0.8389   0.8333
                             31      2   0.8500   0.8444   0.8278   0.8278
aktarim + ince ayar         103      1   0.8111   0.8556   0.8556   0.9556
                            103      2   0.8056   0.8500   0.8556   0.9667

Dondurma satırı yatay bir çizgidir: 0,8278 ile 0,8500 arasında, etiket sayısıyla neredeyse hiç oynamıyor. Otuz bir parametre yirmi etiketten öğrenilebiliyor, ama yüz altmış etiket de aynı otuz bir parametreye gidecek yeni bir yer bulmuyor. Aktarımın tavanı taşınan tablodadır.

def ort(ad, n):
    return sum(SONUC[ad][n]) / 2


print(f"{'ornek':>7}{'sifirdan':>10}{'dondurma':>10}{'ince ayar':>11}"
      f"{'dondurma farki':>16}{'ince ayar farki':>17}")
for n in ORNEK:
    a, b, c = (ort(k, n) for k, *_ in KURULUM)
    print(f"{n:>7}{a:>10.4f}{b:>10.4f}{c:>11.4f}{b - a:>+16.4f}{c - a:>+17.4f}")
hedef = ort("aktarim + dondurma", 20)
yeter = [n for n in ORNEK if ort("sifirdan", n) >= hedef]
print(f"dondurma 20 ornekle {hedef:.4f}; sifirdan ayni sayiya "
      f"{yeter[0] if yeter else '>160'} ornekle ulasiyor")


def ikili(T, P, Q):
    d = [sum((T[i][j] - T[k][j]) ** 2 for j in range(GOM)) ** 0.5
         for i in P for k in Q if i != k]
    return sum(d) / len(d)


def ayrim(T, G):
    A = [c for c in range(KOD) if c in G]
    B = [c for c in range(KOD) if c not in G]
    return ikili(T, A, B) / ((ikili(T, A, A) + ikili(T, B, B)) / 2)


print(f"{'tablo':<28}{'bakim ayrimi':>14}{'supheli ayrimi':>16}")
for ad, T in (("kaynak gorevden gelen", ONCEDEN[0]["T"]),
              ("ince ayardan sonra n=160", SONUC["aktarim + ince ayar"]["T"]),
              ("sifirdan n=160", SONUC["sifirdan"]["T"])):
    print(f"{ad:<28}{ayrim(T, BAK):>14.4f}{ayrim(T, SUP):>16.4f}")
  ornek  sifirdan  dondurma  ince ayar  dondurma farki  ince ayar farki
     20    0.7194    0.8417     0.8083         +0.1222          +0.0889
     40    0.8222    0.8361     0.8528         +0.0139          +0.0306
     80    0.8389    0.8333     0.8556         -0.0056          +0.0167
    160    0.9639    0.8306     0.9611         -0.1333          -0.0028
dondurma 20 ornekle 0.8417; sifirdan ayni sayiya 160 ornekle ulasiyor
tablo                         bakim ayrimi  supheli ayrimi
kaynak gorevden gelen               3.6373          2.4767
ince ayardan sonra n=160            2.4685          3.7991
sifirdan n=160                      2.1087          3.3228

İlk tablo aktarımın kattığı farkı örnek sayısıyla birlikte okur ve tek bir sayı vermez. Yirmi etikette dondurma sıfırdan eğitimin 0,1222 üstündedir; kırkta fark 0,0139’a düşer; seksende işaret döner ve yüz altmışta dondurma sıfırdanın 0,1333 altına iner. İnce ayar dört noktanın üçünde üsttedir ama yüz altmışta farkı 0,0028’e, yani ölçüm gürültüsünün içine iner.

İkinci satır bu dersin asıl sayısıdır. Dondurma yirmi etiketle 0,8417 veriyor; sıfırdan eğitim aynı sayıya ancak yüz altmış etiketle ulaşıyor — sekiz katı. Aktarımın kazandırdığı şey son sayı değil, o sayıya varmak için toplanmayan etiketlerdir. Etiket başına bir saha ziyareti düşünüldüğünde ölçünün birimi doğruluk değil, yüz kırk ziyarettir.

Yüz altmış satırındaki eksi işaret üzerinde durmaya değer. Orada dondurmalı aktarım, hiçbir şey aktarmayan kuruluma yenilmektedir; taşınan temsil bir başlangıç noktası olmaktan çıkıp bir kısıt hâline gelmiştir. Aktarım her zaman kazandırmaz ve kazanıp kazandırmadığı ancak aktarımsız kurulum aynı ayrılmış kümede koşulduğunda bilinir. Bu ölçünün taban çizgisi en sık sınıf değil, sıfırdan eğitimin kendisidir.

Koşum değişkenliği bu dersin okumasını iki yerde belirler. Yirmi etikette üç kurulumun koşumları arasındaki fark en fazla 0,0167’dir, aktarımın kattığı ise 0,1222 — yani fark koşum değişkenliğinin yedi katıdır ve ölçülmüş sayılır. Yüz altmışta ise ince ayarın sıfırdan farkı 0,0028’dir ve aynı kurulumun iki koşumu 0,0111 ayrılmaktadır; orada fark koşumun içinde kaybolur ve “ince ayar biraz daha iyi” demek ölçülmemiş bir cümledir.

Üçüncü tablo aktarımın niçin bir yerde durduğunu söyler. Kaynaktan gelen tablo bakım ayrımını 3,6373 taşıyor ama şüpheli ayrımını yalnız 2,4767; iki fazla bakım kodu tabloda şüphelilerin yanına yerleşmiş durumda ve dondurulmuş bir tablo bunu düzeltemez. İnce ayar iki sayıyı yer değiştiriyor: bakım ayrımı 2,4685’e düşerken şüpheli ayrımı 3,7991’e çıkıyor. Sıfırdan eğitilen tablo da şüpheli ayrımını 3,3228’e getiriyor, ama bunun için sekiz kat etiket harcıyor.

Özet

  • Önceden eğitilmiş model bu derste kurgu bir kaynak görevden üretildi; kaynak görevde iki koşum da 1,0000 veriyor ve hedef görevin hiçbir etiketini görmedi.
  • Yirmi etikette taban 0,6444, sıfırdan eğitim 0,7194, dondurma 0,8417 ve ince ayar 0,8083; aktarım bu noktada 0,1222’ye kadar fark katıyor.
  • Dondurma otuz bir parametre öğrenir ve etiket sayısıyla oynamaz: dört ölçümde de 0,83 dolayında düz durur, yüz altmış etikette sıfırdan eğitimin 0,1333 altına iner.
  • Aktarımın ölçüsü doğruluk değil etiket sayısıdır: dondurmanın yirmi etiketle verdiği 0,8417’ye sıfırdan eğitim ancak yüz altmış etiketle ulaşır.
  • Tavanın nedeni taşınan temsildir: kaynak tablo bakım ayrımını 3,6373, şüpheli ayrımını 2,4767 taşır; ince ayardan sonra bu iki sayı 2,4685 ve 3,7991 olur.

Sonraki Adım

Dokuz derste her mimari bir etiketi kestirdi. Girdi verildi, çıktı bir sayıya indirildi ve ölçü hep aynı biçimdeydi: ayrılmış kümede kaç doğru. Bir ağın etiket kestirmekten başka bir işi daha olabilir — girdinin kendisini yeniden üretmek, ya da girdiye benzeyen yeni örnekler kurmak. Böyle bir ağın ölçüsü nedir, çünkü karşılaştırılacak bir etiket yoktur. Sonraki ders örtük uzay üzerinden çalışan iki üretici düzeni ele alır: geri kurma hatasıyla ölçülen otokodlayıcıyı (M27/K04’ün ölçüsüne atıfla) ve iki ağın birbirine karşı eğitildiği çekişmeli düzeni; ikincisinde ölçülen şey başarım değil, aynı düzenin iki koşumunun ne kadar ayrıldığıdı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