İçeriğe geç
academia.sh

Ders 06 / 22

Örnek Kullanımı

Sıfır, tek ve az örnekli yönlendirme aynı görevde yan yana ölçülüyor. Örnek sayısı sıfırdan sekize çıkarken 112 kurgu destek talebinde isabet 0,8571'den 0,9732'ye gidiyor, ama kazanç üçüncü örnekte doyuyor: sıfırdan üç örneğe +0,1071 isabet 4928 ek giriş belirteciyle geliyor, üçten sekize +0,0089 isabet 8736 ek belirteçle geliyor ve dört ile sekiz arası ortalama 0,9250 ile üç örnekteki 0,9643 sayısının altında kalıyor. Aynı dört örnek yalnız sırası değiştirilerek yazıldığında isabet 0,7679 ile 0,9196 arasında geziniyor ve giriş belirteci her sırada aynı kalıyor.

İçindekiler

Önceki ders yanıtın biçimini isteme yazdı ve makinece ayrıştırılabilir yanıt oranını 0,0000’dan 0,9750’ye taşıdı. İsteme konulan şey bir tarifti: alanların adı, sırası ve ayracı. Tarif yanıtın kabını belirledi, ama kararın kendisine dokunmadı. Hangi talebin hangi etikete gittiği hâlâ yalnız modelin bildiği bir şeydir ve istemde bunun tek bir örneği yoktur.

Bu ders tarif yerine örnek koyar. İsteme çözülmüş talepler yazılır ve her biri modele “bu metin bu etikete gider” der. Ölçülecek olan üç şeydir: örnek başına isabet kazancı, örnek başına belirteç bedeli, ve kazancın nerede durduğu. Dersin sonunda ölçü bir kez daha kendi üstüne döner: aynı örnekler yalnız sırası değiştirilerek yazıldığında sayı oynuyor mu.

  • IT48. Model bir benzeticidir, tohumu 20260218’dir ve gerçek bir uç nokta çağrılmaz. Destek talepleri ve arıza kodları kurgudur.
  • IT49. Önceki dersin biçim kısıtı sabit tutulur. Yanıt her koşumda üç alanlı kayıt olarak istenir ve aynı katı alan ayrıştırıcısıyla okunur; böylece bu derste değişen tek şey örneklerdir.
  • IT50. Ölçüm en olası seçimle yapılır. Örnekleme kapalıyken etiket kararı koşumdan bağımsızdır ve örneğin kattığı fark örnekleme gürültüsüne karışmaz; örnekleme açık koşum ayrıca basılır.
  • IT51. Örnek havuzu ölçüm kümesinden ayrıdır: sekiz çözülmüş talep havuza alınır, kalan 112 talep ölçülür. Havuzun ilk beş örneği beş etiketi birer kez kapsar, kalan üçü ikinci kalıpları getirir.
  • IT52. Benzetici örneği isteme yazılmış bir eşleşme tablosu gibi kullanır: örneğin metniyle talebin paylaştığı her belirteç, örneğin etiketinin puanını artırır. Sondaki örnek daha ağır basar; sıra etkisi buradan gelir.
  • IT53. Bedel giriş belirteciyle yazılır. Örnekler her istekte yeniden gönderilir; istek başına giriş belirteci örnek sayısıyla doğru orantılı büyür.

Örnek Başına Kazanç ve Bedel

# BENZETICI -- KURGUDUR. Gercek bir model uc noktasi cagrilmaz; standart kitaplikla
# yazilmis bir dil modeli benzeticisidir. Destek talepleri de kurgudur.
import math

TOHUM, M32 = 20260218, 0xFFFFFFFF
PENCERE, EN_UZUN = 240, 24


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):                  # KURGU belirtecleyici: parca en cok bes damga
    b = []
    for s in m.lower().replace(",", " , ").split():
        while len(s) > 5:
            b.append(s[:5])
            s = s[5:]
        b.append(s)
    return b


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


KONU = ["fatura", "ariza", "sayac", "tarife", "kesinti"]
KOD = {"fatura": "ft-21", "ariza": "ar-14", "sayac": "sy-32", "tarife": "tr-05",
       "kesinti": "ks-40", "odeme": "od-11", "sikayet": "sk-09", "bilgi": "bg-02",
       "genel": "gn-00"}
KALIP = {"fatura": ["bu ayki fatura tutari gecen aya gore cok yuksek geldi",
                    "faturami odedim ama sistemde borc gorunuyor",
                    "fatura ayrintisini nereden gorebilirim"],
         "ariza": ["evde su akmiyor bir ariza var galiba",
                   "baglanti bozuk oldu ve hic calismiyor",
                   "ariza kaydi actim ama ekip gelmedi"],
         "sayac": ["sayac okumasi yanlis girilmis endeks tutmuyor",
                   "sayac degisimi icin randevu istiyorum",
                   "sayac uzerindeki endeks ile fatura ayni degil"],
         "tarife": ["hangi tarife basamagindayim ogrenmek istiyorum",
                    "tarife degisikligi icin ne yapmam gerekiyor",
                    "birim ucret abone tipine gore degisiyor mu"],
         "kesinti": ["mahallede kesinti var ne zaman gelecek",
                     "planli kesinti duyurusu nereden takip edilir",
                     "aksamdan beri kesinti yasiyoruz"]}
EK = ["ayrica gecen ay da ayni sorun olmustu", "bu konuda memnun degilim",
      "acil bilgi almam gerekiyor", "kayit numaram elimde yok"]

TALEP = []
for i in range(120):
    r = uretec(TOHUM + i)
    k = KONU[ayrik(r(), [0.24, 0.22, 0.18, 0.20, 0.16])]
    m = KALIP[k][int(r() * 3)]
    if r() < 0.34:
        m += " " + EK[int(r() * 4)]
    TALEP.append({"no": 4001 + i, "metin": m, "konu": k})

KAVRAM = KONU + ["odeme", "sikayet", "bilgi", "genel"]
IZ = {"fatur": "fatura", "tutar": "fatura", "ayrin": "fatura", "ariza": "ariza",
      "bozuk": "ariza", "calis": "ariza", "akmiy": "ariza", "sayac": "sayac",
      "endek": "sayac", "okuma": "sayac", "tarif": "tarife", "birim": "tarife",
      "abone": "tarife", "basam": "tarife", "kesin": "kesinti", "duyur": "kesinti",
      "mahal": "kesinti", "borc": "odeme", "odedi": "odeme", "ucret": "odeme",
      "memnu": "sikayet", "sorun": "sikayet", "acil": "sikayet", "bilgi": "bilgi",
      "ogren": "bilgi", "nered": "bilgi"}
TUZAK = {"degis": "tarife", "kayit": "ariza", "yukse": "tarife", "gorun": "fatura",
         "ekip": "kesinti", "takip": "tarife", "giril": "fatura"}   # yaniltici baglar
SAYAC = [0]


def coz(istem):                     # istemi ornek listesi ve talep metni olarak ayirir
    ust, _, talep = istem.partition("Talep : ")
    ornek = []
    for parca in ust.split("Ornek : ")[1:]:
        m, _, e = parca.partition(" => ")
        ornek.append((m.strip(), e.split(" .")[0].strip()))
    return ornek, talep


def cagir(istem, ozet, tohum=TOHUM, sicaklik=0.0, en_uzun=EN_UZUN):
    SAYAC[0] += 1
    bel = belirtecle(istem)
    bos = {"giris": len(bel), "cikis": 0, "yanit": ""}
    if len(bel) > PENCERE:
        return dict(bos, durum="baglam_asimi")
    if SAYAC[0] % 37 == 0:
        return dict(bos, durum="hiz_siniri")
    r = uretec(tohum ^ izno(istem))
    if len(bel) > 90 and r() < 0.04:            # uzun istem , zaman asimi
        return dict(bos, durum="zaman_asimi")
    ornek, talep = coz(istem)
    bt = belirtecle(talep)
    aday = [k for k in KAVRAM if k[:5] in bel]
    if len(aday) < 3:
        aday = KAVRAM
    p = {k: 0.15 for k in aday}
    for t in bt:                                 # talep belirtecleri: iz ve tuzak
        for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    for j, (m, e) in enumerate(ornek):           # ic baglamdan ogrenme
        if e in p:
            w = 0.5 + (j + 1) / len(ornek)       # sondaki ornek daha agir basar
            for t in set(belirtecle(m)):
                if t in bt:
                    p[e] += 0.30 * w
    if sicaklik <= 0.0:
        k = max(sorted(p), key=lambda a: p[a])   # en olasi secim
    else:
        e = [math.exp(p[a] / sicaklik) for a in sorted(p)]
        k = sorted(p)[ayrik(r(), [v / sum(e) for v in e])]
    y = f"etiket : {k} ; kod : {KOD[k]} ; gerekce : {ozet}"
    cb = belirtecle(y)
    if len(cb) > en_uzun:
        cb, y = cb[:en_uzun], " ".join(cb[:en_uzun])
    return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y}


def ayristir(y):                    # onceki dersin katı alan ayristiricisi
    a = {}
    for parca in y.split(";"):
        ad = parca.split(":")
        if len(ad) == 2:
            a[ad[0].strip()] = ad[1].strip()
    tam = a.get("etiket") in KONU and a.get("kod") == KOD.get(a.get("etiket"))
    return a["etiket"] if tam and a.get("gerekce") else None


YONERGE = ("Talebi su etiketlerden birine ata : fatura , ariza , sayac , tarife , "
           "kesinti . Yanitin bicimi : etiket : <deger> ; kod : <deger> ; "
           "gerekce : <deger> . ")
SEC = [1, 3, 4, 5, 0, 18, 13, 40]   # once her etiketten bir ornek, sonra ikinci kalip
HAVUZ = [TALEP[i] for i in SEC]
KUME = [t for i, t in enumerate(TALEP) if i not in SEC]


def istem_kur(ornekler, metin):
    o = "".join(f"Ornek : {x['metin']} => {x['konu']} . " for x in ornekler)
    return YONERGE + o + "Talep : " + metin


def olc(ornekler, tohum=TOHUM, sicaklik=0.0):
    SAYAC[0] = 0
    g = c = d = h = 0
    for x in KUME:
        s = cagir(istem_kur(ornekler, x["metin"]), " ".join(x["metin"].split()[:3]),
                  tohum=tohum, sicaklik=sicaklik)
        g, c = g + s["giris"], c + s["cikis"]
        h += s["durum"] != "tamam"
        d += ayristir(s["yanit"]) == x["konu"]
    return {"isabet": d / len(KUME), "giris": g, "cikis": c, "hata": h}


print(f"KURGU: ornek havuzu {len(HAVUZ)} cozulmus talep , olcum kumesi {len(KUME)} talep")
print(f"ornek yazimi: Ornek : {HAVUZ[0]['metin']} => {HAVUZ[0]['konu']} .")
print(f"\n{'ornek':>5}  {'etiket':>7}  isabet  giris belirteci  istek basi  kazanc")
onceki = None
for n in range(9):
    d = olc(HAVUZ[:n])
    kz = "-" if onceki is None else f"{d['isabet'] - onceki:+.4f}"
    ad = HAVUZ[n - 1]["konu"] if n else "-"
    print(f"{n:>5}  {ad:>7}  {d['isabet']:.4f}  {d['giris']:>15}"
          f"  {d['giris'] / len(KUME):>10.1f}  {kz:>7}")
    onceki = d["isabet"]
KURGU: ornek havuzu 8 cozulmus talep , olcum kumesi 112 talep
ornek yazimi: Ornek : fatura ayrintisini nereden gorebilirim => fatura .

ornek   etiket  isabet  giris belirteci  istek basi  kazanc
    0        -  0.8571             6646        59.3        -
    1   fatura  0.8571             8438        75.3  +0.0000
    2    ariza  0.9018             9782        87.3  +0.0446
    3    sayac  0.9643            11574       103.3  +0.0625
    4   tarife  0.8929            13366       119.3  -0.0714
    5  kesinti  0.9196            15270       136.3  +0.0268
    6   fatura  0.9286            17398       155.3  +0.0089
    7    ariza  0.9107            18854       168.3  -0.0179
    8    sayac  0.9732            20310       181.3  +0.0625

Birinci satır sıfır örnekli yönlendirmedir: istemde yalnız yönerge ve biçim tarifi vardır, isabet 0,8571. İkinci satır tek örnekli yönlendirmedir ve kazancı sıfırdır. Tek örnek, kendi etiketinin puanını yükseltmekten başka bir şey yapmaz; öbür dört etiket hakkında hiçbir şey söylemez ve zaten doğru sınıflanan talepleri biraz daha doğru sınıflar. Bedeli gerçektir: istek başına giriş belirteci 59,3’ten 75,3’e çıkar.

Kazanç az örnekli yönlendirmede başlar. İkinci örnek +0,0446, üçüncü örnek +0,0625 katar ve isabet 0,9643 olur. Buraya kadar örnek eklemek karşılığını veriyor: sıfırdan üçe +0,1071 isabet, +4928 giriş belirteci. Dördüncü örnekten sonra çizelge yön değiştirir. Dördüncü örnek −0,0714 ile en büyük tek adımlı kaybı üretir, beşinci ve altıncı küçük kazançlar getirir, yedinci yine düşürür, sekizinci +0,0625 ile en yüksek sayıya çıkarır. Dört ile sekiz arasındaki beş ölçümün ortalaması 0,9250, yani üç örnekteki 0,9643’ün altında.

Doyma noktası bu çizelgede üçüncü örnektir. Üçten sekize gitmenin isabete kattığı +0,0089, giriş belirtecine eklediği +8736. İlk üç örnek belirteç başına yaklaşık on kat daha fazla isabet getirdi. Bunun nedeni örneklerin ne öğrettiğinde: ilk üç örnek üç ayrı etiketin belirteçlerini tanıtır ve daha önce yanlış eşlenen talepleri düzeltir. Sonraki örnekler ya zaten kapsanmış bir etiketi tekrarlar ya da kendi cümlelerindeki konu dışı sözcükleri de öğretir; “nereden”, “gerekiyor” gibi sözcükler etiketle ilgisizdir ve puanı yanlış yöne iter. Örnek eklemek bir noktadan sonra bilgi değil gürültü ekler, ve gürültünün bedeli de belirteçtir.

Aynı Örnekler, Başka Sıra

SIRA = [(0, 1, 2, 3), (3, 2, 1, 0), (1, 3, 0, 2), (2, 0, 3, 1), (0, 2, 1, 3), (3, 0, 2, 1)]
D = HAVUZ[:4]
print("ayni dort ornek , yalniz sira degisiyor")
v = []
for s in SIRA:
    d = olc([D[i] for i in s])
    v.append(d["isabet"])
    print(f"  {' > '.join(D[i]['konu'] for i in s):<34} isabet {d['isabet']:.4f}"
          f"  giris {d['giris']}")
print(f"  siralama araligi {max(v) - min(v):.4f} , giris belirteci her sirada esit")

print("\nolcunun kendi degiskenligi")
for n in (0, 3, 8):
    a, b = olc(HAVUZ[:n]), olc(HAVUZ[:n], tohum=TOHUM + 1)
    print(f"  n={n} en olasi secim : {a['isabet']:.4f} / {b['isabet']:.4f}"
          f"  fark {b['isabet'] - a['isabet']:+.4f} , basarisiz cagri {a['hata']}")
for n in (0, 3):
    a = olc(HAVUZ[:n], sicaklik=0.6)
    b = olc(HAVUZ[:n], tohum=TOHUM + 1, sicaklik=0.6)
    print(f"  n={n} ornekleme acik : {a['isabet']:.4f} / {b['isabet']:.4f}"
          f"  fark {b['isabet'] - a['isabet']:+.4f}")

s0, s3, s8 = olc(HAVUZ[:0]), olc(HAVUZ[:3]), olc(HAVUZ[:8])
orta = sum(olc(HAVUZ[:n])["isabet"] for n in range(4, 9)) / 5
print(f"\nsifir -> uc ornek  : isabet {s3['isabet'] - s0['isabet']:+.4f} ,"
      f" giris belirteci {s3['giris'] - s0['giris']:+d}")
print(f"uc -> sekiz ornek  : isabet {s8['isabet'] - s3['isabet']:+.4f} ,"
      f" giris belirteci {s8['giris'] - s3['giris']:+d}")
print(f"dort ile sekiz arasi ortalama isabet {orta:.4f} , uc ornekte {s3['isabet']:.4f}")
ayni dort ornek , yalniz sira degisiyor
  fatura > ariza > sayac > tarife    isabet 0.8929  giris 13366
  tarife > sayac > ariza > fatura    isabet 0.9196  giris 13366
  ariza > tarife > fatura > sayac    isabet 0.8929  giris 13366
  sayac > fatura > tarife > ariza    isabet 0.9196  giris 13366
  fatura > sayac > ariza > tarife    isabet 0.9196  giris 13366
  tarife > fatura > sayac > ariza    isabet 0.7679  giris 13366
  siralama araligi 0.1518 , giris belirteci her sirada esit

olcunun kendi degiskenligi
  n=0 en olasi secim : 0.8571 / 0.8571  fark +0.0000 , basarisiz cagri 3
  n=3 en olasi secim : 0.9643 / 0.9554  fark -0.0089 , basarisiz cagri 3
  n=8 en olasi secim : 0.9732 / 0.9464  fark -0.0268 , basarisiz cagri 3
  n=0 ornekleme acik : 0.7321 / 0.8393  fark +0.1071
  n=3 ornekleme acik : 0.8571 / 0.8750  fark +0.0179

sifir -> uc ornek  : isabet +0.1071 , giris belirteci +4928
uc -> sekiz ornek  : isabet +0.0089 , giris belirteci +8736
dort ile sekiz arasi ortalama isabet 0.9250 , uc ornekte 0.9643

Üstteki altı satırın hepsinde aynı dört örnek vardır. Etiket kümesi aynı, yönerge aynı, biçim tarifi aynı, ölçüm kümesi aynı ve giriş belirteci altı sırada da 13366. Değişen tek şey örneklerin yazılma sırasıdır ve isabet 0,7679 ile 0,9196 arasında geziniyor. Aralık 0,1518, yani sıfırdan üç örneğe geçmenin kattığı 0,1071’den büyük. Aynı örnek kümesi, bedeli kuruşuna kadar aynıyken, iyi bir istemle kötü bir istem arasındaki farkı üretebiliyor.

Nedeni benzeticinin son örneği daha ağır basmasıdır. En kötü sıralamada son örnek ariza etiketlidir ve cümlesi “kayit” ile “ekip” belirteçlerini taşır; bu iki belirteç talep kümesinde başka etiketlere ait taleplerde de geçer ve ağırlıklandırıldığında onları da ariza tarafına çeker. Aynı örnek listenin başında dururken bu etkiyi yapmıyor. Sıra bir tasarım kararıdır ve istem üzerinde bedelsiz bir kaldıraçtır: değiştirmek hiçbir belirteç maliyeti getirmez.

Alt bölüm ölçünün kendi değişkenliğini veriyor. En olası seçimle çalışıldığında iki koşum arasındaki fark en fazla 0,0268; başarısız çağrı sayısı üç koşumda da üçtür ve hız sınırından gelir. Bu ölçekte sıfırdan üç örneğe geçişin +0,1071 kazancı iki koşum farkının dört katıdır ve ölçülmüş sayılır; üçten sekize geçişin +0,0089 kazancı iki koşum farkının altında kalır ve ölçülmemiş sayılır. Örnekleme açıldığında tablo tersine döner: sıfır örnekte iki koşum arasındaki fark 0,1071, yani tam olarak ölçmek istediğimiz kazanç kadar. Aynı sayıyı örneklemeli koşumda tek seferde ölçmeye çalışan biri, kazancı da gürültüyü de aynı büyüklükte görür ve ikisini ayıramaz. Ölçülmeden değiştirilen istem bir iyileştirme değil bir tahmindir ve burada ölçmenin bir ön koşulu vardır: ölçünün kendi değişkenliği, aranan farktan küçük olmalıdır.

Özet

  • Sıfır örnekli yönlendirme 0,8571, tek örnekli yönlendirme yine 0,8571 veriyor: tek örnek isabete hiçbir şey katmadan istek başına giriş belirtecini 59,3’ten 75,3’e çıkarıyor.
  • Kazanç az örnekli yönlendirmede birikiyor ve üçüncü örnekte doyuyor: sıfırdan üçe +0,1071 isabet ve +4928 giriş belirteci, üçten sekize +0,0089 isabet ve +8736 giriş belirteci.
  • Dört ile sekiz örnek arasındaki beş ölçümün ortalaması 0,9250, üç örnekteki 0,9643’ün altında; doyma noktasından sonra eklenen örnek bilgi değil gürültü taşıyor.
  • Aynı dört örnek yalnız sırası değiştirilerek yazıldığında isabet 0,7679 ile 0,9196 arasında geziniyor. Aralık 0,1518, giriş belirteci altı sıralamada da 13366: sıra bedelsiz bir tasarım kaldıracıdır.
  • En olası seçimle iki koşum farkı en fazla 0,0268; örnekleme açıkken sıfır örnekte 0,1071. Aranan kazanç ölçünün kendi değişkenliğinden küçükse ölçüm yapılmamış sayılır.

Sonraki Adım

Bu iki derste isteme yazılan her şey olumluydu: şunu yap, şu biçimde yaz, şu örneklere bak. Uygulamada istemlerin büyük bölümü bunun tersini de içerir — bir şeyin yapılmamasını söyleyen cümleler. Bir etiketi kullanma, tarih verme, kesin konuşma, uydurma. Sezgi bu cümlelerin zararsız olduğunu söyler: en kötü ihtimalle işe yaramaz. Sonraki ders bu sezginin sayısını alır ve tersini bulur. Aynı kural iki ayrı biçimde yazılır — yasak bildirimi ve olumlu bildirim — ve her ikisinin ürettiği ihlal sayısı yan yana basılır. Yasağın yasakladığı şeyi istemde adıyla anmanın kendisinin bir bedeli vardır ve bu bedel sayıyla görünü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