---
title: 'Aktör–Eleştirmen Yöntemleri'
source: 'https://academia.sh/tr/kurslar/pekistirmeli-ve-oneri/aktor-elestirmen-yontemleri'
course: 'Pekiştirmeli Öğrenme ve Öneri Sistemleri'
language: tr
updated: '2026-08-17T18:10:16+00:00'
license: 'CC BY-SA 4.0'
---

# Aktör–Eleştirmen Yöntemleri

Seçen ile değerlendiren bileşenin birlikte eğitilmesinin ve birbirini bozmasının ölçülmesi: 240 bölümlük aynı bütçede ham getiri 0,01 adımıyla 15,840 ve 19,962, sabit değer çizgisi 22,866 ve 22,190, öğrenilen eleştirmenin üstünlük kestirimi 21,154 ve 21,100 veriyor. Öğrenme adımı 0,06'ya çıkarıldığında tam getiriye dayanan iki yöntem bozuluyor — sabit değer çizgisinin bir koşumu 0,029 ile hiç ekip çıkarmama tabanına düşüyor, bandı 15,953 — üstünlük ise 23,401 ve 23,755 ile bandı 0,354'te tutuyor. Eleştirmenin öğrenme adımı 0,50'ye çıkarıldığında değerler 10 üzeri 102 mertebesine ıraksıyor, aktör tek bir eyleme yığılıyor, beş abonenin dördü hiç ziyaret edilmiyor ve getiri -18,772'ye iniyor.

Önceki ders taban çıkarmanın eğim kestirimini uzlaştırdığını ölçtü, ama çıkarılan taban kaba bir
listeydi: aynı politikanın ayrı bölümlerinden okunan adım adım ortalama getiri. Durumu hiç
kullanmıyordu. Otuzuncu adımda beş abonesi de bekleyen bir durumla hepsi yeni ziyaret edilmiş bir
durum aynı sayıyla karşılaştırılıyordu, oysa ikisi açıkça farklı yerlerdir.

Bu ders çizgiyi **öğrenilen bir durum değeriyle** değiştirir. Ortaya iki bileşenli bir düzen çıkar:
eylemi seçen **aktör** ve bulunulan durumun ne kadar değerli olduğunu söyleyen **eleştirmen**.
Aktörün güncellemesi artık getirinin kendisiyle değil, **üstünlükle** ölçeklenir — eylemin, o
durumda beklenene göre ne kadar iyi çıktığıyla. Ölçülecek iki şey vardır: üstünlük kestiriminin
kattığı fark, ve iki bileşenin birbirini bozduğu durum.

- **PO57.** Ortam `01`'de kurulan kurgudur: beş abone, dönem başına tek ekip, ufuk 30, indirim
  katsayısı 0,9. Aktörün ağırlık dizisi `06`'daki gibi 36 sayıdır ve ölçüm aynı 300 bölümdedir.
- **PO58.** Eleştirmen aktörle aynı altı özniteliği kullanır ve tek bir ağırlık satırıdır — altı
  sayı. Doğrusal tutulmasının nedeni, bu dersin ölçtüğü şeyin eleştirmenin kapasitesi değil iki
  bileşenin **etkileşimi** olmasıdır.
- **PO59.** Üstünlük tek adımlıktır: alınan ödül, artı indirimli bir sonraki durumun değeri, eksi
  o anki durumun değeri. Bölümün son adımında bir sonraki durumun değeri sıfır alınır.
- **PO60.** Eleştirmen zaman farkı biçiminde güncellenir ve güncellemede aynı üstünlük kullanılır;
  yani aktör ile eleştirmen tek bir sayıyı paylaşır. Bu paylaşım, ikisinin birbirini bozabilmesinin
  de nedenidir.
- **PO61.** Üç yöntem aynı bütçeyle karşılaştırılır: 240 bölüm, iki bölümlük toplu iş, 120
  güncelleme. Değişen yalnız aktörün güncellemesini ölçekleyen sayıdır — ham getiri, sabit değer
  çizgisi çıkarılmış getiri, ya da üstünlük.
- **PO62.** Karşılaştırma **iki öğrenme adımında** yapılır: 0,01 ve 0,06. Tek bir adımda ölçmek
  yanıltıcıdır, çünkü yöntemler arasındaki asıl fark hangi adımın taşınabildiğidir.
- **PO63.** Eleştirmenin kendi öğrenme adımı ayrı bir ayar değişkenidir ve süpürülür; denenen
  aday sayısı dörttür.
- **PO64.** Her ölçü iki koşumla basılır; koşumlar arasında yalnız eğitim bölümlerinin tohumu
  değişir. Değerlendirme bölümleri her koşumda aynıdır.

## Üstünlüğün Kattığı Fark

Aşağıdaki blok ortamı ve politikayı yeniden kurar, üç yöntemi tek bir eğitim yordamında toplar ve
iki öğrenme adımında ölçer. Üç yöntem yalnız `A` sayısında ayrılır.

```python
# aktor_elestirmen.py — Ayni KURGU ortam: bes abone, tek ekip, ufuk 30, indirim 0,9.
import math
import statistics

TOHUM, M32 = 20260218, 0xFFFFFFFF
ABONE, KAZANC, MALIYET = 5, (0, 3, 9), 2
KOTULESME = (0.30, 0.05, 0.60, 0.15, 0.45)
EYLEM, UFUK, INDIRIM = ABONE + 1, 30, 0.9
OZ = ABONE + 1                              # ozellik sayisi: bes gecikme sinifi + sabit


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


class Ortam:
    """Ariza derecesi d gizlidir; ajanin gordugu durum gecikme sinifidir."""

    def __init__(self, tohum):
        self.r = uretec(tohum)
        self.d, self.g = [0] * ABONE, [0] * ABONE
        for i in range(ABONE):
            self.g[i] = int(self.r() * 6)
            for _ in range(self.g[i]):
                if self.d[i] < 2 and self.r() < KOTULESME[i]:
                    self.d[i] += 1

    def durum(self):
        return tuple(min(2, x // 3) for x in self.g)

    def adim(self, a):
        odul = 0.0
        if a < ABONE:
            odul = KAZANC[self.d[a]] - MALIYET
            self.d[a] = 0
            self.g[a] = 0
        for i in range(ABONE):
            if i != a:
                self.g[i] += 1
                if self.d[i] < 2 and self.r() < KOTULESME[i]:
                    self.d[i] += 1
        return self.durum(), odul


def olasilik(th, s):                        # AKTOR: ussel normallestirme, 06'daki politika
    x = [v / 2.0 for v in s] + [1.0]
    z = [sum(t * v for t, v in zip(th[a], x)) for a in range(EYLEM)]
    e = [math.exp(v - max(z)) for v in z]
    T = sum(e)
    return [v / T for v in e], x


def deger(w, s):                            # ELESTIRMEN: durumun degeri, alti sayilik satir
    return sum(a * b for a, b in zip(w, [v / 2.0 for v in s] + [1.0]))


def sec(th, s, r):
    p, _ = olasilik(th, s)
    u, t = r(), 0.0
    for a in range(EYLEM):
        t += p[a]
        if u < t:
            return a
    return EYLEM - 1


def olc(politika, n=300):                   # 01'deki ayni 300 bolum
    g = []
    for k in range(n):
        o, r = Ortam(TOHUM + 1000 * k), uretec(TOHUM + 90000 + k)
        s, G, c = o.durum(), 0.0, 1.0
        for _ in range(UFUK):
            s2, od = o.adim(politika(s, r))
            G, c, s = G + c * od, c * INDIRIM, s2
        g.append(G)
    return statistics.mean(g)


def bolum_izi(th, tohum):
    o, r = Ortam(tohum), uretec(tohum + 5)
    s, iz = o.durum(), []
    for _ in range(UFUK):
        a = sec(th, s, r)
        s2, od = o.adim(a)
        iz.append((s, a, od))
        s = s2
    return iz


def getiriler(iz):
    G, g = [0.0] * len(iz), 0.0
    for t in range(len(iz) - 1, -1, -1):
        g = iz[t][2] + INDIRIM * g
        G[t] = g
    return G


def egit(tohum, kip, ogrenme, beta=0.05, butce=240, toplu=2):
    th, w, cizgi = [[0.0] * OZ for _ in range(EYLEM)], [0.0] * OZ, [0.0] * UFUK
    for t in range(butce // toplu):
        egm, egw, ortG = [0.0] * (EYLEM * OZ), [0.0] * OZ, [0.0] * UFUK
        for i in range(toplu):
            iz = bolum_izi(th, tohum + 1000 * t + i)
            G = getiriler(iz)
            for u, (s, a, od) in enumerate(iz):
                p, x = olasilik(th, s)
                if kip == "ham getiri":
                    A = G[u]
                elif kip == "sabit deger cizgisi":
                    A = G[u] - cizgi[u]
                else:                       # ogrenilen elestirmen: tek adimlik ustunluk
                    v2 = 0.0 if u == UFUK - 1 else deger(w, iz[u + 1][0])
                    A = od + INDIRIM * v2 - deger(w, s)
                    for j in range(OZ):
                        egw[j] += A * x[j] / toplu
                for b in range(EYLEM):
                    k = A * ((1.0 if b == a else 0.0) - p[b])
                    for j in range(OZ):
                        egm[b * OZ + j] += k * x[j] / toplu
            for u in range(UFUK):
                ortG[u] += G[u] / toplu
        cizgi = ortG
        for b in range(EYLEM):
            for j in range(OZ):
                th[b][j] += ogrenme * egm[b * OZ + j]
        for j in range(OZ):
            w[j] += beta * egw[j]
    return th, w


print(f"{'yontem':<22}{'adim 0,01':>20}{'adim 0,06':>20}")
SON = {}
for kip in ("ham getiri", "sabit deger cizgisi", "ogrenilen elestirmen"):
    sat = ""
    for ogr in (0.01, 0.06):
        g = [olc(lambda s, r, th=egit(TOHUM + 300000 + k * 7919, kip, ogr)[0]: sec(th, s, r))
             for k in (1, 2)]
        SON[(kip, ogr)] = g
        sat += f"{g[0]:>10.3f}{g[1]:>10.3f}"
    print(f"{kip:<22}{sat}")
for ogr in (0.01, 0.06):
    h, u = SON[("ham getiri", ogr)], SON[("ogrenilen elestirmen", ogr)]
    c = SON[("sabit deger cizgisi", ogr)]
    print(f"adim {ogr}: ustunlugun ham getiriye kattigi {min(u) - min(h):+.3f} / "
          f"{max(u) - max(h):+.3f}; band ham {max(h) - min(h):.3f}, "
          f"cizgi {max(c) - min(c):.3f}, ustunluk {max(u) - min(u):.3f}")
```

```
yontem                           adim 0,01           adim 0,06
ham getiri                15.840    19.962    14.207    17.218
sabit deger cizgisi       22.866    22.190     0.029    15.982
ogrenilen elestirmen      21.154    21.100    23.401    23.755
adim 0.01: ustunlugun ham getiriye kattigi +5.260 / +1.192; band ham 4.122, cizgi 0.675, ustunluk 0.053
adim 0.06: ustunlugun ham getiriye kattigi +9.194 / +6.537; band ham 3.011, cizgi 15.953, ustunluk 0.354
```

Tabloyu tek bir sütuna bakarak okumak yanıltır. Küçük adımda (0,01) en iyi sayıyı **sabit değer
çizgisi** veriyor: 22,866 ve 22,190. Öğrenilen eleştirmen 21,154 ve 21,100 ile onun altında kalıyor
ve `06`'nın bulgusu bozulmuyor — kaba bir taban da bu ortamda işini görüyor. Üstünlüğün ham
getiriye kattığı fark yine de belirgin: +5,260 ve +1,192.

Ayrım büyük adımda ortaya çıkıyor. Öğrenme adımı 0,06'ya çıkarıldığında tam getiriye dayanan iki
yöntem de bozuluyor: ham getiri 14,207 ve 17,218'e iniyor, sabit değer çizgisinin bir koşumu
**0,029** veriyor — yani hiç ekip çıkarmama tabanının üstünde neredeyse hiçbir şey — ve bandı
15,953'e çıkıyor. Üstünlük kestirimi aynı adımda 23,401 ve 23,755 veriyor ve bandı 0,354'te
kalıyor.

Üstünlüğün asıl kattığı budur. Düzeyi biraz yükseltmiyor, **oynamayı** düşürüyor; oynama düştüğü
için daha büyük bir öğrenme adımı taşınabiliyor; ve büyük adım aynı bütçeden daha fazla ilerleme
çıkarıyor. Tam getiri otuz adımın toplamıdır ve otuz adımın gürültüsünü taşır; tek adımlık
üstünlük yalnız bir ödül ile iki değer kestirimini taşır.

Bu takas bedelsiz değildir. Tam getiri, ne kadar oynarsa oynasın, gerçekten yaşanmış bir sonuçtur.
Tek adımlık üstünlük ise otuz adımın yirmi dokuzunu eleştirmenin kestirimine devreder. Eleştirmen
yanılıyorsa üstünlük yalnız oynak değil **sistemli biçimde yanlış** olur, ve yanlışlık her koşumda
aynı yöne bakar. Yukarıdaki tabloda bu görünmüyor, çünkü eleştirmen çalışıyor. Bir sonraki blok
onu çalışmaz hale getirir.

## Eleştirmen Bozulduğunda

İki bileşen tek bir sayıyı paylaşıyor: aynı üstünlük hem aktörü hem eleştirmeni güncelliyor.
Eleştirmen yanlış bir değer verdiğinde aktör yanlış yönde kayar; aktör kaydığında eleştirmenin
öğrenmeye çalıştığı dağılım da değişir. Aşağıdaki blok eleştirmenin öğrenme adımını süpürerek
bu döngünün nerede koptuğunu sayar.

```python
ETIKET = ("A1", "A2", "A3", "A4", "A5", "cikma")
HEPSI = [(a, b, c, e, f) for a in range(3) for b in range(3) for c in range(3)
         for e in range(3) for f in range(3)]


def eylem_dagilimi(th, n=300):
    say = [0] * EYLEM
    for k in range(n):
        o, r = Ortam(TOHUM + 1000 * k), uretec(TOHUM + 90000 + k)
        s = o.durum()
        for _ in range(UFUK):
            a = sec(th, s, r)
            say[a] += 1
            s = o.adim(a)[0]
    return say


print(f"{'elestirmen adimi':>17}{'kosum 1':>9}{'kosum 2':>9}{'|V| ortalama':>14}"
      f"{'en cok secilen':>16}{'hic gidilmeyen':>15}")
for beta in (0.00, 0.05, 0.50, 2.00):
    g = []
    for k in (1, 2):
        th, w = egit(TOHUM + 300000 + k * 7919, "ogrenilen elestirmen", 0.06, beta)
        g.append(olc(lambda s, r: sec(th, s, r)))
        if k == 1:
            d = eylem_dagilimi(th)
            vo = statistics.mean(abs(deger(w, s)) for s in HEPSI)
    t, en = sum(d), d.index(max(d))
    print(f"{beta:>17.2f}{g[0]:>9.3f}{g[1]:>9.3f}{vo:>14.3g}"
          f"{ETIKET[en] + ' ' + format(max(d) / t, '.3f'):>16}"
          f"{sum(x == 0 for x in d[:ABONE]):>15}")
```

```
 elestirmen adimi  kosum 1  kosum 2  |V| ortalama  en cok secilen hic gidilmeyen
             0.00   22.506   22.620             0        A3 0.305              0
             0.05   23.401   23.755          22.2        A3 0.258              0
             0.50  -16.492  -18.772      2.6e+102        A1 1.000              4
             2.00  -15.332  -14.622     5.84e+180        A5 1.000              4
```

İlk satır eleştirmensiz haldir: adım sıfır olduğu için değerler sıfırda kalır ve üstünlük tek
adımlık ödüle iner. Sonuç 22,506 ve 22,620 — kötü değil, çünkü bu ortamda ödül çoğunlukla hemen
gelir. Eleştirmen çalıştığında (0,05) sayı 23,401 ve 23,755'e çıkıyor; eleştirmenin ürettiği
ortalama değer 22,2, yani ölçülen getirinin mertebesinde. Eleştirmenin kazandırdığı yaklaşık bir
birimdir ve ölçülmeden yazılmamalıdır.

Son iki satır kopmayı gösteriyor. Eleştirmenin adımı 0,50'ye çıkarıldığında değerler $10^{102}$
mertebesine ıraksıyor. Üstünlük artık ödülü değil eleştirmenin kendi hatasını taşıyor; işareti
durumdan bağımsız biçimde sabitleniyor ve aktörün bütün olasılığı **tek bir eyleme** kayıyor:
`A1` payı 1,000. Beş abonenin **dördü hiç ziyaret edilmiyor**. Getiri −18,772 — yalnız kötü değil,
hiç ekip çıkarmamanın 0,000'inin de altında, çünkü her dönem ekip maliyeti ödenip karşılığında
neredeyse hiçbir şey alınmıyor. Adım 2,00'de aynı çöküş başka bir aboneye, `A5`'e oluyor; hangi
eyleme yığıldığı bile bir sonuç değil, kazadır.

Bu, kursun kuralının en keskin biçimidir. Getiri sütununa bakan biri iki koşumun da kötü olduğunu
görür ama nedenini bilemez. Dördüncü sütun — **hiç gidilmeyen abone sayısı** — nedeni doğrudan
söylüyor: politika kendi verisini topluyor, tek bir eyleme yığıldığında dört abone hakkında bir
daha hiçbir şey öğrenilmiyor ve eleştirmen o dört abonenin durumlarını hiçbir zaman doğru
kestiremiyor. Toplanan veriyi yazmayan sistem ölçülmemiş sayılır.

## Özet

- Aktör–eleştirmen düzeninde aktör eylemi seçer, eleştirmen durumun değerini söyler ve aktörün
  güncellemesi getiriyle değil **üstünlükle** ölçeklenir: ödül artı indirimli sonraki durum değeri
  eksi o anki durum değeri.
- Aynı 240 bölümlük bütçede, 0,01 adımıyla ham getiri 15,840 ve 19,962, sabit değer çizgisi 22,866
  ve 22,190, üstünlük 21,154 ve 21,100 veriyor. Kaba bir taban bu adımda öğrenilen eleştirmenden
  geride kalmıyor.
- Ayrım öğrenme adımı 0,06'ya çıkınca görünüyor: sabit değer çizgisinin bir koşumu 0,029 ile hiç
  ekip çıkarmama tabanına düşüyor ve bandı 15,953 oluyor, üstünlük ise 23,401 ve 23,755 ile bandı
  0,354'te tutuyor. Üstünlüğün kattığı düzey değil kararlılıktır, ve kararlılık daha büyük adımı
  taşınabilir kılar.
- Eleştirmenin kendi öğrenme adımı bir ayar değişkenidir: dört aday denendi, 0,05 en iyisini verdi
  ve eleştirmensiz hale göre yaklaşık bir birim kattı.
- Eleştirmenin adımı 0,50'ye çıkarıldığında değerler $10^{102}$ mertebesine ıraksıyor, aktörün
  bütün olasılığı tek bir eyleme yığılıyor, beş abonenin dördü hiç ziyaret edilmiyor ve getiri
  −18,772 ile eylemsizliğin bile altına düşüyor.

## Sonraki Adım

Yedi derste ajan kendi eylemini seçti ve sonucunu doğrudan ortamdan öğrendi: ekibi gönderdiği
aboneden bir ödül geldi, göndermediği aboneler bozulmaya devam etti. Karşılık her adımda,
seçimin hemen ardından geldi ve seçim bir sonraki durumu değiştirdi. Sayılar aynı iki taban
çizgisinin üstüne yazıldı — hiç ekip çıkarmamak 0,000 ve rastgele eylem 10,432 — ve kural
politikasının 20,621'i geçilmesi gereken eşik oldu: `05`'in çizelgesi 24,495, aynı dersin tekrar
tamponlu ağı 26,233, bu dersin üstünlük kestirimli aktörü 23,755. Ölçünün üçüncü sayısı hep aynı biçimdeydi — hangi durumlar hiç
görülmedi, hangi eylem hiç denenmedi.

Sonraki konu aynı döngüyü bir yerinden kırıyor. Eylem artık ajanın **yaptığı** bir şey değil, bir
insana **sunulan bir seçenektir**: bir aboneye hangi hizmet kaleminin önerileceği. Öneri
gösterilir, ama sonucu ancak o insan seçerse görülür — gösterilmeyen kalem hiçbir zaman
puanlanmaz, puanlanmayan kalem de bir daha gösterilmez. Toplanan veri artık ajanın gezdiği
durumlar değil, **gösterdiği ve gösterilmediği için hiç öğrenilmeyen** kalemlerdir. Sonraki ders
bu düzenin tabanını kurar ve alanın şaşırtıcı biçimde yüksek taban çizgisini ölçer: herkese en çok
kullanılan kalemi önermek.
