Ders 07 / 14
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.
İçindekiler
Ö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 dizisi06’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.
# 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.
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
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 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.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.