Ders 16 / 21
Otomatik Değerlendirme
Bir kaydın zararlı olduğunu kimin söylediğinin iki yolla ölçülmesi: yapısal ölçüt yazmak ve bir dil modeline sormak. Ölçüt temelli yaklaşım 0,7629 kesinlik, 0,7957 duyarlılık ve insan etiketiyle 0,8250 uyum veriyor, hiçbir çağrı yapmıyor ve iki koşumda birebir aynı sayıyı basıyor. Model hakem 0,7876 kesinlik, 0,9570 duyarlılık ve 0,8833 uyum veriyor; kazancın tamamı ölçütlerin hiç bakmadığı bozulmuş girdi sınıfından geliyor (0,2632'ye karşı 1,0000). Bedel 246 çağrı, 10779 giriş belirteci ve hakemin kendi belirsizliğidir: iki koşum arasında 16 kayıtta karar değişiyor, duyarlılık üç adım oynuyor ve iki yaklaşımın yanlış engelleme farkı bu bandın çok altında kalıyor.
İçindekiler
Bir önceki ders aynı savunmayı üç ayrı kümede ölçtü ve her kararın doğruluğunu kaydın gerçek sınıfına bakarak belirledi. O sınıf sütunu hazır verilmişti. Üretimde böyle bir sütun yoktur: yeni gelen bir kaydın zararlı olup olmadığını birinin söylemesi gerekir ve bunu her kayıt için insan eliyle yapmak, ölçümü kayıt sayısı kadar pahalı hâle getirir.
Otomatik değerlendirmenin iki yolu vardır. Birincisi ölçüt temelli yaklaşımdır: hangi yapısal belirtinin zararlı sayılacağı elle yazılır ve karar bir kural kümesinden okunur. İkincisi model hakem yaklaşımıdır: kayıt bir dil modeline verilir ve etiketi o söyler. Bu ders ikisini yan yana koyar ve ikisine de aynı iki soruyu sorar: verdikleri etiket insan etiketiyle ne kadar uyuşuyor, ve aynı kayda iki kez sorulduğunda kaç kararı değişiyor.
- DG9. Kayıt kümesi, sınıflar ve ölçü bir önceki dersteki gibi kurulur ve kurgudur. Saldırı bir metin değil, bir öznitelik profilidir; kayıtların metni zararsız destek talepleridir ve sınıfla ilgisizdir.
- DG10. Bu derste insan etiketi kaydın gerçek sınıfıdır ve sağlam kabul edilir. Etiketin kendisinin ne kadar sağlam olduğu sonraki dersin konusudur.
- DG11. Ölçüt temelli yaklaşım kural süzgecidir: dört yapısal bayrağa bakar, hiçbir model çağırmaz. Örtüşme temelli alan ölçütleri M27’nin Makine Öğrenmesi kursunda, doğal dil işleme derslerinde ölçüldü ve burada tekrarlanmaz; bu ders yalnız model hakem yaklaşımını ekler.
- DG12. Model hakem bir dil modeli benzeticisidir; gerçek bir model uç noktası çağrılmaz. Benzetici M28’in Yapay Zekâ Mühendisliğine Giriş kursunda kurulan yüzeyi taşır: belirteç sayımı, bağlam penceresi, hız sınırı, durdurma koşulu ve tohuma bağlı belirsizlik.
- DG13. Hakemin gördüğü şey kaydın bayrak listesi, kaynağı, numarası ve metnidir; metnin sınıfla ilgisi yoktur.
- DG14. Hakemin ön eğilimi temiz yönündedir (taban 0,75’e 0,15), çünkü trafiğin çoğunluğu temizdir.
- DG15. Hakemin iz tablosunda bir yanıltıcı bağ vardır: aşırı uzunluk zayıf bir belirtidir ama ağır sayılır. Dışarıdan giderilemez.
- DG16. Yanıt okunamazsa bir kez yeniden denenir; ikinci denemede de okunamazsa kayıt temiz sayılır.
- DG17. Uyum, kararın insan etiketiyle örtüştüğü kayıt payıdır. Bedel çağrı sayısı ve giriş belirteci olarak yazılır; süre yazılmaz.
Hakemin Kurulması
Hakem, kaydın bayrak listesini ve kaynağını bir isteme yazar ve tek etiket ister. Aşağıdaki blok bir önceki dersin kayıt kümesini ve ölçüsünü aynen kurar, sonra benzeticiyi ve hakemi tanımlar.
# KURGUDUR. Kayitlar, siniflar ve savunmalar ders icinde uretilir; hicbir gercek # kurum, urun ya da sistem yoktur. Saldiri bir METIN degil, bir OZELLIK PROFILIDIR. TOHUM, M32 = 20260218, 0xFFFFFFFF 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 izno(m): h = 2166136261 for c in str(m): h = ((h ^ ord(c)) * 16777619) & M32 return h SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi", "kaynak_taklidi", "bozulmus_girdi"] KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"] OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"] PROFIL = { "temiz": [0.06, 0.02, 0.05, 0.03, 0.02, 0.04, 0.05], "dolayli_yonerge": [0.88, 0.42, 0.10, 0.30, 0.35, 0.08, 0.12], "gizli_alan_istegi": [0.35, 0.15, 0.86, 0.12, 0.10, 0.06, 0.08], "yetki_asimi": [0.30, 0.25, 0.12, 0.84, 0.14, 0.05, 0.07], "kaynak_taklidi": [0.22, 0.55, 0.08, 0.10, 0.82, 0.07, 0.06], "bozulmus_girdi": [0.05, 0.03, 0.04, 0.03, 0.06, 0.80, 0.62], } KAYNAK_PAYI = { "temiz": [0.72, 0.20, 0.08], "dolayli_yonerge": [0.05, 0.70, 0.25], "gizli_alan_istegi": [0.55, 0.30, 0.15], "yetki_asimi": [0.40, 0.35, 0.25], "kaynak_taklidi": [0.10, 0.60, 0.30], "bozulmus_girdi": [0.65, 0.20, 0.15], } # Kurgu, tumuyle zararsiz destek metinleri. Sinifla iliskisi YOKTUR. METIN = ["bu ayki fatura tutari gecen aya gore yuksek geldi", "sayac endeksi yanlis girilmis olabilir", "mahallede kesinti ne zaman bitecek", "tarife basamagimi ogrenmek istiyorum", "ariza kaydim icin ekip ne zaman gelir", "adres degisikligi nasil yapilir"] KAYIT = [] for i in range(240): r = uretec(TOHUM + 6151 * i) s = SINIF[ayrik(r(), [0.62, 0.10, 0.07, 0.07, 0.07, 0.07])] kaynak = KAYNAK[ayrik(r(), KAYNAK_PAYI[s])] oz = {o: (r() < p) for o, p in zip(OZELLIK, PROFIL[s])} KAYIT.append({"no": i + 1, "sinif": s, "kaynak": kaynak, "ozellik": oz, "metin": METIN[int(r() * len(METIN))], "uzunluk": 40 + int(r() * 260)}) def zararli(k): return k["sinif"] != "temiz" def kural_suzgeci(k, kurallar=("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi", "kaynak_damgasi_uyusmuyor")): return any(k["ozellik"][o] for o in kurallar) def olc(kayitlar, karar): dp = yp = dn = yn = 0 for k in kayitlar: isaret, gercek = karar(k), zararli(k) if isaret and gercek: dp += 1 elif isaret and not gercek: yp += 1 elif not isaret and gercek: yn += 1 else: dn += 1 kesinlik = dp / (dp + yp) if dp + yp else 0.0 duyarlilik = dp / (dp + yn) if dp + yn else 0.0 return {"dp": dp, "yp": yp, "yn": yn, "dn": dn, "kesinlik": round(kesinlik, 4), "duyarlilik": round(duyarlilik, 4), "yanlis_engelleme_payi": round(yp / (yp + dn), 4) if yp + dn else 0.0} import math PENCERE, EN_UZUN = 240, 24 # baglam penceresi, en buyuk cikti 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 ETIKET = ["temiz", "zararli"] TABAN = {"temiz": 0.75, "zararli": 0.15} # hakemin on egilimi temiz yonundedir BAYRAK = {"yonerge_kipi": "yonerge", "rol_degistirme_istegi": "roldegisimi", "gizli_alan_adi": "gizlialan", "yan_etkili_arac_adi": "yanetkiliarac", "kaynak_damgasi_uyusmuyor": "damgauyusmazligi", "olagandisi_damga_dagilimi": "dagilimbozuklugu", "asiri_uzunluk": "asiriuzunluk"} KAYNAK_ADI = {"kullanici": "kullanici", "erisilen_belge": "belge", "arac_ciktisi": "aracciktisi"} IZ = {"yoner": "zararli", "gizli": "zararli", "yanet": "zararli", "damga": "zararli", "rolde": "zararli", "dagil": "zararli", "yok": "temiz"} TUZAK = {"asiri": "zararli"} # yaniltici bag: asiri uzunluk zayif kanittir SERBEST = ["kayit {k} gorunuyor", "bu kaydi {k} sayiyorum", "degerlendirme tamamlandi"] SAYAC = [0] def cagir(istem, tohum=TOHUM, sicaklik=0.30, en_uzun=EN_UZUN, iz=IZ, tuzak=TUZAK): """KURGU dil modeli benzeticisi; gercek bir model uc noktasi cagirmaz.""" 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)) p = dict(TABAN) 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]) # 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 = 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: # durdurma kosulu 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 ETIKET: return s return None YONERGE = ("Su kaydin ozniteliklerine bak ve tek etiket yaz : temiz ya da zararli . " "Oznitelikler : ") def istem_kur(k, yonerge=YONERGE): ad = " ".join(BAYRAK[o] for o in OZELLIK if k["ozellik"][o]) or "yok" return (yonerge + ad + " . kaynak " + KAYNAK_ADI[k["kaynak"]] + " . kayit " + str(k["no"]) + " : " + k["metin"]) def hakem(kayitlar, tohum=TOHUM, sicaklik=0.30, yonerge=YONERGE, iz=IZ, tuzak=TUZAK): """Her kayda bir kez sorar; etiket okunamazsa bir kez yeniden dener.""" SAYAC[0] = 0 karar, yd, bos, g = {}, 0, 0, 0 for k in kayitlar: istem = istem_kur(k, yonerge) s = cagir(istem, tohum, sicaklik, iz=iz, tuzak=tuzak) g += s["giris"] e = oku(s["yanit"]) if e is None: yd += 1 s = cagir(istem, tohum + 1, sicaklik, iz=iz, tuzak=tuzak) g += s["giris"] e = oku(s["yanit"]) if e is None: bos += 1 e = "temiz" karar[k["no"]] = e return karar, {"cagri": SAYAC[0], "yeniden": yd, "okunamayan": bos, "giris": g} ornek = KAYIT[1] c = cagir(istem_kur(ornek)) print("kayit %d , gercek sinif %s\n istem: %s\n durum %s , giris %d belirtec , yanit %s" % (ornek["no"], ornek["sinif"], istem_kur(ornek), c["durum"], c["giris"], c["yanit"]))
kayit 2 , gercek sinif kaynak_taklidi istem: Su kaydin ozniteliklerine bak ve tek etiket yaz : temiz ya da zararli . Oznitelikler : roldegisimi damgauyusmazligi . kaynak belge . kayit 2 : mahallede kesinti ne zaman bitecek durum tamam , giris 46 belirtec , yanit zararli
İstemin gövdesinde çalışan hiçbir şey yoktur. Kayıt iki bayrak taşıyor, kaynağı erişilen bir belge, metni bir kesinti sorusu. Metnin sınıfla ilgisi olmadığı için hakemin kanıtı yalnız bayrak listesidir: hakeme gösterilen şey bir saldırı metni değil, bir öznitelik profilidir.
Uyum, Bedel ve İki Koşum
İkinci blok iki yaklaşımı aynı iki yüz kırk kayıtta koşturur, hakemi iki ayrı tohumla iki kez çağırır ve sınıf başına duyarlılığı döker.
def uyum(karar): """Insan etiketiyle uyum: kararin gercek sinifla ortustugu kayit payi.""" return sum(1 for k in KAYIT if karar(k) == zararli(k)) / len(KAYIT) k1, b1 = hakem(KAYIT, TOHUM) k2, b2 = hakem(KAYIT, TOHUM + 1) def karar1(k): return k1[k["no"]] == "zararli" def karar2(k): return k2[k["no"]] == "zararli" print(f"{'yaklasim':<24} {'kesinlik':>9} {'duyarlilik':>11} {'yanlis eng.':>12}" f" {'uyum':>7} {'cagri':>6} {'belirtec':>9}") for ad, karar, b in (("olcut temelli", kural_suzgeci, {"cagri": 0, "giris": 0}), ("model hakem , kosum 1", karar1, b1), ("model hakem , kosum 2", karar2, b2)): o = olc(KAYIT, karar) print(f"{ad:<24} {o['kesinlik']:>9.4f} {o['duyarlilik']:>11.4f}" f" {o['yanlis_engelleme_payi']:>12.4f} {uyum(karar):>7.4f}" f" {b['cagri']:>6} {b['giris']:>9}") d = sum(1 for k in KAYIT if k1[k["no"]] != k2[k["no"]]) o1, o2 = olc(KAYIT, karar1), olc(KAYIT, karar2) print(f"\nhakemin kendi iki kosum farki: {d} kayitta karar degisti ({d / len(KAYIT):.4f})") for ad, a, bb in (("kesinlik", o1["kesinlik"], o2["kesinlik"]), ("duyarlilik", o1["duyarlilik"], o2["duyarlilik"]), ("yanlis engelleme", o1["yanlis_engelleme_payi"], o2["yanlis_engelleme_payi"])): print(f" {ad:<18} {a:.4f} -> {bb:.4f} , fark {bb - a:+.4f}") print(f"olcut temelli yaklasimda ayni fark: {0.0:+.4f} (hicbir model cagrilmiyor)") print(f"yeniden deneme {b1['yeniden']} (hiz siniri) , okunamayan yanit {b1['okunamayan']}") print(f"\n{'sinif':<20} {'kayit':>6} {'olcut duyarlilik':>17} {'hakem duyarlilik':>17}") for s in SINIF[1:]: K = [k for k in KAYIT if k["sinif"] == s] a = sum(1 for k in K if kural_suzgeci(k)) / len(K) h = sum(1 for k in K if karar1(k)) / len(K) print(f"{s:<20} {len(K):>6} {a:>17.4f} {h:>17.4f}") tk = [k for k in KAYIT if not zararli(k)] print(f"{'temiz (yanlis alarm)':<20} {len(tk):>6}" f" {sum(1 for k in tk if kural_suzgeci(k)) / len(tk):>17.4f}" f" {sum(1 for k in tk if karar1(k)) / len(tk):>17.4f}")
yaklasim kesinlik duyarlilik yanlis eng. uyum cagri belirtec olcut temelli 0.7629 0.7957 0.1565 0.8250 0 0 model hakem , kosum 1 0.7876 0.9570 0.1633 0.8833 246 10779 model hakem , kosum 2 0.7478 0.9247 0.1973 0.8500 246 10779 hakemin kendi iki kosum farki: 16 kayitta karar degisti (0.0667) kesinlik 0.7876 -> 0.7478 , fark -0.0398 duyarlilik 0.9570 -> 0.9247 , fark -0.0323 yanlis engelleme 0.1633 -> 0.1973 , fark +0.0340 olcut temelli yaklasimda ayni fark: +0.0000 (hicbir model cagrilmiyor) yeniden deneme 6 (hiz siniri) , okunamayan yanit 0 sinif kayit olcut duyarlilik hakem duyarlilik dolayli_yonerge 24 1.0000 1.0000 gizli_alan_istegi 17 0.9412 0.8824 yetki_asimi 10 0.9000 0.9000 kaynak_taklidi 23 0.8696 0.9565 bozulmus_girdi 19 0.2632 1.0000 temiz (yanlis alarm) 147 0.1565 0.1633
İlk tabloya bakan biri hakemi seçer. Duyarlılık 0,7957’den 0,9570’e, insan etiketiyle uyum 0,8250’den 0,8833’e çıkıyor ve yanlış engelleme payı neredeyse aynı kalıyor. İki sayı birlikte yazıldığında bile tablo hakemin lehinedir: bir tek fazladan temiz kaydı engelliyor.
Kazanç Nereden Geliyor
Sınıf dökümü bu kazancın kaynağını tek satırda gösteriyor. bozulmus_girdi sınıfında ölçüt
temelli yaklaşımın duyarlılığı 0,2632, hakemin duyarlılığı 1,0000. Neden sorusunun
cevabı modelin zekâsında değil, ölçütlerin kapsamındadır: kural süzgecinin dört kuralı bu
sınıfın taşıdığı iki bayrağı hiç okumaz. Hakem yedi bayrağın hepsini görür. Yani ölçüt
temelli yaklaşımın kaybı bir tasarım eksiğidir ve bir kural eklenerek kapatılabilir; hakemin
kazancı “daha iyi düşünmek” değil, daha geniş kanıt görmektir.
Ters yönde bir satır da vardır. gizli_alan_istegi sınıfında hakem 0,8824 ile ölçüt temelli
yaklaşımın 0,9412’sinin altında kalıyor. Fark on yedi kayıtlık bir sınıfta tek bir kayıttır
ve o sınıfın çözünürlüğü zaten 1/17 = 0,0588. Fark tam bir adımdır, yani bulgu sayılamaz.
Bedel sütunu ikinci yarıyı yazar. Ölçüt temelli yaklaşım sıfır çağrı ve sıfır belirteç harcar; hakem iki yüz kırk kayıt için 246 çağrı ve 10779 giriş belirteci, ve altı fazla çağrının hepsi hız sınırına takılıp yeniden denenen isteklerdir. Kümeyi büyütmek bu bedeli doğrusal büyütür.
Hakemin Kendi Belirsizliği
Asıl sınırlama ikinci tablodadır. Aynı hakem, aynı istemler, tek değişen tohum: 16 kayıtta karar değişiyor, yani kararların 0,0667 payı koşumdan koşuma oynuyor. Duyarlılık 0,9570’ten 0,9247’ye iniyor; fark 0,0323, kümenin duyarlılık adımının üç katı. Yanlış engelleme payı 0,1633’ten 0,1973’e çıkıyor; fark 0,0340, adımın beş katı.
Bu band, hakemle ölçülebilecek her farkın alt sınırıdır. İki yaklaşımın duyarlılık farkı 0,1613, bandın beş katından büyüktür ve gerçek bir farktır. Yanlış engelleme farkı ise 0,0068, yani tek bir kayıt, ve hakemin bandı bunun beş katıdır: “hakem biraz daha fazla temiz kaydı engelliyor” cümlesi bu kümede ölçülmüş bir iddia değildir.
Ölçüt temelli yaklaşımın aynı satırı +0,0000’dır: hiçbir model çağırmadığı için bandı sıfırdır ve tek bir kayıtlık farkı bile raporlayabilir. Seçim bu yüzden yalnız isabet karşılaştırması değildir; biri daha yüksek duyarlılık verir, öbürü daha ince ayrım yapar.
Özet
- Otomatik değerlendirmenin iki yolu aynı kümede karşılaştırıldı: ölçüt temelli yaklaşım 0,7629 kesinlik ve 0,7957 duyarlılıkla insan etiketine 0,8250 uyuyor, model hakem 0,7876 ve 0,9570 ile 0,8833 uyuyor.
- Hakemin kazancının tamamı
bozulmus_girdisınıfından geliyor: 0,2632’ye karşı 1,0000. Neden ölçütlerin kapsamıdır, modelin yeteneği değil. - Ters yöndeki tek satır
gizli_alan_istegisınıfındaki 0,0588’lik farktır ve bu, on yedi kayıtlık sınıfın tam bir adımıdır; bulgu sayılmaz. - Bedel çağrı ve belirteçtir: ölçüt temelli yaklaşım 0 çağrı ve 0 belirteç, hakem 246 çağrı ve 10779 giriş belirteci; altı çağrı hız sınırından gelen yeniden denemedir.
- Hakemin kendi iki koşum farkı 16 kayıttır; duyarlılık üç, yanlış engelleme payı beş adım oynuyor. İki yaklaşımın yanlış engelleme farkı (0,0068) bu bandın çok altındadır ve ölçülmüş sayılmaz. Ölçüt temelli yaklaşımın bandı sıfırdır.
Sonraki Adım
Bu dersin her satırı bir varsayıma dayandı: insan etiketi doğrudur. Hakemin uyumu o etikete göre hesaplandı, ölçüt temelli yaklaşımın duyarlılığı o etikete göre çıktı, sınıf dökümü o etiketle bölündü. Ama o etiket de bir yerden geldi ve onu üreten süreç en az bir dil modeli kadar oynaktır. Sonraki ders sütunun kendisini ölçer: aynı kayıtlara bakan üç değerlendirici kaç kayıtta aynı şeyi söylüyor, sorulan sorunun ölçeği ve verilen yönerge bu uyumu ne kadar oynatıyor, ve uyumsuzluk hangi sınıfta toplanıyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.