İçeriğe geç
academia.sh

Ders 06 / 14

Dönüştürücü Sezgisi

Dikkatin uzak bağlamı niçin kullanabildiğinin ve bunun karşılaştırma sayısı olarak bedelinin ölçülmesi: 240 kurgu talep akışında konu nesnesi sondan ortalama 66,7 belirteç uzaktadır ve son 16 belirtece bakan okuyucu 0,0000 isabet verir, 83 akışta yanlış nesneyi, 157 akışta hiçbir şeyi döndürür. Son 64 belirteç 0,4917'ye çıkar ama 65 belirtecin ötesinde 0,0000'da kalır; uzaklıkla sönümlenen ağırlık her konumu görmesine karşın 0,3250'de kalır. Uzaklıktan bağımsız ağırlık 1,0000 verir ve bedeli 69,7 karşılaştırmadır: tam geçişte bağlam iki katına çıktığında karşılaştırma dört katına çıkar, 1024 belirteçte sabit pencerenin 8,26 katıdır.

İçindekiler

Bir önceki ders metni belirteçlere böldü ve her belirtecin bir bedeli olduğunu saydı. Elde bir dizi var, ama modelin bu diziyle ne yaptığı sorulmadı. Bir destek akışında konu ilk cümlede söylenir ve son cümlede yalnız “bu konu” diye anılır: aradaki elli belirteç boyunca bağ kopmadan taşınmalıdır.

Dönüştürücü mimarinin, dikkatin ve gömme katmanının yapısı derin öğrenme kursunun mimariler konusunda kurulmuş ve ölçülmüştü; mimari burada tekrarlanmaz. Bu ders tek bir soruyu kullanıcı tarafından ele alır: dikkat uzak bağlamı niçin kullanabiliyor, ve bunun bedeli nedir. Cevap tek bir yapısal ayrıntıda saklıdır — dikkatte bir konumun ağırlığı uzaklığına bağlı değildir — ve bedeli tek bir sayıda: karşılaştırma sayısı.

  • DL9. Talep akışları kurgudur: ders içinde üretilir, tohum 20260218. Küme 240 akıştır; her akış bir konu cümlesi, iki ile dokuz arası dolgu cümlesi ve bir kapanış sorusudur.
  • DL10. Belirteçleyici bir önceki dersinkiyle aynı yordamdır: parça sözlüğü ve soldan en uzun eşleşme.
  • DL11. Görev tektir: akışın konu nesnesini bulmak. Doğru cevap ilk cümlede geçen nesnedir.
  • DL12. Akışların bir bölümünde sona yakın ikinci bir nesne geçer. Bu ikinci nesne konu değildir; yakınlığa bakan her yordamı yanıltır.
  • DL13. Uyum puanı benzeticide elle verilmiştir: nesne kökü 1,00, durum kökü 0,25, geri kalan 0,02. Gerçek bir modelde bu puan öğrenilir. Ölçülen şey puanın nereden geldiği değil, kaç konumun karşılaştırıldığıdır.
  • DL14. Okuyucular yalnız kapsamda ayrılır: sabit pencere son k konuma bakar, sönümlemeli okuyucu her konuma bakar ama ağırlığı uzaklıkla çarpar, dikkat her konuma uzaklıktan bağımsız bakar.
  • DL15. Ölçüt her satırda aynıdır: konu nesnesi isabeti (büyük iyi) ve karşılaştırma sayısı (küçük iyi).
  • DL16. Karşılaştırma sayısı koşumdan bağımsızdır; sayılan bir büyüklüktür, ölçülen değil.

Bağ Uzaklığı

Akışlar tek bir değişkeni denetimli biçimde oynatır: konu nesnesinin dizinin sonuna uzaklığı.

# BENZETICI — model ders icinde standart kitaplikla yazilmis bir benzeticidir;
# gercek bir uc nokta cagrilmaz. Talep akislari KURGUDUR, tohum 20260218.
TOHUM, M32, AKIS = 20260218, 0xFFFFFFFF, 240

KOK = """sayac muhur vana hat fatura tarife endeks odeme abone adres ariza kod okuma
servis ekip ziyaret kayit talep destek bakim gun ay yil saat numara bilgi islem sistem
hata sonuc deger gecikme itiraz basvuru cevap bekle gonder geri ac kapa oku yaz bul bak
gel ver yap don iste calis bozuk kirik eksik normal yuksek dusuk yeni eski acik kapali
lutfen merhaba tesekkur iyi rica eder tekrar hala durum konu hafta ayni iki her sorun
ile icin ve bir bu ne var yok ama kadar sonra once ben biz siz""".split()
EK = """lari leri lar ler nin nun den dan de da te ta iniz unuz imiz umuz in un im um
si su li lu di du ti tu miz niz yor mis dir tir cek cak ki ya ye yi yu ma me ni nu
la le i u e a""".split()
PARCA = set(KOK) | set(EK) | set("abcdefghijklmnopqrstuvwxyz0123456789")


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 belirtecle(metin):
    b, g = [], ""
    for c in metin.lower() + " ":
        if c.isalnum():
            g += c
            continue
        i = 0
        while i < len(g):
            for j in range(min(len(g), i + 9), i, -1):
                if g[i:j] in PARCA:
                    b.append(g[i:j])
                    i = j
                    break
            else:
                b.append(g[i])
                i += 1
        g = ""
        if c in ".,?":
            b.append(c)
    return b


NESNE = {"fatura": ("faturamizin", ["yuksek", "eksik"]),
         "tarife": ("tarifemizin", ["yuksek", "eski"]),
         "endeks": ("endeksimizin", ["yuksek", "dusuk"]),
         "sayac": ("sayacimizin", ["bozuk", "eski"]),
         "muhur": ("muhurumuzun", ["kirik", "eksik"]),
         "vana": ("vananin", ["kapali", "bozuk"]),
         "hat": ("hattimizin", ["kapali", "eski"]),
         "odeme": ("odememizin", ["eksik", "gecikmeli"])}
DOLGU = ["Bu konuda tekrar yazdim ama cevap yok.",
         "Hala bekledim ve bir sonuc yok.",
         "Bu ay da bir talep actim.",
         "Servis ekip geldi ama bir islem yapmadi.",
         "Kayit numarasi ile bir sonuc yok.",
         "Sistemden basvuru yaptim ama cevap gelmedi.",
         "Iki gun once tekrar yazdim.",
         "Her hafta ayni durum icin bilgi istedim."]
NESNE_AD = list(NESNE)

VERI = []
for i in range(AKIS):
    r = uretec(TOHUM + i)
    n = NESNE_AD[int(r() * 8)]
    uzun_ad, durumlar = NESNE[n]
    satir = [f"Merhaba, {uzun_ad} durumu {durumlar[int(r() * 2)]}."]
    j = int(r() * 8)
    for _ in range(2 + int(r() * 8)):
        satir.append(DOLGU[j % 8])
        j += 3
    dagitici = None
    if r() < 0.35:
        dagitici = NESNE_AD[(NESNE_AD.index(n) + 1 + int(r() * 7)) % 8]
        satir.append(f"{dagitici.capitalize()} icin de bir kayit var.")
    satir.append("Bu konu ne durumda?")
    dizi = belirtecle(" ".join(satir))
    VERI.append({"dizi": dizi, "nesne": n, "dagitici": dagitici,
                 "uzaklik": len(dizi) - 1 - dizi.index(n)})

uz = [x["uzaklik"] for x in VERI]
print(f"{AKIS} kurgu talep akisi; {sum(x['dagitici'] is not None for x in VERI)}"
      f" akista ikinci bir nesne geciyor")
print(f"akis uzunlugu {min(len(x['dizi']) for x in VERI)}"
      f"-{max(len(x['dizi']) for x in VERI)} belirtec, ortalama"
      f" {sum(len(x['dizi']) for x in VERI) / AKIS:.1f}")
print(f"konu nesnesinin sondan uzakligi {min(uz)}-{max(uz)}, ortalama {sum(uz) / AKIS:.1f}")
print("\n" + " ".join(VERI[3]["dizi"]))
240 kurgu talep akisi; 83 akista ikinci bir nesne geciyor
akis uzunlugu 31-111 belirtec, ortalama 69.7
konu nesnesinin sondan uzakligi 28-108, ortalama 66.7

merhaba , endeks imiz in durum u dusuk . iki gun once tekrar yaz di m . hala bekle di m ve bir sonuc yok . kayit numara si ile bir sonuc yok . bu konu ne durum da ?

Kapanış sorusu her akışta aynıdır ve tek başına hiçbir bilgi taşımaz: cevap ortalama 66,7 belirteç geride durur. Sekiz akıştan yaklaşık üçünde sona yakın ikinci bir nesne geçer ve yakınlığa bakan her yordam için bir tuzaktır.

Bu kurgu bir alıştırma değil, sıradan bir üretim durumudur. Bir destek akışını doğru ekibe yönlendirmek için konu nesnesi gerekir ve akıştaki en yeni cümle onu neredeyse hiç taşımaz. Aklın ilk yolu en ucuz olandır: son birkaç cümleye bak, gerisini at. Aşağıdaki tablo o yolun sayısını verir ve dikkatin hangi sorunu çözdüğü ancak o sayıya karşı okunduğunda görülür.

Uzaklığa Bakan ve Bakmayan Okuyucu

Üç okuyucu aynı uyum puanını kullanır, yalnız hangi konumları karşılaştırdıklarında ayrılır. Sabit pencere son k konuma bakar; sönümlemeli okuyucu her konuma bakar ama ağırlığı her belirteçte 0,94 ile çarpar; dikkat her konuma uzaklıktan bağımsız bakar.

NESNE_KUME = set(NESNE_AD)
DURUM_KUME = {d for _, ds in NESNE.values() for d in ds} | {"gecikme"}


def uyum(t):
    """Sorgunun konumla uyumu. Gercek bir modelde ogrenilir; burada elle verilir."""
    return 1.0 if t in NESNE_KUME else (0.25 if t in DURUM_KUME else 0.02)


def oku(dizi, pencere=None, sonum=1.0):
    n = len(dizi)
    bas = 0 if pencere is None else max(0, n - pencere)
    en_iyi, en_p = None, -1.0
    for i in range(bas, n):
        p = uyum(dizi[i]) * (sonum ** (n - 1 - i))
        if p > en_p:
            en_p, en_iyi = p, dizi[i]
    return (en_iyi if en_iyi in NESNE_KUME else None), n - bas


KOVA = [(0, 32), (33, 64), (65, 999)]


def olc(ad, **k):
    dogru, toplam, karsi = [0, 0, 0], [0, 0, 0], 0
    for x in VERI:
        c, m = oku(x["dizi"], **k)
        karsi += m
        j = next(i for i, (a, b) in enumerate(KOVA) if a <= x["uzaklik"] <= b)
        toplam[j] += 1
        dogru[j] += c == x["nesne"]
    print(f"{ad:<26} {karsi / AKIS:>8.1f} {sum(dogru) / AKIS:>7.4f} "
          + " ".join(f"{d / t:>7.4f}" for d, t in zip(dogru, toplam)))


print(f"{'okuyucu':<26} {'karsi':>8} {'isabet':>7} "
      + " ".join(f"{a}-{b:<3}".rjust(7) for a, b in KOVA))
for k in (8, 16, 32, 64):
    olc(f"son {k} belirtec", pencere=k)
olc("uzaklikla sonumleme", sonum=0.94)
olc("tam dikkat")
print("kova basina akis" + "".join(
    f"{sum(1 for x in VERI if a <= x['uzaklik'] <= b):>8}" for a, b in KOVA).rjust(44))
y = [oku(x["dizi"], pencere=16)[0] for x in VERI]
print(f"son 16 belirtec: {sum(c == VERI[i]['nesne'] for i, c in enumerate(y))} dogru,"
      f" {sum(c is not None and c != VERI[i]['nesne'] for i, c in enumerate(y))} yanlis nesne,"
      f" {sum(c is None for c in y)} bos yanit")
okuyucu                       karsi  isabet   0-32   33-64   65-999
son 8 belirtec                  8.0  0.0000  0.0000  0.0000  0.0000
son 16 belirtec                16.0  0.0000  0.0000  0.0000  0.0000
son 32 belirtec                32.0  0.0458  0.9167  0.0000  0.0000
son 64 belirtec                56.8  0.4917  1.0000  0.9907  0.0000
uzaklikla sonumleme            69.7  0.3250  1.0000  0.6168  0.0000
tam dikkat                     69.7  1.0000  1.0000  1.0000  1.0000
kova basina akis                          12     107     121
son 16 belirtec: 0 dogru, 83 yanlis nesne, 157 bos yanit

Üçlü buradan okunur. Çıplak çağrı en ucuz okumadır: son 16 belirteç, akış başına 16 karşılaştırma, isabet 0,0000. Son satır bu sıfırın içini açıyor — 83 akışta pencereye giren ikinci nesne yanlış cevap olarak dönüyor, 157 akışta pencerede hiçbir nesne bulunmadığı için boş yanıt veriliyor. Ucuz okumanın iki ayrı başarısızlık biçimi vardır ve biri sessizdir, öteki değildir.

Pencere büyüdükçe isabet basamak basamak yükselir ama hep aynı yerde kesilir: son 32 belirteç 0-32 kovasında 0,9167 verir, ötesinde tam sıfır; son 64 belirteç 33-64 kovasında 0,9907’ye çıkar, 65 belirtecin ötesinde yine sıfır. Pencere, gördüğü yerde iyi, görmediği yerde hiçtir.

Sönümlemeli okuyucu daha ilginç bir başarısızlıktır. Her konuma bakar, yani kapsamı tamdır, ama 0,3250’de kalır. Uzaklık cezası 0,94 üzeri altmış, yani yaklaşık 0,024’e iner ve uzaktaki nesnenin 1,00’lık uyumu, yakındaki bir durum kökünün 0,25’inin altına düşer. Kapsam yetmez; ağırlığın uzaklıktan bağımsız olması gerekir. Dikkatin yaptığı tam olarak budur ve 1,0000 isabet buradan gelir.

Bedelin Büyüme Hızı

Uzaklıktan bağımsız ağırlık bedava değildir. Tek bir sorgu için okuma n karşılaştırma tutar; ama model bunu her konum için yapar. Nedensel bir geçişte i. konum kendinden önceki i konumu karşılaştırır ve toplam n(n+1)/2 olur.

print(f"{'baglam n':>9} {'tam dikkat':>12} {'pencere 64':>12} {'oran':>7} {'buyume':>7}")
onceki = None
for n in (64, 128, 256, 512, 1024):
    tam, pen = n * (n + 1) // 2, n * 64 - 64 * 63 // 2
    b = "-" if onceki is None else f"{tam / onceki:.2f}"
    print(f"{n:>9} {tam:>12} {pen:>12} {tam / pen:>7.2f} {b:>7}")
    onceki = tam


def ornekle(dizi, tohum):
    r = uretec(tohum + len(dizi))
    a = [uyum(t) for t in dizi]
    u, s = r() * sum(a), 0.0
    for t, w in zip(dizi, a):
        s += w
        if u < s:
            return t if t in NESNE_KUME else None
    return None


print(f"\nen olasi secim   isabet {sum(oku(x['dizi'])[0] == x['nesne'] for x in VERI) / AKIS:.4f}"
      "   (iki kosumda ayni)")
for t in (TOHUM, TOHUM + 1):
    d = sum(ornekle(x["dizi"], t) == x["nesne"] for x in VERI) / AKIS
    print(f"ornekleme tohum {t}   isabet {d:.4f}")
 baglam n   tam dikkat   pencere 64    oran  buyume
       64         2080         2080    1.00       -
      128         8256         6176    1.34    3.97
      256        32896        14368    2.29    3.98
      512       131328        30752    4.27    3.99
     1024       524800        63520    8.26    4.00

en olasi secim   isabet 1.0000   (iki kosumda ayni)
ornekleme tohum 20260218   isabet 0.3708
ornekleme tohum 20260219   isabet 0.3250

Büyüme sütunu tek cümlelik bir kuraldır: bağlam iki katına çıkınca karşılaştırma dört katına çıkar. Sabit pencere ise doğrusal büyür ve aradaki oran 1024 belirteçte 8,26’ya varır. Bir sonraki dersin bağlam penceresi tartışması, ve bu müfredatın bütün maliyet hesabı, bu iki eğrinin arasında geçer: sınırın niçin bir sayı olduğu ve niçin cömertçe büyütülmediği buradan görülür.

Bu tablonun kullanıcı tarafındaki karşılığı şudur: bağlama eklenen her belirteç, sonrakilerin hepsiyle karşılaştırılacağı için doğrusaldan hızlı bir bedel yazar. İsteme “her ihtimale karşı” eklenen bir belge, bedelini yalnız kendi uzunluğuyla ödemez. Gecikme de aynı eğriyi izler ve bu müfredatta sınıf olarak anılır: tek çağrı, zincir, paralel. Uzun bağlamlı tek bir çağrı, kısa bağlamlı iki çağrıdan pahalı olabilir ve hangisinin seçileceği ölçülmeden bilinmez.

Bu ders dikkatin ne olduğunu değil, ne satın aldığını ölçtü. Dikkat modelin bildiği şeyi açıklamaz; yalnız dizideki hangi konumların birbirine bağlanabildiğini belirler. Uyum puanlarının nereden geldiği hâlâ boşluktadır.

Son üç satır bu dersin belirsizlik ölçüsüdür. Karşılaştırma sayısı sayılan bir büyüklüktür ve koşumdan bağımsızdır; okuma kararı değildir. Ağırlıkların en büyüğü alındığında isabet iki koşumda da 1,0000’dır. Aynı ağırlıklardan örneklemeyle seçildiğinde aynı girdi 0,3708 ve 0,3250 verir: iki koşum, iki sayı, aynı düzenek. Seçim kuralının kendisi bir tasarım kararıdır ve sonraki ders onu ölçer.

Özet

  • Dikkatin ayırt edici özelliği kapsam değil, ağırlığın uzaklıktan bağımsız olmasıdır. Kapsamı tam ama uzaklıkla sönümlenen okuyucu 0,3250’de kalırken dikkat 1,0000 verir.
  • Sabit pencereli okuma gördüğü yerde iyi, görmediği yerde hiçtir: son 32 belirteç yakın kovada 0,9167, ötesinde 0,0000; son 64 belirteç 0,4917 genel isabet verir.
  • Ucuz okumanın iki başarısızlık biçimi vardır: 83 akışta yakındaki ikinci nesne yanlış cevap olarak döner, 157 akışta boş yanıt gelir.
  • Bedel karşılaştırma sayısıdır ve karesel büyür: bağlam iki katına çıkınca karşılaştırma dört katına çıkar, 1024 belirteçte sabit pencerenin 8,26 katıdır.
  • Aynı ağırlıklardan en olası seçim iki koşumda da 1,0000 verir, örnekleme 0,3708 ve 0,3250 verir.

Sonraki Adım

Model uzak bağlamı kullanabiliyor ve bunun bedeli sayıldı. Ama bu yetenek nereden geldi: uyum puanları bu derste elle yazıldı, gerçek bir modelde öğrenilir. Öğrenmenin iki ayrı aşaması vardır ve ikisi ayrı sorunları çözer. Sonraki ders bir görev kümesini ikiye ayırır ve her birinin kaç örnekle düzeldiğini sayar: hangi soru geniş metin yığınından, hangisi alanın kendi örneklerinden cevaplanıyor.

İ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