---
title: 'Çekişmeli Örnekler'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/cekismeli-ornekler'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:33+00:00'
license: 'CC BY-SA 4.0'
---

# Ç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.

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.

```python
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.

```python
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.

```python
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.
