İçeriğe geç
academia.sh

Ders 10 / 21

İçerik Denetimi

Zararlı içeriği durdurmakla ona bir sınıf adı koymanın ayrı iki iş olduğunun sayılması: sınıf adı üreten bir denetim ikili okumada 0,9355 duyarlılık ve 0,7311 kesinlik veriyor, ama sınıf başına bakıldığında kesinlik 0,2917 ile 0,6364 arasında, sınıf etiketinin duyarlılığı 0,3333 ile 0,8235 arasında dağılıyor; dolaylı yönerge sınıfında denetim 21 kayda etiket koyup 8'ini doğru biliyor ve 9 tümüyle temiz kaydı aynı etiketle işaretliyor, yani sınıf etiketi bir eyleme bağlandığında eylem doğrudan çok yanlış tetikleniyor ve o sınıfta savunma taban altında kalıyor; bozulmuş girdi sınıfının duyarlılığı 0,2632'den 0,8421'e çıkarken yanlış engelleme payı 0,1565'ten 0,2177'ye yükseliyor.

İçindekiler

Bir önceki dersin bütün sayıları tek bir karardan okundu: durdur ya da geçir. Kural süzgeci 93 zararlının 74’ünü durdurdu, 23 temiz kaydı engelledi ve ortalama duyarlılığı 0,7957 çıktı. Aynı tablonun son sütunu ise kaçan 19 kaydın 14’ünün tek bir sınıftan geldiğini gösterdi. Ortalama sayı bu yığılmayı taşımıyordu.

Bir savunma yalnız durdurmakla kalmayıp kayda hangi zararlı olduğunu da söylerse iki şey birden değişir. Birincisi, süzgeç kaçırdığı sınıfa bakan bir kural kazanabilir. İkincisi ve daha önemlisi, ölçü tek bir çift sayı olmaktan çıkar: her sınıf için ayrı bir kesinlik ve ayrı bir duyarlılık yazılabilir. Bu ders o ayrımı kurar ve ortalamanın neyi sakladığını sayar.

  • SV8. Kayıt kümesi, sınıflar, öznitelikler ve içerik denetimi kurgudur; gerçek bir model uç noktası çağrılmaz. Tohum 20260218, ikinci koşum 20260219.
  • SV9. Bu bir saldırı dersi değildir. Koşan kodun tamamı savunma tarafındadır: sınıflandırma, süzgeç ve sayım. Çalışan bir saldırı, yük ya da atlatma yordamı yazılmaz.
  • SV10. Saldırı bir metin değil bir öznitelik profilidir. Kayıtların metin alanı altı sıradan destek talebinden birine eşittir ve sınıfla hiçbir ilişkisi yoktur; denetim de o metni okumaz, yalnızca yapısal öznitelikleri okur.
  • SV11. Taban çizgisi savunmasız kurulumdur: hiçbir süzgeç ya da denetim yok, durdurulan zararlı 0, yanlış alarm 0, üretilen sınıf etiketi 0.
  • SV12. İçerik denetimi tek bir sınıf adı döndürür; öncelik sırası kurgudur ve bir kaydın birden çok özniteliği varsa yalnız en öndeki sınıf yazılır.
  • SV13. Model değerlendirmenin ve alt grup çözümlemesinin genel yordamı Denetimli Öğrenme ile Model Değerlendirme, Yorumlanabilirlik ve Etik kurslarında ölçüldü ve burada tekrarlanmaz; bu ders yalnız savunma sınıfı başına okumayı ekler.
  • SV14. Sınıf başına oranın adımı o sınıfın boyutudur ve kümenin genel adımından büyüktür: en küçük sınıfta 0,1000, en büyük zararlı sınıfta 0,0417. Bütün zararlılar üzerinden duyarlılığın adımı 0,0108, yanlış engelleme payının adımı 0,0068.

Sınıf Adı Üreten Savunma

Birinci blok kursun ortak tanımını kurar: kayıt kümesi, sınıflar, kural süzgeci, model temelli süzgeç ve ölçü. Kayıtların taşıdığı altı destek cümlesinin hangi sınıfa düştüğü rastlantısaldır; sınıf bilgisi yalnızca PROFIL sözlüğünde, yani her sınıfın hangi yapısal özniteliği hangi olasılıkla taşıdığında durur.

# KURGUDUR. Kayit kumesi, siniflar, ozellikler ve savunma katmanlari ders icinde
# tanimlanir; gercek bir model uc noktasi cagrilmaz.
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


# ---- KURGU kayitlar: saldiri METNI yazilmaz, saldiri bir OZELLIK PROFILIDIR
SINIF = ["temiz", "dolayli_yonerge", "gizli_alan_istegi", "yetki_asimi",
         "kaynak_taklidi", "bozulmus_girdi"]
KAYNAK = ["kullanici", "erisilen_belge", "arac_ciktisi"]
# Ozellikler yapisaldir; hicbiri calisan bir yuk degildir.
OZELLIK = ["yonerge_kipi", "rol_degistirme_istegi", "gizli_alan_adi", "yan_etkili_arac_adi",
           "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi", "asiri_uzunluk"]
# Sinif basina ozellik olasiligi (kurgu). Temiz kayitlarda da dusuk paylar var:
# gercek dunyada iyi niyetli metin de bu ozellikleri tasiyabilir.
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;
# sinif bilgisi yalnizca ozellik profilinde durur.
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"


# ---- SAVUNMA 1: kural suzgeci (yapisal, aciklanabilir)
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)


# ---- SAVUNMA 2: model temelli suzgec (puan + esik)
AGIRLIK = {"yonerge_kipi": 0.42, "rol_degistirme_istegi": 0.26, "gizli_alan_adi": 0.44,
           "yan_etkili_arac_adi": 0.40, "kaynak_damgasi_uyusmuyor": 0.38,
           "olagandisi_damga_dagilimi": 0.30, "asiri_uzunluk": 0.12}
KAYNAK_EK = {"kullanici": 0.00, "erisilen_belge": 0.18, "arac_ciktisi": 0.12}


def puan(k):
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(TOHUM ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


def model_suzgeci(k, esik=0.40):
    return puan(k) >= esik


# ---- OLCU: durdurulan ve yanlislikla durdurulan birlikte yazilir
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}

Sınıf Başına Kesinlik ve Duyarlılık

İçerik denetimi kural süzgecinden iki noktada ayrılır. Bir sınıf adı döndürür ve bir öznitelik daha okur: damga dağılımı. Öncelik sırası, her sınıfın kendi ayırt edici özniteliğini en öne koyacak biçimde kurulmuştur. İkinci blok önce denetimin ikili okumasını basar — “temiz değil” demek durdurmak sayılırsa hangi sayı çıkıyor — sonra aynı kararı sınıf sınıf açar.

def icerik_denetimi(k):
    """Savunma: kayda bir sinif adi atar. Hicbir saldiri metni okunmaz;
    yalnizca yapisal oznitelikler oncelik sirasiyla degerlendirilir."""
    o = k["ozellik"]
    if o["gizli_alan_adi"]:
        return "gizli_alan_istegi"
    if o["yan_etkili_arac_adi"]:
        return "yetki_asimi"
    if o["kaynak_damgasi_uyusmuyor"]:
        return "kaynak_taklidi"
    if o["olagandisi_damga_dagilimi"]:
        return "bozulmus_girdi"
    if o["yonerge_kipi"] or o["rol_degistirme_istegi"]:
        return "dolayli_yonerge"
    return "temiz"


ikili = olc(KAYIT, lambda k: icerik_denetimi(k) != "temiz")
print("ikili okuma, 'temiz degil' demek durdurmak sayilirsa:")
print(f"  dp {ikili['dp']}  yp {ikili['yp']}  yn {ikili['yn']}"
      f"  kesinlik {ikili['kesinlik']}  duyarlilik {ikili['duyarlilik']}"
      f"  yanlis engelleme {ikili['yanlis_engelleme_payi']}")
print()
print(f"{'sinif':<20}{'n':>4}{'atanan':>7}{'dogru':>6}{'yanlis sinif':>13}"
      f"{'temiz':>6}{'kesinlik':>10}{'duyarlilik':>12}{'adim':>8}")
for s in SINIF[1:]:
    g = [k for k in KAYIT if k["sinif"] == s]
    a = [k for k in KAYIT if icerik_denetimi(k) == s]
    d = sum(1 for k in a if k["sinif"] == s)
    ys = sum(1 for k in a if zararli(k) and k["sinif"] != s)
    tz = sum(1 for k in a if not zararli(k))
    print(f"{s:<20}{len(g):>4}{len(a):>7}{d:>6}{ys:>13}{tz:>6}"
          f"{d / len(a):>10.4f}{d / len(g):>12.4f}{1 / len(g):>8.4f}")
tm = [k for k in KAYIT if icerik_denetimi(k) == "temiz"]
dt = sum(1 for k in tm if not zararli(k))
print(f"{'temiz':<20}{147:>4}{len(tm):>7}{dt:>6}{len(tm) - dt:>13}{'-':>6}"
      f"{dt / len(tm):>10.4f}{dt / 147:>12.4f}{1 / 147:>8.4f}")
print()
print("temiz denip gecen zararlinin siniflari:",
      {s: sum(1 for k in tm if k["sinif"] == s) for s in SINIF[1:]
       if sum(1 for k in tm if k["sinif"] == s)})
ikili okuma, 'temiz degil' demek durdurmak sayilirsa:
  dp 87  yp 32  yn 6  kesinlik 0.7311  duyarlilik 0.9355  yanlis engelleme 0.2177

sinif                  n atanan dogru yanlis sinif temiz  kesinlik  duyarlilik    adim
dolayli_yonerge       24     21     8            4     9    0.3810      0.3333  0.0417
gizli_alan_istegi     17     32    14            9     9    0.4375      0.8235  0.0588
yetki_asimi           10     24     7           14     3    0.2917      0.7000  0.1000
kaynak_taklidi        23     22    14            4     4    0.6364      0.6087  0.0435
bozulmus_girdi        19     20    12            1     7    0.6000      0.6316  0.0526
temiz                147    121   115            6     -    0.9504      0.7823  0.0068

temiz denip gecen zararlinin siniflari: {'gizli_alan_istegi': 1, 'yetki_asimi': 1, 'kaynak_taklidi': 1, 'bozulmus_girdi': 3}

Ortalamanın Gizlediği

İlk iki satır kursun bu ana kadarki en iyi duyarlılığını gösterir: 0,9355. Savunmasız tabanda durdurulan zararlı 0 iken denetim 93 zararlının 87’sini işaretliyor ve yalnızca 6’sını kaçırıyor. Bir savunmanın tek satırla bildirileceği yer burasıdır ve bu satır yanlıştır — daha doğrusu, söylediği şey doğru ama sorulan sorunun yanıtı değildir. Bir içerik denetiminden beklenen şey kaydın durdurulması değil, ne olduğunun söylenmesidir; durdurma zaten kural süzgecinin işiydi.

Sınıf tablosu aynı kararı adıyla açar ve tek bir oran kalmaz. Sınıf etiketinin duyarlılığı 0,3333 ile 0,8235 arasında, kesinliği 0,2917 ile 0,6364 arasında dağılıyor. İki sınıf öne çıkıyor.

gizli_alan_istegi sınıfının duyarlılığı 0,8235 ile en yükseği, ama kesinliği 0,4375: denetim bu etiketi 32 kayda koyuyor, yalnızca 14’ü gerçekten o sınıftan. Etiket, sırf öncelik sırasında en önde durduğu için, gizli alan adı taşıyan her kaydı kendine çekiyor — 9 tanesi başka bir zararlı sınıftan, 9 tanesi tümüyle temiz.

yetki_asimi daha keskin: 24 kayda etiket konuyor, 7’si doğru, 14’ü başka bir zararlı sınıftan. Bu satır bir uyarı taşır — durdurma kararı bu 14 kayıtta doğrudur, çünkü hepsi gerçekten zararlıdır; yanlış olan yalnızca ada verilen karardır. Bir savunmanın sınıf kesinliği 0,2917 olabilir ve aynı savunma ikili okumada iyi görünebilir. Durdurmak ile adını koymak iki ayrı iştir ve iki ayrı sayıyla ölçülür.

Son satır bedeli yazar: denetim 147 temiz kaydın 121’ini temiz sayıyor, geri kalan 32’sine bir zararlı sınıf adı koyuyor. Yanlış engelleme payı 0,2177, yani kural süzgecinin 0,1565’inden dokuz çözünürlük adımı yüksek. Kaçan 6 zararlının yarısı yine bozulmuş girdi sınıfındandır.

Sınıf Başına Duyarlılık, Üç Savunma

Aynı sınıf ayrımı önceki dersin iki süzgecine de uygulanabilir. Üçüncü blok dört sütun basar: kural süzgeci, model temelli süzgeç, aynı model süzgecinin ikinci koşumu ve içerik denetiminin ikili kararı. Burada ölçülen şey sınıf etiketi değil, kaydın işaretlenip işaretlenmediğidir.

def puan_ikinci(k):
    """Ayni model, ikinci kosum: yalnizca gurultunun tohumu degisir."""
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(20260219 ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6)


print(f"{'sinif':<20}{'n':>4}{'kural':>10}{'model 0,50':>12}"
      f"{'2. kosum':>10}{'denetim':>9}{'adim':>8}")
zararlilar = [k for k in KAYIT if zararli(k)]
for s in SINIF[1:]:
    g = [k for k in KAYIT if k["sinif"] == s]
    say = [sum(1 for k in g if f(k)) / len(g)
           for f in (kural_suzgeci, lambda k: model_suzgeci(k, 0.50),
                     lambda k: puan_ikinci(k) >= 0.50,
                     lambda k: icerik_denetimi(k) != "temiz")]
    print(f"{s:<20}{len(g):>4}{say[0]:>10.4f}{say[1]:>12.4f}"
          f"{say[2]:>10.4f}{say[3]:>9.4f}{1 / len(g):>8.4f}")
say = [sum(1 for k in zararlilar if f(k)) / len(zararlilar)
       for f in (kural_suzgeci, lambda k: model_suzgeci(k, 0.50),
                 lambda k: puan_ikinci(k) >= 0.50,
                 lambda k: icerik_denetimi(k) != "temiz")]
print(f"{'ortalama':<20}{len(zararlilar):>4}{say[0]:>10.4f}{say[1]:>12.4f}"
      f"{say[2]:>10.4f}{say[3]:>9.4f}{1 / len(zararlilar):>8.4f}")
print()
print("yanlis engelleme payi:",
      {"kural": olc(KAYIT, kural_suzgeci)["yanlis_engelleme_payi"],
       "model 0,50": olc(KAYIT, lambda k: model_suzgeci(k, 0.50))["yanlis_engelleme_payi"],
       "denetim": ikili["yanlis_engelleme_payi"]})
sinif                  n     kural  model 0,50  2. kosum  denetim    adim
dolayli_yonerge       24    1.0000      0.9583    0.9583   1.0000  0.0417
gizli_alan_istegi     17    0.9412      0.7059    0.7059   0.9412  0.0588
yetki_asimi           10    0.9000      0.8000    0.8000   0.9000  0.1000
kaynak_taklidi        23    0.8696      0.8261    0.8261   0.9565  0.0435
bozulmus_girdi        19    0.2632      0.2105    0.3684   0.8421  0.0526
ortalama              93    0.7957      0.7097    0.7419   0.9355  0.0108

yanlis engelleme payi: {'kural': 0.1565, 'model 0,50': 0.0544, 'denetim': 0.2177}

Taban Altında Kalan Sınıf

Kural süzgecinin 0,7957’lik ortalaması dört sınıfta 0,8696 ile 1,0000 arasındadır ve beşincisinde 0,2632. Ortalama, dört iyi sayının bir kötü sayıyı taşımasıdır; okuyan taraf hangi sınıfın korunmadığını bu satırdan bilemez. Denetim o sınıfı 0,8421’e çıkarıyor, çünkü kural kümesinin bakmadığı damga dağılımını okuyor — ama bedeli aynı satırda: yanlış engelleme payı 0,1565’ten 0,2177’ye, engellenen temiz kayıt 23’ten 32’ye çıkıyor.

Bozulmuş girdi satırı ikinci koşumla birlikte okunmalıdır. Model süzgecinin bu sınıftaki duyarlılığı iki koşumda 0,2105 ile 0,3684 arasında oynuyor; fark 0,1579, yani o sınıfın çözünürlüğünün üç adımı. Öbür dört sınıfta fark tam olarak sıfırdır. En zayıf sınıf aynı zamanda en oynak sınıftır ve o sınıfın tek koşumla bildirilen sayısı bir sayı değil bir banttır.

Şimdi kursun kuralının en sert uygulaması. dolayli_yonerge sınıfında denetim 21 kayda bu etiketi koyuyor; 8’i doğru, 4’ü başka bir zararlı sınıftan, 9’u tümüyle temiz. Sınıf etiketi bir eyleme bağlıysa — o sınıfa özgü bir uyarı, bir yeniden yazma, bir insan incelemesi — eylem bu kümede 8 kez doğru, 13 kez yanlış tetiklenir ve yanlışların 9’unda karşı tarafta gerçek bir abone vardır. Savunmasız tabanda bu eylem hiç tetiklenmez: ne doğru ne yanlış. Yanlış tetiklemenin bedeli doğru tetiklemenin kazancından küçük değilse, bu sınıfta savunma tabanın altındadır. Doğru etiket 8 ile temiz kayda konan etiket 9 arasındaki fark tek bir kayıttır ve başka bir çekimde işaret değiştirebilir; okunabilir olan şey oranın bire yakın olmasıdır.

Aynı sınıfın ikili sütunda 1,0000 yazması bu tabloyu tamamlar. Denetim dolaylı yönerge sınıfının tamamını durduruyor ve üçte birine doğru adı koyuyor. Tek bir oran bildirilseydi hangisi yazılırdı sorusunun yanıtı, savunmanın ne için kurulduğuna bağlıdır — ve bu yüzden ikisi de yazılır.

Özet

  • Sınıf adı üreten içerik denetimi ikili okumada 87 zararlı durdurur, 32 temiz kaydı engeller: kesinlik 0,7311, duyarlılık 0,9355, yanlış engelleme payı 0,2177.
  • Aynı denetimin sınıf etiketi çok daha zayıftır: sınıf kesinliği 0,2917 ile 0,6364, sınıf duyarlılığı 0,3333 ile 0,8235 arasında dağılır. Durdurmak ile adını koymak iki ayrı iştir.
  • Kural süzgecinin 0,7957’lik ortalaması dört sınıfta 0,8696’nın üstündedir ve bozulmuş girdi sınıfında 0,2632’dir; denetim o sınıfı 0,8421’e çıkarır, yanlış engelleme payı 0,1565’ten 0,2177’ye yükselir.
  • Bozulmuş girdi sınıfı iki koşumda 0,2105 ile 0,3684 arasında oynar, yani sınıf çözünürlüğünün üç adımı; öbür dört sınıfta fark sıfırdır.
  • Dolaylı yönerge sınıfında etiket 21 kayda konur, 8’i doğrudur ve 9’u tümüyle temiz kayda düşer; sınıf etiketi bir eyleme bağlıysa eylem doğrudan çok yanlış tetiklenir ve savunma o sınıfta tabanın altında kalır.

Sonraki Adım

İki derste savunma kaydın tamamı üzerinde karar verdi: geçir, durdur ya da bir sınıf adı koy. Üçünde de kayıt bölünmez bir bütün sayıldı. Oysa bir kaydın modele gitmesi gereken kısmı ile gitmemesi gereken kısmı ayrılabilir: abone kimliği, iletişim bilgisi, adres ve erişim dizgesi çıkarılıp geri kalanı gönderilebilir. Bu, hiçbir kaydı engellemeyen bir savunmadır ve bu yüzden yanlış alarmı yoktur — ölçüsü de başka bir yerden okunmalıdır. Sonraki ders maskelemenin kaç kaydı temizlediğini ve kaç görevin gerektirdiği alanı sildiğini sayar.

İ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