İçeriğe geç
academia.sh

Ders 01 / 14

Ajan, Ortam ve Ödül

Kararın kendi verisini ürettiği bir düzende üç sayının okunması: saha ziyareti kurgusunda hiç ekip çıkarmayan politika 0,000 getiri alıyor, taban çizgisi olan rastgele eylem 10,432, gecikmesi en büyük aboneye giden el kuralı 20,621. Üçüncü sayı toplanan veridir: rastgele politika 243 durumun 234'ünü ve 1.458 durum-eylem çiftinin 1.251'ini görüyor, daha iyi getiri alan kural yalnız 103 durumu ve 103 çifti görüyor. Aynı dönemde altı eylemin vereceği ödül -2, -2, 1, -2, 1 ve 0 iken ajan bunlardan yalnız birini öğreniyor; denetimli öğrenmenin etiketi yerine geçen şey budur.

İçindekiler

Önceki kurs otuz sekiz dersin sonunda tek bir düzeni sürdürdü: modele bir girdi verildi, model bir çıktı üretti, çıktının doğruluğu ya elde bulunan bir etiketten ya da çıktıyı tarif eden bir ölçütten okundu. Girdi modelin kararından bağımsızdı. Model ne söylerse söylesin sıradaki satır, sıradaki cümle, sıradaki görüntü değişmiyordu; küme baştan oradaydı ve orada kalıyordu.

Bu kurs o düzenin dışına çıkar. Burada kararın sonucu ancak karar verildikten sonra görünür, ve kararın kendisi bir sonraki girdiyi değiştirir. Bir aboneyi ziyaret etmek onun durumunu açığa çıkarır, aynı zamanda o durumu ortadan kaldırır; ziyaret edilmeyen abone kötüleşmeye devam eder. Böyle bir düzende “başarım” sayısı, sayının hangi veri üzerinde ölçüldüğü yazılmadan okunamaz, çünkü veriyi politikanın kendisi toplamıştır. Bu dersin işi döngüyü kurmak ve kursun üç sayısını yerine oturtmaktır: taban çizgisi, yöntemin sayısı, toplanan veri.

  • PO1. Kurgu saha ziyareti planlamasıdır ve üretilmiştir. Bölgesel ölçüm ağı kurgusunun bir bölgesinde beş abone (A1–A5) bulunur. Hiçbir sayı gerçek bir kayıttan gelmez; hepsi tohum 20260218 ile ders içinde üretilir.
  • PO2. Her dönem tek ekip çıkar. Eylem kümesi altı ögelidir: beş aboneden birini ziyaret etmek ya da ekibi hiç çıkarmamak.
  • PO3. Abonenin saha durumu gizlidir ve üç kademelidir — temiz, şüpheli, arızalı. Ziyaret bu kademeyi açığa çıkarır ve arıza onarıldığı için sıfırlar.
  • PO4. Ziyaret edilmeyen abone kötüleşir. Her dönem, abonesine özgü bir olasılıkla bir kademe yükselir; olasılıklar A1’den A5’e 0,30, 0,05, 0,60, 0,15 ve 0,45’tir.
  • PO5. Ajanın gördüğü durum gecikme sınıfıdır. Her abone için son ziyaretten bu yana geçen dönem sayısı üç kovaya bölünür: 0–2, 3–5, 6 ve üzeri. Durum uzayı 35=2433^5 = 243 ögedir.
  • PO6. Ödül ziyaretin bulduğudur. Bulunan kademenin karşılığı sırasıyla 0, 3 ve 9’dur ve her ziyaret 2 birim maliyet götürür. Ekip çıkmazsa ödül tam olarak 0’dır.
  • PO7. Bölüm 30 dönemdir ve indirim katsayısı 0,9’dur. Getiri, bölümdeki ödüllerin indirimli toplamıdır; yakın dönemin ödülü uzak dönemin ödülünden ağır basar.
  • PO8. Taban çizgisi rastgele eylemdir. Hiç ekip çıkarmamak da ölçülür ama taban olamaz: getirisi tanım gereği sıfırdır ve sıfır, eylem seçmenin değil ölçünün başlangıç noktasıdır.
  • PO9. Ölçü 300 bölümün ortalama getirisidir ve yönü büyük iyidir. Bölüm tohumları sabittir, bütün politikalar aynı 300 başlangıcı görür.

Ortam, Eylem ve Ödül Döngüsü

# ortam.py — KURGUDUR. Saha ziyareti planlamasi: bir bolgedeki bes abone ve
# her donem cikan tek ekip. Butun sayilar uretilmistir, bir kayittan gelmez.
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)
ETIKET = ("A1", "A2", "A3", "A4", "A5", "cikma")
EYLEM, UFUK, INDIRIM = ABONE + 1, 30, 0.9


def uretec(t):
    """Kendi yazilmis uretec; tohum sabit oldugu icin cikti her kosumda ayni."""
    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:
    """Saha durumu 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 bolum(politika, tohum, iz=None):
    o = Ortam(tohum)
    s, G, c = o.durum(), 0.0, 1.0
    for _ in range(UFUK):
        a = politika(s, o)
        s2, r = o.adim(a)
        if iz is not None:
            iz.append((s, a, r, s2))
        G, c, s = G + c * r, c * INDIRIM, s2
    return G


def kosum(politika, n=300, iz=None):
    return [bolum(politika, TOHUM + 1000 * k, iz) for k in range(n)]


def rastgele_politika(tohum):
    r = uretec(tohum)
    return lambda s, o: int(r() * EYLEM)


o = Ortam(TOHUM)
r = uretec(TOHUM + 7)
print("donem  durum            eylem   odul  getiriye katki")
G, c = 0.0, 1.0
for t in range(8):
    s, a = o.durum(), int(r() * EYLEM)
    _, odul = o.adim(a)
    G, k = G + c * odul, c * odul
    print(f"{t:>4}   {str(s):<17}{ETIKET[a]:<6}{odul:>6.1f}{k:>13.3f}")
    c *= INDIRIM
print(f"sekiz donemin getirisi {G:.3f}")
donem  durum            eylem   odul  getiriye katki
   0   (1, 0, 0, 1, 0)  A5       1.0        1.000
   1   (2, 0, 0, 1, 0)  A3       7.0        6.300
   2   (2, 0, 0, 2, 0)  A1      -2.0       -1.620
   3   (0, 1, 0, 2, 0)  A2      -2.0       -1.458
   4   (0, 0, 0, 2, 1)  A3       7.0        4.593
   5   (0, 0, 0, 2, 1)  A5       7.0        4.133
   6   (1, 0, 0, 2, 0)  A4       1.0        0.531
   7   (1, 1, 0, 0, 0)  A3       7.0        3.348
sekiz donemin getirisi 16.828

Sekiz satır döngünün tamamını taşıyor. Ajan ekibi yönlendiren taraftır, ortam aboneleri ve onların kötüleşmesini tutan taraf. Ajan bir durum görür, bir eylem seçer, ortam bir ödül döndürür ve yeni bir duruma geçer. Üçüncü dönemde A1 ziyaret ediliyor ve ödül 2-2 çıkıyor: ekip gitmiş, abone temiz bulunmuş, maliyet boşa yazılmış. Yedinci dönemde A3 ziyaret ediliyor ve ödül 7 oluyor, çünkü arıza kademesi bulunmuş ve onarılmış.

Ödül tek adımlıktır ve ajanın istediği şey tek adım değildir. Getiri, bölüm boyunca alınan ödüllerin indirimli toplamıdır: G=tγtrtG = \sum_{t} \gamma^{t} r_t, burada γ=0,9\gamma = 0{,}9. Sağdaki sütun aynı 7’nin dördüncü dönemde 4,593, yedinci dönemde 3,348 olarak sayıldığını gösteriyor. İndirim katsayısı bir tercihtir ve tercihi ölçü hâline getirir: aynı kazanç ne kadar geç gelirse o kadar az sayılır. Sekiz dönemin getirisi 16,828.

Üçüncü dönemin bir ayrıntısı ilerideki dersin konusudur. Durum (2,0,0,2,0)(2, 0, 0, 2, 0) iken A1’in gecikme sınıfı 2’dir, yani en az altı dönemdir ziyaret edilmemiştir, ama bulunan kademe temizdir ve ödül 2-2’dir. Gecikme sınıfı abonenin gerçek kademesini söylemez, yalnız onunla ilişkilidir.

Taban Çizgisi ve Politikanın Sayısı

# politika.py — Ayni ortam, ayni 300 bolum tohumu, ayni ufuk; degisen politika.


def bos_politika(s, o):
    """Ekip hic cikmaz: getirisi tanim geregi sifirdir."""
    return ABONE


def kural_politika(s, o):
    """Gecikme sinifi en buyuk aboneyi ziyaret et; hepsi 0 ise ekip cikarma."""
    en = max(s)
    return ABONE if en == 0 else s.index(en)


print(f"{'politika':<26}{'getiri':>9}{'en dusuk':>10}{'en yuksek':>11}")
for ad, pol in (("hic ekip cikarma", bos_politika),
                ("rastgele eylem", rastgele_politika(TOHUM + 7)),
                ("gecikmesi en buyuge git", kural_politika)):
    g = kosum(pol)
    print(f"{ad:<26}{statistics.mean(g):>9.3f}{min(g):>10.3f}{max(g):>11.3f}")
politika                     getiri  en dusuk  en yuksek
hic ekip cikarma              0.000     0.000      0.000
rastgele eylem               10.432    -6.887     31.159
gecikmesi en buyuge git      20.621     2.370     41.179

Politika, durumdan eyleme giden kuraldır. Üç politika aynı 300 başlangıcı görüyor ve üç ayrı sayı veriyor. İlki hiç ekip çıkarmaz: her dönemde ödülü 0’dır, dolayısıyla getirisi de tam olarak 0’dır, en düşük ve en yüksek bölümü bile 0’dır. İkincisi altı eylemden birini ayrım gözetmeden seçer ve 10,432 alır. Üçüncüsü tek satırlık bir el kuralıdır — hiçbir şey öğrenmez, yalnız durumu okur — ve 20,621 alır.

Taban çizgisi olarak rastgele eylem seçilir. Hiç ekip çıkarmamak daha düşük bir sayı verse de taban olamaz, çünkü getirisi ölçünün sıfır noktasıdır: bir politikanın onu geçmesi, o politikanın eylem seçmeyi öğrendiğini değil, yalnız hareket etmenin bu kurguda hareketsizlikten iyi olduğunu söyler. Rastgele eylem ise eylem seçen ama seçimini hiçbir bilgiye dayandırmayan yordamdır ve karşılaştırmayı anlamlı kılan budur. İki taban da basılır, çünkü aralarındaki 10,432’lik açıklık kurgunun kendisinin ne kadar cömert olduğunu ölçer.

Kuralın rastgele eylemi 10,189 aşması nereden gelir. Rastgele politika beş aboneyi eşit görür, oysa A2 dönem başına 0,05 olasılıkla kötüleşir; ona yapılan ziyaret çoğunlukla 2-2 yazar. Kural, gecikmesi büyük aboneye giderek boşa ziyareti azaltır. En düşük bölüm sayıları da bunu gösteriyor: rastgele politikanın en kötü bölümü 6,887-6,887 iken kuralın en kötüsü +2,370+2,370’tir.

En yüksek bölüm sayıları ise tersini söylüyor ve okunmayı hak ediyor. Rastgele politika bir bölümde 31,159’a kadar çıkabiliyor; kuralın en iyi bölümü 41,179. İki dağılım örtüşüyor, yani tek bir bölüme bakan biri rastgele politikayı kuraldan iyi görebilirdi. Ortalama 300 bölüm üzerinden alınmasının nedeni budur: bölüm getirisi hem başlangıç durumundan hem de kötüleşmenin çekilişinden etkilenir, ve iki politikayı ayıran şey tek bölümde değil ortalamada görünür.

Toplanan Veri

# veri.py — Ucuncu sayi: politika kendi verisini topladigi icin durum uzayinin
# ne kadarini gordugu politikanin kendisine baglidir.
from collections import Counter

gorulen = {}
for ad, pol in (("rastgele eylem", rastgele_politika(TOHUM + 7)),
                ("gecikmesi en buyuge git", kural_politika)):
    iz = []
    kosum(pol, 300, iz)
    say = Counter(x[0] for x in iz)
    gorulen[ad] = set(say)
    cift = {(x[0], x[1]) for x in iz}
    pay = sum(n for _, n in say.most_common(3)) / len(iz)
    print(f"{ad:<26} durum {len(say):>4}/243  cift {len(cift):>5}/1458  "
          f"adim {len(iz)}  ilk uc durumun payi {pay:.4f}")

R, K = gorulen["rastgele eylem"], gorulen["gecikmesi en buyuge git"]
print(f"rastgelenin gorup kuralin gormedigi durum {len(R - K)}, "
      f"tersi {len(K - R)}, ikisinin de gormedigi {243 - len(R | K)}")

print("\nayni donemde alti eylemin verecegi odul (yalniz kurgu sahibi gorebilir):")
for a in range(EYLEM):
    o2 = Ortam(TOHUM)
    s0 = o2.durum()
    print(f"  {ETIKET[a]:<7}{o2.adim(a)[1]:>6.1f}")
print(f"baslangic durumu {s0}; ajanin gordugu bu alti satirdan yalniz biri")
rastgele eylem             durum  234/243  cift  1251/1458  adim 9000  ilk uc durumun payi 0.0319
gecikmesi en buyuge git    durum  103/243  cift   103/1458  adim 9000  ilk uc durumun payi 0.3327
rastgelenin gorup kuralin gormedigi durum 131, tersi 0, ikisinin de gormedigi 9

ayni donemde alti eylemin verecegi odul (yalniz kurgu sahibi gorebilir):
  A1       -2.0
  A2       -2.0
  A3        1.0
  A4       -2.0
  A5        1.0
  cikma     0.0
baslangic durumu (1, 0, 0, 1, 0); ajanin gordugu bu alti satirdan yalniz biri

Üst iki satır bu kursun ayırt edici sayısıdır. İki politika aynı bütçeyi harcıyor: 300 bölüm, bölüm başına 30 dönem, toplam 9.000 adım. Topladıkları veri aynı değil. Rastgele politika 243 durumun 234’ünü ve 1.458 durum-eylem çiftinin 1.251’ini görüyor. Getirisi iki katı olan kural ise yalnız 103 durum ve 103 çift görüyor — 140 durum ve 1.355 çift hakkında elinde tek bir gözlem yok.

İki sayının eşit olması kuralın belirleyici olmasındandır: gördüğü her durumda tek bir eylem seçer, dolayısıyla o durumdaki öteki beş eylemin ne vereceğini hiçbir zaman öğrenmez. Daha iyi getiri alan politika daha dar bir veri topluyor. Bu, kursun kuralının doğrudan sonucudur: topladığı veriyi yazmayan sistem ölçülmemiş sayılır, çünkü 20,621 sayısı 103 durumluk bir kesitte geçerlidir ve o kesitin dışında politikanın ne yapacağı ölçülmemiştir.

Sağdaki sütun aynı daralmayı yoğunluk üzerinden okuyor. Rastgele politikanın en çok uğradığı üç durum 9.000 adımın yalnız 0,0319’unu tutar, yani ziyaretler durum uzayına neredeyse düz yayılır. Kuralın en çok uğradığı üç durum ise adımların 0,3327’sini tutar: her üç adımdan biri aynı üç durumdan birinde geçer. Üçüncü satır ilişkiyi kapatıyor. Kuralın gördüğü 103 durumun tamamını rastgele politika da görmüştür, tersi ise 131 durumda yanlıştır — yani daha iyi politikanın veri kümesi, tabanın veri kümesinin öz altkümesidir. Dokuz durumu ikisi de hiç görmedi.

Bu üçüncü sayının önceki altı kursta karşılığı yoktu. Orada küme ne yapılırsa yapılsın aynıydı; bir modelin taban çizgisini geçmesi, üzerinde ölçüldüğü kümeyi değiştirmiyordu. Burada politika değiştiği anda küme de değişiyor, dolayısıyla iki politikanın getirisi karşılaştırılırken iki ayrı veri kümesi de karşılaştırılmış oluyor. İleride bir politikanın öğrenilmesi gerektiğinde bu daralma doğrudan bir sorun hâline gelir: 1.355 çift hakkında hiç gözlemi olmayan bir yordam, o çiftlerden birinin daha iyi olup olmadığını hiçbir zaman öğrenemez.

Alt blok denetimli öğrenmeden farkı tek bir oranla veriyor. Başlangıç durumu (1,0,0,1,0)(1, 0, 0, 1, 0) iken altı eylemin vereceği ödüller 2-2, 2-2, 11, 2-2, 11 ve 00’dır. Bu altı satır yalnızca kurgu sahibi ortamı altı kez aynı tohumdan kurabildiği için basılabiliyor; ajan bir eylem seçer ve yalnız bir satırı öğrenir, ötekiler kapanır. Denetimli öğrenmede her örnek doğru cevabını yanında getirirdi; burada her adımda altı sonuçtan biri, yani altıda biri görünür, üstelik seçilmeyen beş eylemin sonucu sonradan da sorulamaz çünkü ortam artık başka bir durumdadır.

Özet

  • Ajan durumu görür, eylem seçer, ortam ödül döndürür ve yeni duruma geçer; getiri bölümdeki ödüllerin indirim katsayısı 0,9 ile indirimli toplamıdır ve örnek sekiz dönemde 16,828’dir.
  • Hiç ekip çıkarmayan politikanın getirisi tanım gereği 0,000’dır; taban çizgisi bu değil, eylem seçen ama seçimini hiçbir bilgiye dayandırmayan rastgele eylem politikasıdır: 10,432.
  • Durumu okuyan tek satırlık el kuralı 20,621 alır; farkın kaynağı, kötüleşme olasılığı 0,05 olan aboneye yapılan boşa ziyaretlerin azalmasıdır.
  • Aynı 9.000 adımlık bütçede rastgele politika 243 durumun 234’ünü, kural yalnız 103’ünü görür; belirleyici olduğu için kuralın gördüğü durum-eylem çifti sayısı da 103’te kalır.
  • Kuralın veri kümesi tabanınkinin öz altkümesidir: rastgele politikanın gördüğü 131 durumu kural hiç görmez, tersi hiç olmaz, ve kuralın adımlarının 0,3327’si yalnız üç durumda geçer.
  • Ajan her adımda altı eylemden yalnız birinin sonucunu öğrenir; seçilmeyen beş eylemin ödülü sonradan da sorulamaz, çünkü ortam bu arada değişmiştir.

Sonraki Adım

Bu derste durum, eylem, geçiş ve ödül adlarıyla kullanıldı ama hiçbiri tanımlanmadı. Tanımın gerektirdiği tek şey ise sayıların hepsini birden taşıyor: ortamın bir sonraki duruma nasıl geçeceği ve hangi ödülü vereceği, yalnız o anki duruma ve seçilen eyleme bağlı olmalıdır. Bu derste basılan bir satır bu koşulu şimdiden zorluyordu: A1’in gecikme sınıfı 2 iken bulunan kademe temizdi ve ödül 2-2 oldu, oysa başka bir bölümde aynı sınıf 7 verebilirdi. Sonraki ders kurulumu biçimsel bir beşliye oturtur, koşulun ne söylediğini yazar ve koşul bozulduğunda ne kaybedildiğini sayar: aynı el kuralı, duruma bir geçmiş alanı eklendiğinde kaç puan daha fazla getiri alıyor.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat