İçeriğe geç
academia.sh

Ders 14 / 16

Erişim ve Üretim Kalitesinin Ayrı Ölçülmesi

Uçtan uca tek bir doğruluk oranının dört ayrı durumu üst üste yığdığının gösterilmesi: kırk sorguluk kurgu kümede erişimsiz taban 0,3750 çıkıyor ve bu oranın tamamı şans, çünkü doğru parça hiç getirilmiyor. Üç parçalı bağlamda tek sayı 0,9500, beş parçalı bağlamda da 0,9500; ama üçlüde iki başarısızlık erişim kusuru, beşlide aynı iki başarısızlık üretim kusurudur ve tek sayı ikisini ayırt etmez. Erişim anması üçlüde 0,9500, beşlide 1,0000; bedel 120 parça ve 2199 belirteçten 200 parça ve 3505 belirtece çıkıyor. İki koşum farkı erişimsiz tabanda 0,1750, üç parçalı bağlamda 0,0000. Sınıf alt grubu her iki kusurun da aynı sınıfta toplandığını gösteriyor.

İçindekiler

Bir önceki derste aynı parçalar farklı sıralarda verildi ve yanıtın değişme payı sayıldı. Hat artık kurulu: belge hazırlandı, parçalara bölündü, dizinlendi, sorgu tek adımda dönüştürüldü, adaylar yeniden sıralandı ve bağlam sınıra göre kuruldu. Yedi dersin her biri kendi adımını kendi sayısıyla savundu.

Bu ders o sayıların birleştiği yerde durur. Bir erişim artırılmış üretim hattı çalıştırıldığında elde kalan genellikle tek bir orandır: kaç soruya doğru yanıt verildi. Bu dersin iddiası, o tek oranın dört ayrı durumu üst üste yığdığı ve yığının içinden hangi aşamanın bozulduğunun okunamadığıdır. Değerlendirme yordamının kendisi M27’nin Makine Öğrenmesi kursunda, model değerlendirme ve alt grup dersleriyle birlikte kuruldu ve burada tekrarlanmaz; oradan devralınan tek şey taban çizgisi kuralıdır ve bu kursta taban erişimsiz çağrıdır.

  • EH71. Dağarcık, kavram ekseni, gömme ve sorgu kümesi kurgudur ve ders içinde üretilir. Hiçbir gerçek kurum, ürün, belge, vektör deposu ya da gömme ucu yoktur.
  • EH72. Kavramın belge dilinde bir yüzeyi (kademe esigi), sorgu dilinde başka bir yüzeyi (hangi dilimdeyim) vardır ve ikisi hiçbir belirteci paylaşmaz.
  • EH73. Erişim ölçüsü: getirilen parçaların içinde hedef yordamın belge yüzeyi geçiyorsa erişim doğrudur. Bu ölçü tohumdan bağımsızdır.
  • EH74. Üretim ölçüsü: yanıtta adı geçen yordam hedef yordamsa üretim doğrudur. Yanıt bir dil modeli benzeticisinden gelir; benzetici gerçek bir uç nokta çağırmaz.
  • EH75. Benzeticinin ön bilgisi yalnız sınıf düzeyindedir. Sorgu dilinden hangi sınıfa ait olduğunu çıkarır, o sınıfın dört yordamına eşit ve küçük bir taban puan verir, ama yordam adını kendiliğinden bilmez. Bağlamda geçen her yordam adı bir puan ekler.
  • EH76. Bedel üç birimle yazılır: getirilen parça sayısı, isteme giren belirteç ve erişim adımı. Süre yazılmaz.

Erişim Sütunu: Kanıt Geldi mi

İlk sütun modele hiç bakmaz. Sorulan tek şey, getirilen parçaların hedef yordamı taşıyıp taşımadığıdır. İki oran yan yana durur: erişim anması en az bir doğru parçanın geldiği sorgu payı, erişim kesinliği getirilen parçaların doğru olma payıdır.

# KURGUDUR. Dagarcik, kavram ekseni, gomme ve sorgu kumesi ders icinde uretilir;
# hicbir gercek kurum, urun, belge ya da gomme ucu yoktur.
TOHUM, M32 = 20260218, 0xFFFFFFFF
BOYUT = 32


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 belirtecle(m):
    b = []
    for s in m.lower().replace(",", " , ").split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


SINIF = ["tarife", "ariza", "sayac", "kesinti", "bakim"]
KOD = {"tarife": "TR", "ariza": "AR", "sayac": "SY", "kesinti": "KS", "bakim": "BK"}
KAVRAM = {                       # kavram: (sinif, belge yuzeyi, sorgu yuzeyi)
    "basamak":   ("tarife", "kademe esigi", "hangi dilimdeyim"),
    "birim":     ("tarife", "birim ucret", "metrekup fiyati"),
    "abonetip":  ("tarife", "abone tipi", "mesken mi isyeri mi"),
    "gecis":     ("tarife", "tarife gecisi", "plan degistirme"),
    "arizakod":  ("ariza", "ariza kodu", "hata numarasi"),
    "sizinti":   ("ariza", "hat sizintisi", "su kacagi"),
    "basinc":    ("ariza", "basinc dususu", "zayif akis"),
    "ekip":      ("ariza", "saha ekibi", "gorevli ne zaman gelir"),
    "endeks":    ("sayac", "endeks degeri", "sayac ustundeki rakam"),
    "okuma":     ("sayac", "okuma yordami", "nasil kaydediliyor"),
    "degisim":   ("sayac", "sayac degisimi", "cihaz yenileme"),
    "dogrula":   ("sayac", "okuma dogrulamasi", "yanlis girilmis mi"),
    "planli":    ("kesinti", "planli kesinti", "onceden duyurulan durma"),
    "duyuru":    ("kesinti", "duyuru kanali", "nereden ogrenirim"),
    "sure":      ("kesinti", "kesinti suresi", "ne kadar surer"),
    "geridonus": ("kesinti", "yeniden verme", "ne zaman gelir"),
    "periyot":   ("bakim", "periyodik bakim", "duzenli kontrol"),
    "vana":      ("bakim", "vana kontrolu", "musluk kapatma duzeni"),
    "filtre":    ("bakim", "filtre degisimi", "temizleme parcasi"),
    "kalib":     ("bakim", "kalibrasyon kaydi", "olcum ayari"),
}
ANAHTAR = list(KAVRAM)
ORTAK = ["kayit", "bolge", "donem", "islem", "form", "onay", "not"]

BELGE = []
for i in range(200):
    r = uretec(TOHUM + 7919 * i)
    s = SINIF[ayrik(r(), [0.22, 0.24, 0.20, 0.18, 0.16])]
    kav = [k for k in ANAHTAR if KAVRAM[k][0] == s]
    ana = kav[int(r() * len(kav))]
    n = 2 + int(r() * 4)
    par, kavlar = [], [ana]
    for _ in range(n):
        y = kav[int(r() * len(kav))]
        kavlar.append(y)
        o = ORTAK[int(r() * len(ORTAK))]
        par.append(f"{KAVRAM[y][1]} icin {o} tutulur ve {KAVRAM[ana][1]} ile birlikte yazilir")
    BELGE.append({"kod": f"{KOD[s]}{i + 1:03d}", "sinif": s, "ana": ana, "kavram": kavlar,
                  "baslik": f"{KAVRAM[ana][1]} yordami", "par": par})


def _kavramla(m, alan=True):
    v = [0.0] * len(ANAHTAR)
    dm = " " + m.lower() + " "
    for i, k in enumerate(ANAHTAR):
        bel, sor = KAVRAM[k][1], KAVRAM[k][2]
        if bel in dm:
            v[i] += 1.0
        if sor in dm:
            v[i] += 1.0 if alan else 0.0      # alan disi gomme sorgu dilini tanimaz
    if not alan:
        for o in ORTAK:
            if " " + o + " " in dm:
                for i in range(len(ANAHTAR)):
                    v[i] += 0.05
    return v


IZDUS = []
for i in range(len(ANAHTAR)):
    r = uretec(TOHUM ^ (i + 1) * 2654435761)
    IZDUS.append([r() * 2 - 1 for _ in range(64)])


def gom(m, boyut=BOYUT, alan=True):
    k = _kavramla(m, alan)
    v = [0.0] * boyut
    for i, a in enumerate(k):
        if a:
            for j in range(boyut):
                v[j] += a * IZDUS[i][j % 64]
    n = sum(x * x for x in v) ** 0.5
    return [x / n for x in v] if n else v


def aci(a, b):
    return sum(x * y for x, y in zip(a, b))


SORGU = []
for i in range(40):
    r = uretec(TOHUM + 104729 * i)
    d = BELGE[int(r() * len(BELGE))]
    SORGU.append({"metin": f"{KAVRAM[d['ana']][2]} {ORTAK[int(r() * len(ORTAK))]}",
                  "sinif": d["sinif"], "kavram": d["ana"]})

PARCA = [{"kod": d["kod"], "sinif": d["sinif"], "metin": p}
         for d in BELGE for p in d["par"]]
PV = [gom(p["metin"]) for p in PARCA]


def getir(q, k):
    v = gom(q)
    s = sorted(range(len(PARCA)), key=lambda i: (-aci(v, PV[i]), i))
    return [PARCA[i] for i in s[:k]]


def erisim_olc(k):
    """Yalniz erisim sutunu: getirilen parcalar hedef yordami tasiyor mu."""
    anma = kesin = 0
    for s in SORGU:
        yuzey = KAVRAM[s["kavram"]][1]
        tasiyan = [p for p in getir(s["metin"], k) if yuzey in p["metin"]]
        anma += 1 if tasiyan else 0
        kesin += len(tasiyan) / k
    return anma / len(SORGU), kesin / len(SORGU)


print(f"dagarcik {len(BELGE)} belge , {len(PARCA)} parca , sorgu {len(SORGU)}")
print("\n  k   erisim anmasi   erisim kesinligi   getirilen parca")
for k in (1, 3, 5):
    a, ke = erisim_olc(k)
    print(f"{k:>3} {a:>15.4f} {ke:>18.4f} {k * len(SORGU):>18}")
dagarcik 200 belge , 693 parca , sorgu 40

  k   erisim anmasi   erisim kesinligi   getirilen parca
  1          0.9500             0.9500                 40
  3          0.9500             0.9500                120
  5          1.0000             0.9600                200

Bir parçadan üçe çıkmak anmayı oynatmıyor: 0,9500 aynı kalıyor, getirilen parça sayısı üçe katlanıyor. Beşe çıkmak anmayı 1,0000 yapıyor, yani kanıt artık her sorguda bağlamın içinde. Erişim sütunu bu kadarını söyler ve daha fazlasını söyleyemez: parçanın geldiğini bilir, kullanıldığını bilmez.

Üretim Sütunu ve Dört Durum

İkinci sütun aynı sorguları bir dil modeli benzeticisiyle çalıştırır. Benzetici gerçek bir uç nokta çağırmaz; bağlamda geçen yordam adlarını puanlar, sorgunun sınıfını tanıyıp o sınıfın dört yordamına küçük bir taban puan verir ve dağılım sıcaklığıyla örnekler. İki sütun kesiştiğinde her sorgu dört kutudan birine düşer.

from math import exp


def izno(m):
    h = 2166136261
    for c in m:
        h = ((h ^ ord(c)) * 16777619) & M32
    return h


def uret(q, parcalar, tohum=TOHUM, sicaklik=0.6):
    """KURGU dil modeli benzeticisi. Baglamda gecen yordam adlarini puanlar;
    on bilgisi yalniz sinif duzeyindedir, yordam adini bilmez."""
    istem = q + " || " + " ".join(p["metin"] for p in parcalar)
    dm, sq = " " + istem.lower() + " ", " " + q.lower() + " "
    sn = next((KAVRAM[k][0] for k in ANAHTAR if KAVRAM[k][2] in sq), None)
    puan = {}
    for k in ANAHTAR:
        p = (0.15 if KAVRAM[k][0] == sn else 0.0) + dm.count(KAVRAM[k][1])
        if p:
            puan[k] = p
    if not puan:
        return None, istem
    ad = list(puan)
    a = [exp(puan[k] / sicaklik) for k in ad]
    t = sum(a)
    return ad[ayrik(uretec(tohum ^ izno(istem))(), [x / t for x in a])], istem


def kosum(k, tohum=TOHUM):
    d = {"dd": 0, "dy": 0, "yd": 0, "yy": 0, "bel": 0}
    for s in SORGU:
        par = getir(s["metin"], k) if k else []
        yanit, istem = uret(s["metin"], par, tohum)
        d["bel"] += len(belirtecle(istem))
        dp = any(KAVRAM[s["kavram"]][1] in p["metin"] for p in par)
        dy = yanit == s["kavram"]
        d["dd" if dp and dy else "dy" if dp else "yd" if dy else "yy"] += 1
    return d


n = len(SORGU)
print("kurulum     dogru+dogru  dogru+yanlis  yanlis+dogru  yanlis+yanlis"
      "   tek sayi  belirtec")
for ad, k in (("erisimsiz", 0), ("k = 1", 1), ("k = 3", 3), ("k = 5", 5)):
    d = kosum(k)
    print(f"{ad:<11} {d['dd']:>11} {d['dy']:>13} {d['yd']:>13} {d['yy']:>14}"
          f" {(d['dd'] + d['yd']) / n:>10.4f} {d['bel']:>9}")

print("\nikinci kosum (tohum 20260219) , tek sayi ve kosum farki")
for ad, k in (("erisimsiz", 0), ("k = 1", 1), ("k = 3", 3), ("k = 5", 5)):
    a = (lambda d: (d["dd"] + d["yd"]) / n)(kosum(k))
    b = (lambda d: (d["dd"] + d["yd"]) / n)(kosum(k, TOHUM + 1))
    print(f"{ad:<11} {a:>7.4f} {b:>9.4f} {b - a:>+10.4f}")

print("\nsinif alt grubu (dogru+dogru / dogru+yanlis / yanlis+dogru / yanlis+yanlis)")
print(f"{'sinif':<9} {'k = 3':>16} {'k = 5':>16}")
for sn in SINIF:
    sat = []
    for k in (3, 5):
        c = [0, 0, 0, 0]
        for s in SORGU:
            if s["sinif"] != sn:
                continue
            par = getir(s["metin"], k)
            y, _ = uret(s["metin"], par)
            dp = any(KAVRAM[s["kavram"]][1] in p["metin"] for p in par)
            c[0 if dp and y == s["kavram"] else 1 if dp else 2 if y == s["kavram"] else 3] += 1
        sat.append(" / ".join(str(x) for x in c))
    print(f"{sn:<9} {sat[0]:>16} {sat[1]:>16}")
kurulum     dogru+dogru  dogru+yanlis  yanlis+dogru  yanlis+yanlis   tek sayi  belirtec
erisimsiz             0             0            15             25     0.3750       231
k = 1                33             5             0              2     0.8250       887
k = 3                38             0             0              2     0.9500      2199
k = 5                38             2             0              0     0.9500      3505

ikinci kosum (tohum 20260219) , tek sayi ve kosum farki
erisimsiz    0.3750    0.2000    -0.1750
k = 1        0.8250    0.9250    +0.1000
k = 3        0.9500    0.9500    +0.0000
k = 5        0.9500    0.9500    +0.0000

sinif alt grubu (dogru+dogru / dogru+yanlis / yanlis+dogru / yanlis+yanlis)
sinif                k = 3            k = 5
tarife       8 / 0 / 0 / 0    8 / 0 / 0 / 0
ariza        7 / 0 / 0 / 2    7 / 2 / 0 / 0
sayac       10 / 0 / 0 / 0   10 / 0 / 0 / 0
kesinti      6 / 0 / 0 / 0    6 / 0 / 0 / 0
bakim        7 / 0 / 0 / 0    7 / 0 / 0 / 0

Aynı Sayı, Başka Bileşim

Tablonun ilk satırı tabanı verir. Erişimsiz çağrı 0,3750 yapıyor ve bu oranın tamamı üçüncü kutudandır: doğru parça hiç getirilmedi, on beş yanıt sınıf düzeyindeki tahminden doğru çıktı. Tek sayıya bakan biri modelin soruların üçte birinden fazlasını bildiğini söyler. Dört durum tablosu aynı satırda hiçbir bilgiye dayanılmadığını söyler. Bu ayrım şansı bir yetenek sanmayı önler.

Asıl gösterim son iki satırdadır. Üç parçalı ve beş parçalı kurulumların tek sayısı birebir aynıdır: 0,9500. Bileşimleri değildir. Üçlüde iki başarısızlık yanlış parça + yanlış yanıt kutusundadır, yani kanıt hiç gelmemiştir; sorun erişimdedir. Beşlide erişim anması 1,0000’e çıkar ve o iki başarısızlık doğru parça + yanlış yanıt kutusuna taşınır: kanıt bağlamdadır ve model onu kullanmamıştır. Bu ikincisi bir kaynağa sadakat kusurudur ve düzeltmesi bambaşkadır. Tek sayı bu taşınmayı hiç göstermez, ama bedel gösterir: 120 parçadan 200 parçaya, 2199 belirteçten 3505 belirtece.

Alt grup dökümü hangi düzeltmenin nereye yapılacağını yazar. Her iki kusur da tek bir sınıfta, ariza sınıfında toplanmıştır; öbür dört sınıf iki kurulumda da eksiksizdir. Beşe çıkmak kayıp sorguları kurtarmadı, yalnız kusurun adını değiştirdi.

Son olarak iki koşum farkı, tek sayının ne kadarına güvenilebileceğini söyler. Erişimsiz tabanda fark 0,1750; şansa dayanan bir sayı doğal olarak oynaktır. Bir parçada fark 0,1000. Üç ve beş parçada fark 0,0000: bağlamdaki kanıt puan ayrımını yeterince açtığı için örnekleme artık sonucu döndürmüyor. Sayıyı sabitleyen şey düzeneğin kendisi değil, bağlama giren kanıttır.

Özet

  • Erişim ve üretim iki ayrı sütundur: birincisi kanıtın geldiğini, ikincisi kanıtın kullanıldığını ölçer ve biri öbürünü yerine koyamaz.
  • Erişimsiz taban bu iş yükünde 0,3750 çıkar ve bu oranın tamamı yanlış parça + doğru yanıt kutusundadır, yani şanstır.
  • Üç parçalı ve beş parçalı kurulumun tek sayısı da 0,9500’dür, ama ilkinde iki başarısızlık erişim, ikincisinde aynı iki başarısızlık üretim kusurudur.
  • Beş parçaya çıkmak anmayı 0,9500’den 1,0000’e taşır; bedeli 120 parçadan 200 parçaya ve 2199 belirteçten 3505 belirtece çıkmaktır, uçtan uca sayı ise değişmez.
  • Sınıf alt grubu her iki kusuru da ariza sınıfında toplar; iki koşum farkı erişimsiz tabanda 0,1750, üç parçalı bağlamda 0,0000’dır.

Sonraki Adım

Bu ders erişimin ne zaman kazandığını değil, kazancın nereden geldiğini ayırdı. Cevaplanmayan bir soru kaldı: erişim hattı, modele bilgi kazandırmanın tek yolu değildir. Aynı görev için modelin kendisi de değiştirilebilir; M28/K03’ün Model API’leri ile Uygulama Geliştirme kursunda ince ayarın sayısı ölçüldü ve altmış örnekle istem düzeneğini geçemediği görüldü. Bir sonraki ders bu iki çözümü aynı masaya koyar ve üç ayrı görevde yan yana ölçer: hangisinin hangi problemi çözdüğü ve hangi görevde erişimin kazanmadığı sayı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