İçeriğe geç
academia.sh

Ders 07 / 21

Çekişmeli Örnekler

Girdinin kasıtlı olarak bozulmasının ayrı bir yüzey olarak sayılması: aynı kural süzgeci dört sınıfta 1,0000 ile 0,8696 arasında duyarlılık verirken bozulmuş girdi sınıfında 0,2632'ye düşüyor ve bu sınıfta yakaladığı beş kaydın dördü başka bir sınıfın özniteliğini taşıdığı için yakalanıyor. Olağandışı damga dağılımı bayrağını kurala eklemek sınıf duyarlılığını 0,8421'e, küme duyarlılığını 0,7957'den 0,9140'a çıkarıyor; aynı adım kesinliği 0,7629'dan 0,7391'e düşürüyor ve yanlış engelleme payını 0,1565'ten 0,2041'e taşıyor. Model süzgeci aynı sınıfta 0,4737'de kalıyor, iki koşumda 0,4737 ile 0,4211 arasında oynuyor ve bu fark sınıfın çözünürlüğü olan 0,0526'ya eşit olduğu için bulgu sayılmıyor.

İçindekiler

Buraya kadar beş sınıf sayıldı: erişilen içerikten gelen dolaylı yönerge, gizli alan isteği, yetki aşımı, kaynak taklidi ve çıktı tarafında sızan alan. Beşi de sessizce aynı şeyi varsaydı: girdi bir şey söylüyor. Yönerge kipi bir cümlenin kipidir, gizli alan adı bir addır, kaynak damgası bir iddiadır. Savunma da bu varsayımın üstüne kuruldu — kural süzgeci metnin anlamına bağlanmış yapısal işaretleri okuyor.

Bir girdi hiçbir şey söylemeden de yüzey olabilir. Kasıtlı olarak bozulmuş bir girdi, savunmanın okuma biçimini hedefler: okuyan tarafın alışık olduğu düzenden sapar ve bu sapma anlamla ilgili değildir. Bu ders o sınıfı adıyla ekler ve tek bir soru sorar: aynı savunma bu sınıfta ne kadarını yakalıyor.

  • SY81. Kayıt kümesi, sınıflar, öznitelikler ve savunma kurgudur; gerçek bir model ya da süzgeç çağrılmaz. Tohum 20260218, ikinci koşum 20260219.
  • SY82. Saldırı bir metin değil bir öznitelik profilidir. Kayıtların metni tümüyle zararsız destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnız öznitelik profilinde durur.
  • SY83. Hiçbir bozma yordamı yazılmaz. Bozulmuş girdi sınıfı iki bayrakla temsil edilir: olagandisi_damga_dagilimi ve asiri_uzunluk. Bayrak bir işarettir, içerik değildir.
  • SY84. Koşan kodun tamamı savunma tarafındadır: sınıflandırma, süzgeç, sayım ve ölçü.
  • SY85. Çekişmeli örneğin kendisi Derin Öğrenme kursunda ele alındı; mimari ve dayanıklılık yordamı tekrarlanmaz. Burada ölçülen tek şey savunmanın bu sınıfta yakaladığı paydır.
  • SY86. Savunmasız taban her derste aynıdır: hiçbir süzgeç yok, durdurulan zararlı 0, yanlış alarm 0.
  • SY87. Kümenin çözünürlüğü ölçüm bandının alt sınırıdır: duyarlılığın adımı 1/93 = 0,0108, yanlış engelleme payının adımı 1/147 = 0,0068. Sınıf içinde adım daha büyüktür ve ayrıca yazılır.

Anlamlı Metin Varsayımı

İlk blok kursun ortak tanımını kurar. Kayıt kümesi 240 kurgu destek talebidir; her kaydın bir sınıfı, bir kaynağı ve yedi yapısal özniteliği vardır. Bu özniteliklerin hiçbiri çalışan bir yük değildir — hepsi birer bayraktır, ve kaydın taşıdığı metin sınıfından bağımsız olarak altı zararsız destek cümlesinden biridir. Bozulmuş girdi sınıfının profili öbürlerinden yapısal olarak ayrılır: yonerge_kipi payı 0,05, gizli_alan_adi payı 0,04 — yani kural süzgecinin okuduğu işaretlerin neredeyse hiçbiri yok. Buna karşılık olagandisi_damga_dagilimi payı 0,80 ve asiri_uzunluk payı 0,62.

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 Duyarlılık

Küme düzeyinde kural süzgecinin duyarlılığı 0,7957’dir ve bu tek sayı bir ortalamadır. Ortalamanın altında beş ayrı sınıf durur; ikinci blok aynı süzgeci sınıf sınıf çözer ve her satırın yanına o sınıfın kendi çözünürlüğünü yazar.

ZARARLI_SINIF = SINIF[1:]
print("sinif                kayit  yakalanan  duyarlilik  cozunurluk")
for s in ZARARLI_SINIF:
    alt = [k for k in KAYIT if k["sinif"] == s]
    d = sum(1 for k in alt if kural_suzgeci(k))
    print(f"{s:<20} {len(alt):>5} {d:>10} {d / len(alt):>11.4f} {1 / len(alt):>11.4f}")

bayrak = [k for k in KAYIT if k["ozellik"]["olagandisi_damga_dagilimi"]]
print("\nolagandisi_damga_dagilimi tasiyan kayit:", len(bayrak),
      " bunlarin zararli olani:", sum(1 for k in bayrak if zararli(k)),
      " bozulmus_girdi olani:", sum(1 for k in bayrak if k["sinif"] == "bozulmus_girdi"))
print("kural suzgecinin bozulmus_girdi sinifinda yakaladigi kayitlar:")
for k in KAYIT:
    if k["sinif"] == "bozulmus_girdi" and kural_suzgeci(k):
        print("  kayit", k["no"], "-", ", ".join(o for o in OZELLIK if k["ozellik"][o]))
sinif                kayit  yakalanan  duyarlilik  cozunurluk
dolayli_yonerge         24         24      1.0000      0.0417
gizli_alan_istegi       17         16      0.9412      0.0588
yetki_asimi             10          9      0.9000      0.1000
kaynak_taklidi          23         20      0.8696      0.0435
bozulmus_girdi          19          5      0.2632      0.0526

olagandisi_damga_dagilimi tasiyan kayit: 29  bunlarin zararli olani: 21  bozulmus_girdi olani: 15
kural suzgecinin bozulmus_girdi sinifinda yakaladigi kayitlar:
  kayit 27 - gizli_alan_adi, olagandisi_damga_dagilimi, asiri_uzunluk
  kayit 100 - yonerge_kipi, olagandisi_damga_dagilimi, asiri_uzunluk
  kayit 212 - kaynak_damgasi_uyusmuyor, olagandisi_damga_dagilimi, asiri_uzunluk
  kayit 227 - yan_etkili_arac_adi, olagandisi_damga_dagilimi, asiri_uzunluk
  kayit 236 - yan_etkili_arac_adi

Dört sınıf dar bir bantta duruyor: 1,0000, 0,9412, 0,9000 ve 0,8696. Beşincisi 0,2632. Aradaki uzaklık en yakın komşusunun altı katından fazladır ve hiçbir sınıfın çözünürlüğüyle açıklanamaz — en kaba adım yetki aşımı sınıfının 0,1000’idir, gözlenen fark 0,6064.

Son listenin söylediği şey orandan daha ağırdır. Kural süzgecinin bu sınıfta yakaladığı beş kaydın dördü gizli_alan_adi, yonerge_kipi, kaynak_damgasi_uyusmuyor ve yan_etkili_arac_adi taşıdığı için yakalanıyor; bunlar başka sınıfların işaretleridir ve bu kayıtlarda tesadüfen bulunuyorlar. Beşinci kayıt ise ikisini de taşımıyor: ne olağandışı damga dağılımı var ne aşırı uzunluk. Yani kural süzgeci bu sınıfta sınıfa özgü hiçbir şeyi yakalamıyor; 0,2632’nin tamamı yan bilgiden geliyor. Bir sınıfta ölçülen duyarlılık, savunmanın o sınıfı gördüğü anlamına gelmez.

Sayım satırı da bunu doğruluyor: kümede olagandisi_damga_dagilimi taşıyan 29 kayıt var, 21’i zararlı, 15’i bozulmuş girdi. Bayrak kümede duruyor ve okunmuyor.

Bayrağı Kurala Eklemek

Bayrak zaten kayıtta olduğuna göre çözüm görünürde tek satırlıktır: kural listesine eklenir. Üçüncü blok bunu yapar ve kursun kuralı gereği iki sayıyı birlikte basar. Aynı blok model temelli süzgeci iki koşumda çalıştırır; ikinci koşumda değişen tek şey tohumdur.

GENIS = ("yonerge_kipi", "gizli_alan_adi", "yan_etkili_arac_adi",
         "kaynak_damgasi_uyusmuyor", "olagandisi_damga_dagilimi")
TOHUM2 = 20260219


def kural_genis(k):
    return kural_suzgeci(k, GENIS)


def model_ikinci(k, esik=0.40):
    """Ayni model suzgeci, ikinci kosum: yalnizca tohum degisir."""
    p = sum(AGIRLIK[o] for o in OZELLIK if k["ozellik"][o]) + KAYNAK_EK[k["kaynak"]]
    r = uretec(TOHUM2 ^ izno(k["no"]))
    return min(max(p + (r() - 0.5) * 0.20, 0.0), 1.6) >= esik


KURULUM = (("savunmasiz taban", lambda k: False), ("kural", kural_suzgeci),
           ("kural + bayrak", kural_genis), ("model esik 0.40", model_suzgeci),
           ("model 2. kosum", model_ikinci))
print("kurulum           durdurulan  yanlis alarm  kacan  kesinlik  duyarlilik  yanlis engelleme")
for ad, karar in KURULUM:
    o = olc(KAYIT, karar)
    print(f"{ad:<17} {o['dp']:>10} {o['yp']:>13} {o['yn']:>6} {o['kesinlik']:>9.4f}"
          f" {o['duyarlilik']:>11.4f} {o['yanlis_engelleme_payi']:>17.4f}")

alt = [k for k in KAYIT if k["sinif"] == "bozulmus_girdi"]
print("\nbozulmus_girdi sinifinda duyarlilik (cozunurluk 1/19 = %.4f)" % (1 / len(alt)))
for ad, karar in KURULUM[1:]:
    d = sum(1 for k in alt if karar(k))
    print(f"  {ad:<17} {d:>2}/{len(alt)} = {d / len(alt):.4f}")
p = sorted(puan(k) for k in alt)
print("puan bandi: %.4f - %.4f  0.35 ile 0.50 arasinda kalan: %d kayit"
      % (p[0], p[-1], sum(1 for x in p if 0.35 <= x < 0.50)))
kurulum           durdurulan  yanlis alarm  kacan  kesinlik  duyarlilik  yanlis engelleme
savunmasiz taban           0             0     93    0.0000      0.0000            0.0000
kural                     74            23     19    0.7629      0.7957            0.1565
kural + bayrak            85            30      8    0.7391      0.9140            0.2041
model esik 0.40           77            20     16    0.7938      0.8280            0.1361
model 2. kosum            77            19     16    0.8021      0.8280            0.1293

bozulmus_girdi sinifinda duyarlilik (cozunurluk 1/19 = 0.0526)
  kural              5/19 = 0.2632
  kural + bayrak    16/19 = 0.8421
  model esik 0.40    9/19 = 0.4737
  model 2. kosum     8/19 = 0.4211
puan bandi: 0.0425 - 1.0132  0.35 ile 0.50 arasinda kalan: 9 kayit

Bayrağın eklenmesi sınıf duyarlılığını 0,2632’den 0,8421‘e çıkarıyor: yakalanan 5’ten 16’ya. Küme düzeyinde duyarlılık 0,7957’den 0,9140‘a, kaçan zararlı 19’dan 8’e iniyor. Öbür dört sınıfın tek bir satırı bile değişmiyor — kazancın tamamı tek sınıftadır ve bu, bayrağın gerçekten o sınıfı gördüğünün kanıtıdır.

Bedel aynı tabloda duruyor. Yanlış alarm 23’ten 30‘a çıkıyor, kesinlik 0,7629’dan 0,7391‘e düşüyor, yanlış engelleme payı 0,1565’ten 0,2041’e taşınıyor. Yedi temiz kayıt fazladan engelleniyor, çünkü temiz sınıfın profilinde de bu bayrak 0,04 payla var: iyi niyetli bir destek talebi de alışılmadık bir damga dağılımı taşıyabilir. On bir zararlı kazanıldı, yedi temiz kayıt kaybedildi. Bu iki sayı birlikte yazılmadıkça savunma ölçülmemiş sayılır; tek başına “duyarlılık 0,9140” cümlesi kurulumun neye mal olduğunu gizler. Takasın değip değmediği kümenin verebileceği bir sayı değildir: on bir zararlının yedi temiz kayda değip değmediği, engellenen kaydın kime ait olduğuna ve engellenince ne olduğuna bağlıdır. Küme yalnız oranı söyler, kararı değil.

Model temelli süzgecin aynı sınıftaki sayısı ayrı bir şey söylüyor. 0,4737, kural süzgecinin iki katı ama genişletilmiş kuralın yarısı. Nedeni puan bandındadır: bu sınıfın iki bayrağının ağırlığı 0,30 ve 0,12, toplamı 0,42 ve eşik 0,40. Dokuz kayıt 0,35 ile 0,50 arasında, yani eşiğin bir tutamlık uzağında duruyor. Bir sınıfın bütün ağırlığı eşiğin hemen üstüne düştüğünde süzgeç o sınıfı ayırmıyor, yazı tura atıyor.

İki Koşum ve Sınıfın Çözünürlüğü

İkinci koşumda tek değişen tohumdur ve küme düzeyinde duyarlılık aynı kalıyor: iki koşumda da 0,8280. Yanlış alarm 20’den 19’a iniyor, yani kesinlik 0,7938’den 0,8021’e çıkıyor. Bu fark bir kayıt büyüklüğündedir ve yanlış engelleme payının adımı 0,0068 olduğuna göre ölçülebilir sınırın hemen üstündedir; ama bir savunma iyileştirmesi değildir, aynı süzgecin gürültüsüdür.

Sınıf içinde durum daha keskindir. Bozulmuş girdi sınıfında model süzgeci birinci koşumda 0,4737, ikinci koşumda 0,4211 veriyor. Fark tam olarak bir kayıttır ve sınıfın çözünürlüğü 1/19 = 0,0526’dır. Yani gözlenen fark, kümenin bu sınıfta ölçebileceği en küçük adıma eşittir ve bulgu sayılamaz. Aynı savunmanın bu sınıftaki sayısı hakkında söylenebilecek en dürüst cümle şudur: 0,42 ile 0,47 arasında bir yerdedir ve küme onu daha ince ayıramaz. Kural süzgeci ile genişletilmiş kural bu sorunu hiç yaşamaz — ikisi de gürültüsüzdür, koşumdan koşuma aynı sayıyı verir ve bu, aynı zamanda koşumdan bağımsız ölçü olmalarını sağlar.

Özet

  • Bozulmuş girdi, anlam taşımadan da yüzey oluşturan bir sınıftır; ders içinde çalışan bir bozma yordamı değil, olagandisi_damga_dagilimi ve asiri_uzunluk bayrakları kullanılır.
  • Kural süzgecinin duyarlılığı dört sınıfta 1,0000 ile 0,8696 arasındayken bozulmuş girdi sınıfında 0,2632’ye düşer; bu sınıfta yakaladığı beş kaydın dördü başka sınıfların işaretini taşıdığı için yakalanır, biri hiçbir bozulma bayrağı taşımaz.
  • Bayrağı kurala eklemek sınıf duyarlılığını 0,8421’e, küme duyarlılığını 0,9140’a çıkarır; aynı adım yanlış alarmı 23’ten 30’a, yanlış engelleme payını 0,1565’ten 0,2041’e taşır ve kesinliği 0,7629’dan 0,7391’e düşürür.
  • Model süzgeci bu sınıfta 0,4737’de kalır, çünkü sınıfın toplam ağırlığı 0,42 eşiğin 0,40 hemen üstündedir ve dokuz kayıt 0,35 ile 0,50 arasına sıkışır.
  • İki koşum arasındaki sınıf içi fark 0,4737 ile 0,4211’dir; sınıfın çözünürlüğü 0,0526 olduğu için bu fark bulgu değildir. Kural temelli iki kurulum gürültüsüzdür ve koşumdan bağımsız ölçü verir.

Sonraki Adım

Bu ders bir sınıfı adıyla ekledi ve savunmanın o sınıfta neredeyse kör olduğunu gösterdi. Kör noktayı kapatan şey bir buluş değildi: bayrak zaten kayıttaydı, kural listesinde yoktu. Buradan rahatsız edici bir soru çıkar. Bu sınıf, ancak birisi bakmayı akıl ettiği için sayıldı. Kaç sınıf hiç bakılmadığı için sayılmadı ve savunmanın onlardaki payı nedir. Sonraki ders bu soruyu bir yordam olarak değil bir sayım olarak ele alır: bir deneme kampanyasının kaç sınıfı kapsadığı, her sınıfta savunmayı geçen payın ne olduğu ve kapsanmayan bir sınıfın raporda hangi sayıyla göründüğü ölçü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