İçeriğe geç
academia.sh

Ders 02 / 14

Yapay Zekâ ve Makine Öğrenmesi Mühendisliği Farkı

Sorumluluk sınırının ayar sayısıyla ölçülmesi: aynı destek talebi probleminde eğiten yaklaşımın dört ayarından üçü, kullanan yaklaşımın beş ayarından dördü sayıyı 0,0200'den fazla oynatıyor. Eğiten yaklaşım 48 etiketli örnek istiyor ve 0,9861'e çıkıyor, kullanan yaklaşım sıfır etiketli örnekle 0,8056 veriyor. İki ayar listesinin hiçbir maddesi ortak değil. Yeniden deneme sayıyı 0,0000 oynatıp bir çağrı ve 51 belirteç ekliyor, elde olmayan tohum ise sayıyı 0,1250 düşürüyor.

İçindekiler

Önceki ders modeli hiç değiştirmeden sayıyı 0,6000’den 0,7750’ye çıkardı. Bütün kazanç modelin dışından geldi. Önceki müfredatta bunun tersi olurdu: kazanç modelin içinden gelir, dışarısı sabit tutulurdu. İki yaklaşım aynı destek talebi problemini çözebilir, ama ellerinde tuttukları şey aynı değildir.

Bu ders o farkı bir sayıya bağlar. İki yaklaşım aynı 72 kayıtlık sınama kümesinde koşturulur ve her birinin elinde olan ayar tek tek çevrilir. Ölçülen şey hangisinin daha iyi olduğu değil, hangi kararın kimde olduğudur: kaç ayar var, kaçı sayıyı gerçekten oynatıyor, ve elde olmayan neyin ne kadar oynattığı.

  • YA9. Kurgu ve benzetici önceki dersten aynen sürer: 120 kurgu destek talebi, beş konu, tohum 20260218. Eğitim kümesi ilk 48 kayıt, sınama kümesi kalan 72 kayıttır. İki yaklaşım da aynı sınama kümesinde okunur.
  • YA10. Eğiten yaklaşımın modeli bir sayım tablosudur: eğitim kümesindeki her belirtecin hangi konuda kaç kez geçtiğini tutar ve toplam kanıtı en yüksek konuyu söyler. Öğrenen bir yordamdır ve ağırlıkları eğitimle belirlenir.
  • YA11. M27’nin denetimli öğrenme kursu ayar değişkenlerini (derinlik, en az yaprak, sınıf ağırlığı, ayar bütçesi) ölçtü. O yordam burada tekrarlanmaz; burada yalnız ayarın kimde olduğu sayılır.
  • YA12. Kullanan yaklaşım benzeticiyi çağırır ve modelin içine hiç dokunmaz. Sayım tablosu kurmaz, etiketli örnek görmez.
  • YA13. Bir ayarın “sayıyı oynattığı”, iki ucu arasındaki isabet farkının mutlak değerinin 0,0200’den büyük olması demektir. Eşik bir karardır ve sabit tutulur.
  • YA14. Tohum bir ayar değildir; benzeticinin belirsizliğinin ölçüsüdür. Tabloya elde olmayanın ne kadar oynattığını göstermek için konur.
  • YA15. Bedel sütunları yalnız kullanan yaklaşımda vardır, çünkü eğiten yaklaşımın bedeli çağrı ve belirteç değil etiketli örnektir. İki bedel birimi birbirine çevrilmez.

Eğiten Yaklaşımın Elindeki Ayarlar

Eğiten yaklaşımda model senin ürettiğin nesnedir. Elindeki ayarlar onun içine bakar: hangi veriyle kurulacağı, hangi birimle sayacağı, hangi kanıtı görmezden geleceği, seyrek gözlemi nasıl yumuşatacağı. Aşağıdaki blok benzeticiyi ve kurguyu kurar, sonra öğrenen yordamı yazıp dört ayarı iki uçta çevirir.

# BENZETICI. Bu kod gercek bir model uc noktasi cagirmaz; standart kitaplikla yazilmis
# bir dil modeli benzeticisidir. Destek talepleri de KURGU'dur.
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):
    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"]
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"}
SERBEST = ["talebiniz {k} konusuyla ilgili gorunuyor",
           "bu kayit {k} basligina girer , ilgili ekibe yonlendirildi",
           "kaydiniz alindi , konuyu inceleyip donus yapacagiz"]
SAYAC = [0]


def cagir(istem, tohum=TOHUM, sicaklik=0.6, en_uzun=EN_UZUN):
    SAYAC[0] += 1
    bel = belirtecle(istem)
    if len(bel) > PENCERE:
        return {"durum": "baglam_asimi", "giris": len(bel), "cikis": 0, "yanit": ""}
    if SAYAC[0] % 37 == 0:
        return {"durum": "hiz_siniri", "giris": len(bel), "cikis": 0, "yanit": ""}
    r = uretec(tohum ^ izno(istem))
    if len(bel) > 90 and r() < 0.04:
        return {"durum": "zaman_asimi", "giris": len(bel), "cikis": 0, "yanit": ""}
    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 bel:
        for tablo, w in ((IZ, 1.0), (TUZAK, 1.3)):
            if tablo.get(t) in p:
                p[tablo[t]] += w
    if sicaklik <= 0.0:
        k = max(sorted(p), key=lambda a: p[a])
    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 = k if "tek" in bel else SERBEST[ayrik(r(), [0.42, 0.26, 0.32])].format(k=k)
    cb = belirtecle(y)
    if len(cb) > en_uzun:
        cb = cb[:en_uzun]
        y = " ".join(cb)
    return {"durum": "tamam", "giris": len(bel), "cikis": len(cb), "yanit": y}


def oku(y):
    for s in y.lower().split():
        if s in KONU:
            return s
    return None


SIN = TALEP[48:]                                 # sinama kumesi: 72 kayit


def bol(m, damga):
    return belirtecle(m) if damga else m.lower().split()


def egit(kume, damga=True, enaz=1, duz=0.5):     # OGRENEN yordam: sayim tablosu
    sayim, siklik = {}, {}
    for x in kume:
        siklik[x["konu"]] = siklik.get(x["konu"], 0) + 1
        for t in bol(x["metin"], damga):
            c = sayim.setdefault(t, {})
            c[x["konu"]] = c.get(x["konu"], 0) + 1
    en = max(sorted(siklik), key=lambda k: siklik[k])

    def kestir(m):
        p = {k: 0.0 for k in KONU}
        for t in bol(m, damga):
            c = sayim.get(t, {})
            if sum(c.values()) < enaz:
                continue
            for k in KONU:
                p[k] += math.log((c.get(k, 0) + duz) / (siklik.get(k, 1) + 5 * duz))
        return max(sorted(p), key=lambda k: p[k]) if any(p.values()) else en
    return kestir


def isabet_e(n=48, **kw):
    f = egit(TALEP[:n], **kw)
    return sum(f(x["metin"]) == x["konu"] for x in SIN) / len(SIN)


print(f"{'EGITEN yaklasimin elindeki ayar':<31} {'A':>7} {'B':>7} {'oynama':>8}")
oy_e = []
for ad, a, b in (("egitim ornegi 8 / 48", {"n": 8}, {"n": 48}),
                 ("belirtec birimi sozcuk / parca", {"damga": False}, {"damga": True}),
                 ("en az siklik 3 / 1", {"enaz": 3}, {"enaz": 1}),
                 ("duzlestirme 0,05 / 0,50", {"duz": 0.05}, {"duz": 0.5})):
    va, vb = isabet_e(**a), isabet_e(**b)
    oy_e.append(abs(vb - va))
    print(f"{ad:<31} {va:>7.4f} {vb:>7.4f} {vb - va:>+8.4f}")
print(f"0,0200'den fazla oynatan: {sum(v > 0.02 for v in oy_e)}/{len(oy_e)}, "
      f"gereken etiketli ornek 48, degisen sey: sayim tablosunun kendisi")
EGITEN yaklasimin elindeki ayar       A       B   oynama
egitim ornegi 8 / 48             0.8194  0.9861  +0.1667
belirtec birimi sozcuk / parca   0.9583  0.9861  +0.0278
en az siklik 3 / 1               0.9028  0.9861  +0.0833
duzlestirme 0,05 / 0,50          0.9722  0.9861  +0.0139
0,0200'den fazla oynatan: 3/4, gereken etiketli ornek 48, degisen sey: sayim tablosunun kendisi

Dört ayardan üçü sayıyı eşiğin üstünde oynatıyor ve en büyük oynama etiketli örnek sayısından geliyor: sekiz örnekle 0,8194, kırk sekiz örnekle 0,9861. Bu, eğiten yaklaşımın hem gücü hem faturasıdır. Sayıyı yükseltmenin en etkili yolu daha çok etiketli örnektir, ve etiketli örnek üretilmesi gereken bir şeydir. Kalan üç ayar da modelin içine bakar: hangi birimle sayıldığı, hangi kanıtın atıldığı, seyrek gözlemin nasıl yumuşatıldığı. Hepsi elin altındadır ve hepsi modelin kendisini değiştirir.

Kullanan Yaklaşımın Elindeki Ayarlar

Kullanan yaklaşımda hiçbir ayar modelin içine bakmaz. Sayım tablosu yoktur, ağırlık yoktur, eğitim kümesi yoktur. Elde kalan şey çağrının çevresidir.

YONERGE = ("Talebi su etiketlerden birine ata: fatura , ariza , sayac , tarife , "
           "kesinti . Yanit olarak tek etiket yaz . Talep: ")


def olc_k(yonerge=YONERGE, sicaklik=0.6, tohum=TOHUM, deneme=0):
    SAYAC[0] = 0
    d = bel = 0
    for x in SIN:
        e = None
        for j in range(deneme + 1):
            s = cagir(yonerge + x["metin"], tohum=tohum + j, sicaklik=sicaklik)
            bel += s["giris"] + s["cikis"]
            e = oku(s["yanit"])
            if e is not None:
                break
        d += e == x["konu"]
    return d / len(SIN), SAYAC[0], bel


print(f"{'KULLANAN yaklasimin elindeki ayar':<31} {'A':>7} {'B':>7} {'oynama':>8} "
      f"{'cagri':>6} {'belirtec':>9}")
oy_k = []
for ad, a, b in (("etiket kumesi yok / var",
                  {"yonerge": "Su destek talebini yanitla: "}, {}),
                 ("bicim kisiti yok / var",
                  {"yonerge": YONERGE.replace("tek etiket", "bir cevap")}, {}),
                 ("dagilim sicakligi 0,6 / 0,0", {"sicaklik": 0.6}, {"sicaklik": 0.0}),
                 ("yeniden deneme 0 / 1", {"deneme": 0}, {"deneme": 1}),
                 ("tohum 20260218 / 20260219", {"tohum": TOHUM}, {"tohum": TOHUM + 1})):
    (va, ca, ba), (vb, cb, bb) = olc_k(**a), olc_k(**b)
    oy_k.append(abs(vb - va))
    print(f"{ad:<31} {va:>7.4f} {vb:>7.4f} {vb - va:>+8.4f} {cb - ca:>+6d} {bb - ba:>+9d}")
print(f"0,0200'den fazla oynatan: {sum(v > 0.02 for v in oy_k)}/{len(oy_k)}, "
      f"gereken etiketli ornek 0, degisen sey: modelin disindaki her sey")
KULLANAN yaklasimin elindeki ayar       A       B   oynama  cagri  belirtec
etiket kumesi yok / var          0.6667  0.8056  +0.1389     +0     +1090
bicim kisiti yok / var           0.5000  0.8056  +0.3056     +0      -634
dagilim sicakligi 0,6 / 0,0      0.8056  0.9028  +0.0972     +0        +7
yeniden deneme 0 / 1             0.8056  0.8056  +0.0000     +1       +51
tohum 20260218 / 20260219        0.8056  0.6806  -0.1250     +0        +6
0,0200'den fazla oynatan: 4/5, gereken etiketli ornek 0, degisen sey: modelin disindaki her sey

En büyük oynama biçim kısıtından geliyor: 0,5000’den 0,8056’ya, artış 0,3056. Bu satır aynı zamanda bedel sütununda eksi işaretli tek satırdır — 634 belirteç kazandırıyor. Modele “tek etiket yaz” demek hem isabeti yükseltiyor hem maliyeti düşürüyor, çünkü kısa yanıt ucuzdur. Etiket kümesini isteme yazmak da 0,1389 kazandırıyor ama bunun bedeli 1090 belirteçtir.

Dördüncü satır bu müfredatın ikinci iddiasını ilk kez ödüyor. Yeniden deneme sayıyı 0,0000 oynatıyor ve karşılığında bir fazla çağrı ile 51 belirteç istiyor. Yalın düzenekte okunamayan yanıt zaten kalmamıştı; yeniden deneme yalnız hız sınırına takılan tek isteği kurtarabilirdi ve o istek iki denemede de yanlış etiket verdi. Düzenek eklemek her zaman iyileştirmez, ama bedeli her zaman kesindir.

Beşinci satır ayar değil. Tohum senin ayarın değildir; benzeticinin belirsizliğidir ve bu tabloda sayıyı 0,1250 düşürüyor. Yani elinde olmayan bir şey, elinde olan üç ayardan ikisinden daha çok oynatıyor. Bir ürünün sayısını yükseltmek için harcanan emeğin bir kısmı, ölçümün kendisinin bu genişlikte oynadığını bilmeden harcanır.

Hangi Karar Kimde

İki listenin hiçbir maddesi ortak değildir. Aşağıdaki tablo bu ayrımı kararlar düzeyinde yazar.

Karar Eğiten yaklaşım Kullanan yaklaşım
Etiketli örnek toplamak zorunlu, sayıyı en çok oynatan ayar gerekmez, sıfır örnekle çalışır
Model ağırlığı üretilir ve saklanır görülmez, değiştirilemez
Görevin tanımı etiket kümesi eğitim verisinde durur etiket kümesi istem metnine yazılır
Çıktının biçimi yordamın dönüş tipi, kesindir istemle rica edilir, doğrulanması gerekir
Aynı girdiye aynı yanıt yordam gereği verilir verilmez, ölçülmesi gerekir
Sayı düştüğünde model yeniden eğitilir düzenek değiştirilir

Son satır sorumluluk sınırının kendisidir. Eğiten yaklaşımda bir bozulmanın adresi bellidir: veri ya da model. Kullanan yaklaşımda model bozulmaz, çünkü model senin değildir; bozulan şey ya istemdir, ya çıktının okunma yordamıdır, ya da bileşenin altındaki bir değişikliktir. Üçüncüsünde elinde tek bir şey kalır: yüzeyi ölçmüş olmak. Ölçülmüş bir yüzey, değişimin ne zaman olduğunu söyler; ölçülmemiş bir yüzey yalnız şikâyeti söyler.

Sayılar arasındaki 0,9861 ile 0,8056 farkı da bu çerçevede okunur. Eğiten yaklaşım daha yüksek sayı verdi, ama karşılığında 48 etiketli örnek istedi. Kullanan yaklaşım hiç etiketli örnek görmeden 0,8056 verdi. Kapalı bir etiket kümesi ve bol örneği olan bir görevde birincisi kazanır; etiket kümesi değişken, örnek pahalı ya da görev metin üretmeyi gerektiriyorsa soru tersine döner. Karşılaştırılan şey iki sayı değil, iki bedel birimidir.

Özet

  • Eğiten yaklaşımın dört ayarından üçü, kullanan yaklaşımın beş ayarından dördü sayıyı 0,0200’den fazla oynatıyor. İki listenin hiçbir maddesi ortak değildir.
  • Eğiten yaklaşımın en güçlü ayarı etiketli örnek sayısıdır: 8 örnekle 0,8194, 48 örnekle 0,9861. Kullanan yaklaşım sıfır etiketli örnekle 0,8056 veriyor.
  • Kullanan yaklaşımın en güçlü ayarı biçim kısıtıdır: +0,3056 ve 634 belirteç kazanç. Bedel sütununda eksi işaretli tek satır budur.
  • Yeniden deneme sayıyı 0,0000 oynatıp bir çağrı ve 51 belirteç ekliyor: düzenek eklemek her zaman iyileştirmez, ama bedeli her zaman kesindir.
  • Elde olmayan tohum sayıyı 0,1250 düşürüyor — elde olan üç ayardan ikisinden daha çok.
  • Sorumluluk sınırı son satırda okunur: sayı düştüğünde eğiten yaklaşım modeli, kullanan yaklaşım düzeneği değiştirir.

Sonraki Adım

Bu derste tohum satırı bir kez, tek bir sayıyla göründü ve orada bırakıldı. Oysa o satır bir ürünün en zor tasarım sorusudur: aynı kullanıcı, aynı ekranda, aynı metni iki kez gönderdiğinde iki ayrı yanıt alabilir. Toplam isabetin 0,8056’dan 0,6806’ya inmesi bunun yalnız toplam görünümüdür; kaç kayıtta yanıtın gerçekten değiştiği ve bu değişimin kullanıcıya görünen kısmının ne olduğu hiç sorulmadı. Sonraki ders aynı girdinin iki koşumunu kayıt kayıt sayar ve belirsizliği daraltan üç tasarım kararını — seçenek sunmak, biçim dayatmak, kaynağa bağlamak — isabet ve bedel olarak yan yana koyar.

İ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