---
title: 'Geri Bildirim Döngüsü'
source: 'https://academia.sh/tr/kurslar/yz-guvenlik-ve-degerlendirme/geri-bildirim-dongusu'
course: 'Yapay Zekâ Güvenliği ve Değerlendirme'
language: tr
updated: '2026-08-17T18:06:34+00:00'
license: 'CC BY-SA 4.0'
---

# Geri Bildirim Döngüsü

Kullanıcı sinyalinin değerlendirmeye döndüğünde niçin yanlı döndüğünün ölçülmesi: eşik 0,50 kurulumunda 74 kayıt engelleniyor, 8'i yanlış alarm ve 27 zararlı kaçıyor; kaçan zararlının 0,6296'sı şikâyet üretiyor ama yanlış alarmın kapsanan payı itiraz kanalı kapalıyken 0,0000, dar bir itiraz kanalıyla 0,3750'dir ve gelen altı itirazın yalnız üçü gerçek yanlış alarmdır. Sinyalden okunan iki sayıyla beş tur ayarlanan eşik 0,50'den 0,30'a iniyor: yanlış alarm 8'den 27'ye, yanlış engelleme payı 0,0544'ten 0,1837'ye çıkıyor, duyarlılık 0,7097'den 0,9032'ye yükseliyor ve döngü yalnız ikincisini görüyor. Toplam hata 35'ten 36'ya gidiyor, yani döngü hatayı azaltmıyor, kimin ödediğini değiştiriyor.

Bir önceki derste gösterge iki kaynaktan hesaplandı: her istek için tutulan iz kaydından ve
engellenen kayıtların üçte birinin insan incelemesinden. İkincisi pahalıdır — üç yüz kayıtta otuz
iki inceleme. Bedava görünen üçüncü bir kaynak vardır: kullanıcının kendisi. Yanıtı beğenmediğini
söyler, düzeltme gönderir, aynı soruyu yeniden sorar. Bu sinyal değerlendirme kümesine dönebilir ve
bir sonraki turun savunmasını ayarlayabilir.

Sorulmayan şey şudur: **bu sinyali kim gönderebiliyor.** Engellenen kullanıcı yanıtı hiç görmez;
gördüğü tek şey bir engelleme iletisidir ve söyleyecek yeri yoktur. Döngüye yalnızca geçenlerin
sesi ulaşır. Bu ders sinyalin kapsadığı payı ve yanlılığın yönünü ölçer, sonra o sinyalle beş tur
ayarlanan bir savunmanın ne olduğunu sayar.

- **DG57.** Kayıtlar, sınıflar, savunma ve sinyal **kurgudur**. Kayıtların metni tümüyle zararsız
  destek talepleridir ve sınıfla hiçbir ilişkisi yoktur; sınıf yalnızca yapısal öznitelik
  profilinde durur. Küme kursun **240 kaydı**, **93 zararlı** ve **147 temiz**.
- **DG58.** Üretimde kurulu savunma **model süzgeci, eşik 0,50**'dir. Savunmasız taban hiçbir
  süzgeç, işaretleme ya da kapı içermez.
- **DG59.** Geçen kayıtta kullanıcı yanıtı görür: kaydı zararlı olanların **0,55**'i, temiz
  olanların **0,04**'ü şikâyet üretir. Şikâyet payının zararlıda yüksek olması, kötü yanıtın
  görülmesindendir.
- **DG60.** Engellenen kullanıcı **şikâyet üretemez**. İtiraz kanalı **kapalı** ya da **dar**dır;
  dar kanalda yanlışlıkla engellenen temiz kaydın **0,25**'i, doğru engellenen zararlı kaydın
  **0,05**'i itiraz eder.
- **DG61.** Döngünün kuralı: sinyalden okunan iki sayıdan büyük olan yönde eşik **0,05** oynatılır.
  Döngü gerçek etiketleri **görmez**; etiketli sütunlar yalnızca ölçüm içindir.
- **DG62.** Kümenin çözünürlüğü: duyarlılığın adımı **1/93 = 0,0108**, yanlış engelleme payının
  adımı **1/147 = 0,0068**. İki koşum tohum **20260218** ve **20260219** ile alınır.

## Sinyalin Kapsadığı Pay

İlk blok kursun ortak tanımını kurar ve üzerine sinyal modelini ekler. Koşan her işlev savunma
tarafındadır.

```python
# KURGUDUR. Kayitlarin metni tumuyle zararsiz destek talepleridir ve sinifla
# hicbir iliskisi yoktur; sinif yalnizca yapisal ozellik profilinde durur.
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],
}
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"


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


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}


# ---- KULLANICI SINYALI (kurgu). Engellenen kullanici yaniti hic gormez:
# ona yalnizca dar bir itiraz kanali aciktir , o da acilmissa.
ESIK = 0.50                                    # uretimde kurulu savunma
SIKAYET_Z, SIKAYET_T = 0.55, 0.04              # gecen kaydin sikayet payi
ITIRAZ_T, ITIRAZ_Z = 0.25, 0.05                # engellenen kaydin itiraz payi


def sinyal(k, engellendi, tohum, kanal):
    r = uretec(tohum ^ izno(("sinyal", k["no"])))
    if engellendi:
        if not kanal:
            return None
        return "itiraz" if r() < (ITIRAZ_T if not zararli(k) else ITIRAZ_Z) else None
    return "sikayet" if r() < (SIKAYET_Z if zararli(k) else SIKAYET_T) else None


def dongu_turu(esik, tohum, kanal):
    """Bir tur: savunma kosar , sinyal toplanir. Sinif etiketi yalniz olcum icindir."""
    kr = {k["no"]: model_suzgeci(k, esik) for k in KAYIT}
    m = olc(KAYIT, lambda k: kr[k["no"]])
    s = [sinyal(k, kr[k["no"]], tohum, kanal) for k in KAYIT]
    sayi = {"itiraz": sum(x == "itiraz" for x in s), "sikayet": sum(x == "sikayet" for x in s),
            "dogru_itiraz": sum(1 for k, x in zip(KAYIT, s) if x == "itiraz" and not zararli(k)),
            "dogru_sikayet": sum(1 for k, x in zip(KAYIT, s) if x == "sikayet" and zararli(k)),
            "kapsam": sum(x is not None for x in s)}
    return m, sayi


t = olc(KAYIT, lambda k: model_suzgeci(k, ESIK))
print(f"savunmasiz taban: engellenen 0 , yanlis alarm 0 , kacan zararli {t['dp'] + t['yn']}")
print(f"esik {ESIK:.2f}: engellenen {t['dp'] + t['yp']} , yanlis alarm {t['yp']} ,"
      f" kacan zararli {t['yn']}")
print("\ntohum     kanal   sikayet(dogru)  itiraz(dogru)  kapsanan yn  kapsanan yp  kapsam")
for tohum in (TOHUM, 20260219):
    for ad, kanal in (("kapali", False), ("dar", True)):
        m, s = dongu_turu(ESIK, tohum, kanal)
        print(f"{tohum}  {ad:<7} {s['sikayet']:>7} ({s['dogru_sikayet']:>2})"
              f" {s['itiraz']:>9} ({s['dogru_itiraz']}) {s['dogru_sikayet'] / m['yn']:>12.4f}"
              f" {s['dogru_itiraz'] / m['yp']:>12.4f} {s['kapsam'] / len(KAYIT):>12.4f}")
```

```
savunmasiz taban: engellenen 0 , yanlis alarm 0 , kacan zararli 93
esik 0.50: engellenen 74 , yanlis alarm 8 , kacan zararli 27

tohum     kanal   sikayet(dogru)  itiraz(dogru)  kapsanan yn  kapsanan yp  kapsam
20260218  kapali       20 (17)         0 (0)       0.6296       0.0000       0.0833
20260218  dar          20 (17)         6 (3)       0.6296       0.3750       0.1083
20260219  kapali       25 (18)         0 (0)       0.6667       0.0000       0.1042
20260219  dar          25 (18)         8 (3)       0.6667       0.3750       0.1375
```

Savunmasız tabanda hiç kimse susturulmaz: hiçbir kayıt engellenmediği için sinyal kanalı herkese
açıktır ve yanlış alarm zaten sıfırdır. **Yanlılık savunmanın kendisinden doğar.** Eşik 0,50
kurulumunda 74 kayıt engellenir, bunların 8'i yanlış alarmdır ve o sekiz kullanıcı yanıtı hiç
görmemiştir.

Kapsanan pay iki tarafta apayrıdır. Kaçan 27 zararlının **0,6296**'sı şikâyet üretiyor. Yanlış alarm
tarafında kanal kapalıyken pay **0,0000**, dar kanalla **0,3750**. Sinyalin toplam kapsamı
0,0833 ile 0,1375 arasında: on kayıttan ancak biri döngüye bir şey söylüyor. Dar kanalın kendisi de
temiz bir ölçü değil — gelen 6 itirazın yalnız **3'ü** gerçek yanlış alarmdır, çünkü doğru
engellenen 66 kayıt yanlış engellenen 8 kaydı sayıca ezer. **Yanlış alarmı arayan sinyalin kesinliği
0,50'dir.**

## Beş Tur Ayarlama

İkinci blok sinyalden okunan iki sayıyla eşiği oynatır ve her turda gerçek sayıları yanına yazar.

```python
# Dongunun kurali: sinyalden okunan iki sayidan buyuk olan yonde adim atilir.
# Dongu gercek etiketleri GORMEZ; asagidaki gercek sutunlari yalniz olcum icindir.
ADIM, TUR, TABAN_ESIK = 0.05, 5, 0.50


def dongu(tohum, kanal, tur_sayisi=TUR):
    esik, satir = TABAN_ESIK, []
    for _ in range(tur_sayisi):
        m, s = dongu_turu(esik, tohum, kanal)
        satir.append((esik, m, s))
        if s["sikayet"] > s["itiraz"]:
            esik = round(esik - ADIM, 2)          # daha cok engelle
        elif s["itiraz"] > s["sikayet"]:
            esik = round(esik + ADIM, 2)          # daha az engelle
    return satir


print("tohum 20260218")
print("  kanal   tur  esik  gercek yp  gercek yn  yanlis eng.  duyarlilik  sikayet  itiraz")
for ad, kanal in (("kapali", False), ("dar", True)):
    for i, (e, m, s) in enumerate(dongu(TOHUM, kanal)):
        print(f"  {ad:<7} {i + 1:>3} {e:>5.2f} {m['yp']:>10} {m['yn']:>10}"
              f" {m['yanlis_engelleme_payi']:>12.4f} {m['duyarlilik']:>11.4f}"
              f" {s['sikayet']:>8} {s['itiraz']:>7}")

print("\ntohum 20260219: esik yolu ayni , sinyal sayilari farkli")
for ad, kanal in (("kapali", False), ("dar", True)):
    d = dongu(20260219, kanal)
    print(f"  {ad:<7} sikayet {[s['sikayet'] for _, _, s in d]}"
          f"  itiraz {[s['itiraz'] for _, _, s in d]}")

print("\nesik   yp+yn  (etiketli okuma , donguye kapali)")
for e in (0.50, 0.45, 0.40, 0.35, 0.30):
    m = olc(KAYIT, lambda k, e=e: model_suzgeci(k, e))
    print(f"{e:.2f} {m['yp'] + m['yn']:>7}")
```

```
tohum 20260218
  kanal   tur  esik  gercek yp  gercek yn  yanlis eng.  duyarlilik  sikayet  itiraz
  kapali    1  0.50          8         27       0.0544      0.7097       20       0
  kapali    2  0.45         15         20       0.1020      0.7849       16       0
  kapali    3  0.40         20         16       0.1361      0.8280       14       0
  kapali    4  0.35         23         12       0.1565      0.8710       11       0
  kapali    5  0.30         27          9       0.1837      0.9032       10       0
  dar       1  0.50          8         27       0.0544      0.7097       20       6
  dar       2  0.45         15         20       0.1020      0.7849       16       6
  dar       3  0.40         20         16       0.1361      0.8280       14       6
  dar       4  0.35         23         12       0.1565      0.8710       11      10
  dar       5  0.30         27          9       0.1837      0.9032       10      11

tohum 20260219: esik yolu ayni , sinyal sayilari farkli
  kapali  sikayet [25, 20, 18, 16, 14]  itiraz [0, 0, 0, 0, 0]
  dar     sikayet [25, 20, 18, 16, 14]  itiraz [8, 8, 9, 10, 11]

esik   yp+yn  (etiketli okuma , donguye kapali)
0.50      35
0.45      35
0.40      36
0.35      35
0.30      36
```

## Yanlılığın Yönü

Kanal kapalıyken itiraz sütunu beş turun beşinde de sıfırdır. Döngü bunu "yanlış alarm yok" diye
okur ve her turda aynı yöne bir adım daha atar. Beş turun sonunda eşik 0,50'den 0,30'a inmiş, yanlış
alarm 8'den **27'ye** çıkmış, yanlış engelleme payı 0,0544'ten **0,1837**'ye yükselmiştir. İkisi de
kümenin çözünürlüğünün çok üstünde: yanlış engelleme payının adımı 0,0068, gözlenen değişim onun
on dokuz katı. Döngünün gördüğü tek sayı olan şikâyet ise 20'den 10'a inmiştir, yani döngü kendi
ölçütünde her turda **iyileşme** raporlamıştır.

Aynı tabloda duyarlılık 0,7097'den 0,9032'ye çıkıyor ve bu gerçek bir kazançtır. Kursun kuralı tam
burada devreye girer: **durdurduğu pay ile yanlışlıkla durdurduğu pay birlikte yazılmayan savunma
ölçülmemiş sayılır.** Döngü ikinci payı yazamaz, çünkü o payı ödeyen kullanıcıların kanalı yoktur.
Son tablo bunu tek satırda özetliyor: toplam hata beş eşikte 35, 35, 36, 35, 36'dır. Döngü hatayı
azaltmadı; **kimin ödediğini değiştirdi** ve ödeyeni göremediği için bunu bir iyileşme olarak
kaydetti.

Dar kanal bir ölçü değil, bir frendir. Beşinci turda itiraz 11, şikâyet 10 olur ve döngü ilk kez
ters yöne dönecektir. Ama o noktada yanlış alarm zaten **3,4 katına** çıkmıştır: fren üç tur geç
tutuyor. İkinci koşum bu okumayı bozmuyor — eşik yolu iki tohumda birebir aynı, yalnız sinyal
sayıları değişiyor (şikâyet 20 yerine 25, itiraz 6 yerine 8). **Kararı yeniden üretilebilir, sayıları
değil.** Kapsanan pay okunurken çözünürlük de yazılmalıdır: yanlış alarm tarafının paydası sekiz
kayıttır, adımı 0,1250'dir ve 0,3750 bu adımdan yalnız üç basamaktır.

Yanlılığın kaynağı sinyalin kalitesi değil, **kanalın geometrisidir**. Geçen kayıt kullanıcıya bir
yanıt gösterir ve yanıt kötüyse söyleyecek bir şey doğar; engellenen kayıt hiçbir yanıt göstermez ve
söylenecek şeyin kendisi oluşmaz. Bu yüzden kaçan zararlı tarafının kapsanan payı yanlış alarm
tarafınınkinin dar kanalda 1,68 katı, kapalı kanalda sonsuz katıdır. Bunu düzelten şey daha çok
sinyal toplamak değildir: yanlış alarm tarafının tek yansız okuması bir önceki dersin **örneklenmiş
insan incelemesidir** ve bedeli üç yüz kayıtta otuz iki incelemedir. Bedava sinyal, ücretli ölçünün
yerine geçmez.

Bu ders kursun ikinci iddiasının bir örneğidir. Eklenen şey bir süzgeç değil, bir **denetim
düzeneğidir**: savunmayı kullanıcıdan gelen veriyle ayarlayan bir döngü. Hiçbir yeni zararlı sınıfı
yakalamadı, yanlış alarmı 3,4 katına çıkardı ve bunu kendi göstergesinde göremedi.

## Özet

- Yanlılık savunmadan doğar: savunmasız tabanda kimse engellenmediği için kanal herkese açıktır,
  eşik 0,50'de sekiz kullanıcı yanıtı hiç görmez ve söyleyecek yeri olmaz.
- Kaçan zararlının 0,6296'sı sinyal üretir, yanlış alarmın kapsanan payı kanal kapalıyken 0,0000,
  dar kanalla 0,3750'dir; toplam kapsam on kayıtta birdir.
- Dar kanalın kesinliği de düşüktür: altı itirazın üçü gerçek yanlış alarmdır, çünkü doğru
  engellenen 66 kayıt yanlış engellenen 8 kaydı sayıca ezer.
- Sinyalle beş tur ayarlanan eşik 0,50'den 0,30'a iner; yanlış alarm 8'den 27'ye, yanlış engelleme
  payı 0,0544'ten 0,1837'ye çıkar, döngü ise her turda iyileşme raporlar.
- Toplam hata 35 ile 36 arasında kalır: döngü hatayı azaltmaz, kimin ödediğini değiştirir.

## Sonraki Adım

Yedi derste ölçüldü, izlendi ve ayarlandı. Bütün bu sayılar şimdiye kadar **içeride** kaldı: kümeyi
kuran, göstergeyi okuyan ve eşiği oynatan aynı ekiptir. Sistemi kullanan, ona veri veren ve
engellendiğinde itiraz edecek yeri olmayan taraf hiçbirini görmedi. Bir sistemin dışarıya ne
söylediği, hangi ölçüyü yayımladığı, hangisini yayımlamadığı ve yayımlamadığı ölçünün ne anlama
geldiği hiç sorulmadı. Son ders bunu ölçer: bir sistem kartının taşıdığı sayılar, taşımadığı sayılar
ve taşımadığı her sayının bir iddia olarak kalması.
