Ders 06 / 14
Politika Eğimi
Politikayı doğrudan parametreleştirmenin bedelinin ölçülmesi: aynı politika ve 120 bölümlük aynı bütçeyle, tek bölümden okunan 120 güncelleme yönü ortalama 86,1 derecelik açı yapıyor ve uzlaşma oranı 0,290'da kalıyor; yirmi bölümlük altı kestirimde açı 44,0 dereceye, uzlaşma 0,878'e çıkıyor. Adım adım ortalama getiriden kurulan değer çizgisi çıkarıldığında aynı sayılar 81,2 derece ile 0,389 ve 39,8 derece ile 0,892 oluyor; taban çıkarmalı iki bölüm, ham dört bölümün uzlaşmasını veriyor. 240 bölümlük eğitimde iki bölümlük kestirim ham getiriyle 15,840 ve 19,962, taban çıkarmayla 22,866 ve 22,190 veriyor; koşum bandı 4,122'den 0,675'e iniyor.
İçindekiler
Önceki beş derste politika hep dolaylı kuruldu: her eylem için bir değer kestirildi ve en büyüğü seçildi. Bu düzende politika, değer kestiriminin bir yan ürünüdür — iki eylemin kestirilen değeri birbirine yakınsa, kestirimdeki küçük bir kayma seçimi tümüyle çevirir. Ayrıca seçim keskindir: en büyük değere sahip eylem her zaman, ikinci en iyi eylem hiçbir zaman seçilmez.
Bu ders başka bir yol tutar. Politika doğrudan parametreleştirilir: her eyleme bir ağırlık satırı verilir, durumdan bir olasılık dağılımı üretilir ve ağırlıklar getiriyi artıracak yönde kaydırılır. Yön artık bir çizelgeden okunmaz, örneklenmiş bölümlerden kestirilir — ve bu dersin ölçtüğü şey o kestirimin ne kadar oynadığıdır.
- PO49. Ortam
01’de kurulan kurgudur ve olduğu gibi sürer: beş abone, dönem başına tek ekip, ufuk 30, indirim katsayısı 0,9. Ölçüm01’deki aynı 300 bölümdedir. - PO50. Politikanın özniteliği beş gecikme sınıfı ile bir sabittir, yani altı sayı. Ağırlık dizisi sayıdır; ders boyunca “yön” bu 36 sayılık bir kaymayı anlatır.
- PO51. Eylem olasılıkları ağırlıklı toplamların üssel normalleştirmesinden çıkar. Bütün
ağırlıklar sıfırken dağılım eşit olasılıklıdır; ölçümün başladığı politika budur ve
01’in rastgele eylem tabanının aynısıdır. - PO52. Bir bölümden okunan yön, her adımda o adımdan sonraki getiri ile seçilen eylemin olasılığını artıran kaymanın çarpımıdır. İndirim katsayısı adım ağırlığı olarak ayrıca uygulanmaz; getirinin kendisi zaten indirimlidir.
- PO53. Değişkenlik iki sayıyla yazılır: kestirimler arasındaki ortalama ikili açı ve uzlaşma oranı — ortalama kestirimin uzunluğunun tek tek kestirimlerin ortalama uzunluğuna bölümü. Uzlaşma 1’e yakınsa kestirimler aynı yeri gösteriyor, 0’a yakınsa birbirini götürüyor. İki ölçü de kestirim sayısından bağımsızdır.
- PO54. Değer çizgisi, aynı politikanın ayrı 200 bölümünden okunan adım adım ortalama getiridir. Ayrı bölümlerden okunması gerekir; ölçülen bölümün kendi getirisi çıkarılırsa yön tanım gereği sıfırlanır.
- PO55. Değer çizgisi eylemden bağımsızdır, bu yüzden kestirimin gittiği yeri kaydırmaz: bir durumdaki bütün eylemlerin olasılık kaymaları toplandığında sıfır çıkar, dolayısıyla sabit bir sayının çarpanı da sıfırdır. Değişen yalnız kestirimin oynamasıdır.
- PO56. Eğitimde bütçe 240 bölümdür ve öğrenme adımı 0,01’de sabit tutulur; değişen yalnız toplu iş boyu ile taban çıkarmanın olup olmadığıdır.
Politikayı Doğrudan Yazmak
Aşağıdaki blok ortamı yeniden kurar, politikayı tanımlar ve bir bölümden okunan yönü hesaplar. Yönün mantığı tek cümledir: bir eylem seçildikten sonra gelen getiri büyükse o eylemin olasılığı artırılır, küçükse azaltılır.
# politika.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): # ussel normallestirme; th[a] eylemin agirlik satiri 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 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): # her adimdan sonraki indirimli getiri 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 bolum_egimi(th, iz, G, cizgi=None): # tek bolumden okunan guncelleme yonu e = [0.0] * (EYLEM * OZ) for t, (s, a, _) in enumerate(iz): p, x = olasilik(th, s) w = G[t] - (cizgi[t] if cizgi else 0.0) for b in range(EYLEM): k = w * ((1.0 if b == a else 0.0) - p[b]) for j in range(OZ): e[b * OZ + j] += k * x[j] return e def deger_cizgisi(th, tohumlar): # adim adim ortalama getiri, AYRI bolumlerden top = [0.0] * UFUK for tt in tohumlar: G = getiriler(bolum_izi(th, tt)) for t in range(UFUK): top[t] += G[t] / len(tohumlar) return top def aci(u, v): nu = math.sqrt(sum(x * x for x in u)) nv = math.sqrt(sum(x * x for x in v)) c = sum(a * b for a, b in zip(u, v)) / (nu * nv) return math.degrees(math.acos(max(-1.0, min(1.0, c)))) def olcum(kest): n = len(kest) ort = [sum(v[j] for v in kest) / n for j in range(len(kest[0]))] boy = statistics.mean(math.sqrt(sum(x * x for x in v)) for v in kest) return (statistics.mean(aci(kest[i], kest[j]) for i in range(n) for j in range(i + 1, n)), math.sqrt(sum(x * x for x in ort)) / boy) TH = [[0.0] * OZ for _ in range(EYLEM)] # butun agirliklar sifir: esit olasilikli politika rp = uretec(TOHUM + 7) print(f"{'taban: hic ekip cikarmamak':<30}{olc(lambda s, r: ABONE):8.3f}") print(f"{'taban: rastgele eylem':<30}{olc(lambda s, r: int(rp() * EYLEM)):8.3f}") print(f"{'olculen politika (agirliklar 0)':<30}{olc(lambda s, r: sec(TH, s, r)):8.3f}") BUTCE = 120 CIZGI = deger_cizgisi(TH, [TOHUM + 700000 + i for i in range(200)]) HAM, TABANLI = [], [] for i in range(BUTCE): iz = bolum_izi(TH, TOHUM + 200000 + i) G = getiriler(iz) HAM.append(bolum_egimi(TH, iz, G)) TABANLI.append(bolum_egimi(TH, iz, G, CIZGI)) def grupla(hepsi, B): return [[sum(v[j] for v in hepsi[i * B:(i + 1) * B]) / B for j in range(EYLEM * OZ)] for i in range(len(hepsi) // B)] print(f"\ndeger cizgisi: ilk adim {CIZGI[0]:.2f}, onuncu {CIZGI[9]:.2f}, son {CIZGI[-1]:.2f}") print(f"{'bolum/kestirim':>15}{'kestirim':>10}{'aci':>8}{'uzlasma':>9}" f"{'aci (taban)':>13}{'uzlasma (taban)':>17}") for B in (1, 2, 4, 10, 20): h, t = olcum(grupla(HAM, B)), olcum(grupla(TABANLI, B)) print(f"{B:>15}{BUTCE // B:>10}{h[0]:>8.1f}{h[1]:>9.3f}{t[0]:>13.1f}{t[1]:>17.3f}")
taban: hic ekip cikarmamak 0.000
taban: rastgele eylem 10.432
olculen politika (agirliklar 0) 10.177
deger cizgisi: ilk adim 9.88, onuncu 11.18, son 1.63
bolum/kestirim kestirim aci uzlasma aci (taban) uzlasma (taban)
1 120 86.1 0.290 81.2 0.389
2 60 83.1 0.386 74.8 0.511
4 30 77.9 0.508 67.0 0.636
10 12 62.4 0.736 53.1 0.790
20 6 44.0 0.878 39.8 0.892
Üçüncü satır politikanın ölçüsünü veriyor: ağırlıkları sıfır olan politika 10,177 getiriyor, yani rastgele eylemin 10,432’siyle aynı yerde. Beklenen budur — eşit olasılıklı seçim rastgele seçimdir ve iki sayı arasındaki 0,255 fark yalnız örnekleme ayrıntısıdır.
Tablonun ilk satırı dersin sayısıdır. 120 bölümlük bütçe tek tek kullanıldığında 120 ayrı güncelleme yönü çıkıyor ve bu yönler ortalama 86,1 derece açı yapıyor: birbirlerine neredeyse dik. Uzlaşma oranı 0,290, yani yönlerin dörtte üçü toplandığında birbirini götürüyor. Tek bir bölümden okunan yöne bakarak ağırlıkları kaydırmak, gürültüyü politikanın içine yazmaktır.
Bütçe bölünmediğinde tablo yumuşuyor: yirmi bölümlük altı kestirim 44,0 derece ve 0,878 uzlaşma veriyor. Ama bunun bir bedeli var — aynı bütçe altı güncellemeye düşüyor. Ders boyunca ölçülen gerilim budur: yön ne kadar güvenilir olsun isteniyorsa o kadar az güncelleme yapılabiliyor.
Değer Çizgisini Çıkarmak
Değer çizgisi satırı sorunun kaynağını gösteriyor: bu ortamda getiriler ilk adımlarda 9,88 ile 11,18 arasında ve son adımda 1,63. Neredeyse hepsi pozitif. Getiri doğrudan çarpan olarak kullanıldığında seçilen her eylemin olasılığı artırılır; eylemler arasındaki ayrım yalnız artışın büyüklüğünden gelir. Kötü bir eylem de, ardından gelen getiri pozitif olduğu için, olasılığını artırarak biter.
Taban çıkarma bunu düzeltir. Her adımın getirisinden o adımın ortalama getirisi düşülür; ortalamanın üstünde kalan eylem artırılır, altında kalan azaltılır. Sayı tablonun sağ yarısındadır: tek bölümde 86,1 derece 81,2 dereceye, uzlaşma 0,290’dan 0,389’a çıkıyor. Daha okunaklı biçimi şudur — taban çıkarmalı iki bölüm 0,511 uzlaşma veriyor, ham dört bölüm 0,508. Aynı uzlaşma yarı bütçeyle elde ediliyor.
Etki bütçe büyüdükçe küçülüyor: yirmi bölümde 44,0 derece 39,8 dereceye iniyor, uzlaşma 0,878’den 0,892’ye çıkıyor. Kestirim zaten yeterince örneklenmişse taban çıkarmanın düzeltecek fazla şeyi kalmıyor.
Aynı Bütçe, Dört Kurulum
Değişkenlik ölçüsü ancak öğrenmeye çevrildiğinde bir anlam kazanır. Aşağıdaki blok 240 bölümlük aynı bütçeyi dört biçimde harcar: toplu iş iki ya da on bölüm, taban çıkarmalı ya da ham getiriyle.
def egit(tohum, tabanli, toplu, butce=240, ogrenme=0.01): th = [[0.0] * OZ for _ in range(EYLEM)] cizgi = [0.0] * UFUK for t in range(butce // toplu): egm, ortG = [0.0] * (EYLEM * OZ), [0.0] * UFUK for i in range(toplu): iz = bolum_izi(th, tohum + 1000 * t + i) G = getiriler(iz) e = bolum_egimi(th, iz, G, cizgi if tabanli else None) for j in range(EYLEM * OZ): egm[j] += e[j] / toplu for u in range(UFUK): ortG[u] += G[u] / toplu if tabanli: cizgi = ortG # deger cizgisi bir onceki toplu isten gelir for b in range(EYLEM): for j in range(OZ): th[b][j] += ogrenme * egm[b * OZ + j] return th print(f"{'kurulum':<28}{'guncelleme':>11}{'kosum 1':>9}{'kosum 2':>9}{'band':>7}") SON = {} for toplu in (2, 10): for tabanli in (False, True): ad = f"{toplu} bolum, {'taban cikarmali' if tabanli else 'ham getiri'}" g = [olc(lambda s, r, th=egit(TOHUM + 300000 + k * 7919, tabanli, toplu): sec(th, s, r)) for k in (1, 2)] SON[(toplu, tabanli)] = g print(f"{ad:<28}{240 // toplu:>11}{g[0]:>9.3f}{g[1]:>9.3f}{max(g) - min(g):>7.3f}") h2, t2 = SON[(2, False)], SON[(2, True)] print(f"\niki bolumluk kestirimde taban cikarma: {min(h2):.3f} -> {min(t2):.3f} ve " f"{max(h2):.3f} -> {max(t2):.3f}, band {max(h2) - min(h2):.3f} -> {max(t2) - min(t2):.3f}")
kurulum guncelleme kosum 1 kosum 2 band 2 bolum, ham getiri 120 15.840 19.962 4.122 2 bolum, taban cikarmali 120 22.866 22.190 0.675 10 bolum, ham getiri 24 17.121 17.853 0.732 10 bolum, taban cikarmali 24 16.808 16.900 0.093 iki bolumluk kestirimde taban cikarma: 15.840 -> 22.190 ve 19.962 -> 22.866, band 4.122 -> 0.675
Dört satır tablonun okunuşunu doğruluyor. İki bölümlük kestirim ham getiriyle 15,840 ve 19,962 veriyor; ikisi de rastgele eylemin 10,432’sini geçiyor ama koşum bandı 4,122 — yalnız başlangıç bölümleri değişerek dört birimden fazla oynayan bir sayı. Aynı kurulumda taban çıkarıldığında 22,866 ve 22,190 çıkıyor ve band 0,675’e iniyor. Taban çıkarma burada hem düzeyi yükseltiyor hem kararlılığı getiriyor, çünkü iki bölümlük bir kestirim tabansız haliyle kullanılamayacak kadar oynaktır.
On bölümlük kestirimde tablo tersine dönüyor: 17,121 ve 17,853’e karşı 16,808 ve 16,900. Taban çıkarma burada kazanç sağlamıyor. Neden tablodadır — on bölümde uzlaşma zaten 0,736 ve taban çıkarma onu 0,790’a taşıyor; bu iyileşme, bütçenin altıda birine düşen güncelleme sayısını telafi etmiyor. En iyi sayı çok güncelleme ile uzlaşık yönün birleştiği yerden geliyor.
Bu dersin hiçbir kurulumu önceki dersin 26,233’üne yaklaşmıyor. Politika eğimi burada eylem değerinden daha zayıftır ve bunun yazılması gerekir: 36 sayılık doğrusal bir politika, gecikme sınıflarını ağırlıklı toplayıp seçim yapabildiği kadarını öğrenir; ağın kurduğu eylem değeri ise durumlar arasındaki doğrusal olmayan ayrımı da taşır.
Özet
- Politikayı doğrudan parametreleştirmek eylem değerini aradan çıkarır: her eyleme bir ağırlık satırı verilir, olasılıklar üssel normalleştirmeyle üretilir, ağırlıklar getiriyi artıracak yönde kaydırılır.
- Yön artık örneklenmiş bölümlerden kestirilir ve oynar: 120 bölümlük bütçe tek tek kullanıldığında 120 ayrı yön çıkıyor, aralarındaki ortalama açı 86,1 derece ve uzlaşma oranı 0,290.
- Kestirimi uzlaştırmanın bir yolu bütçeyi bölmemektir — yirmi bölümde açı 44,0 dereceye, uzlaşma 0,878’e geliyor — ama aynı bütçe altı güncellemeye düşüyor.
- Değer çizgisi eylemden bağımsız olduğu için kestirimin gittiği yeri kaydırmaz, yalnız oynamasını düşürür: taban çıkarmalı iki bölüm 0,511 uzlaşma veriyor, ham dört bölüm 0,508.
- Aynı 240 bölümlük bütçede iki bölümlük kestirim ham getiriyle 15,840 ve 19,962, taban çıkarmayla 22,866 ve 22,190 veriyor; band 4,122’den 0,675’e iniyor. On bölümlük kestirimde taban çıkarmanın kazancı kalmıyor.
Sonraki Adım
Değer çizgisi bu derste sabit bir liste olarak kaldı: aynı politikanın ayrı bölümlerinden okunan adım adım ortalama getiri. Durumu hiç kullanmıyor — otuzuncu adımdaki her durum için aynı sayıyı veriyor, oysa bazı durumlar diğerlerinden açıkça daha iyidir. Sonraki ders çizgiyi öğrenilen bir değer fonksiyonuyla değiştirir ve iki bileşeni birlikte eğitir: eylemi seçen taraf ile onu değerlendiren taraf. Ölçülecek iki şey vardır — durumun kendi değerine göre okunan farkın kattığı kazanç, ve iki bileşenin birbirini bozduğu durum: değerlendiren taraf yanlış sayı verdiğinde seçen tarafın nereye gittiği.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.