Ainsteinx Logo
Ainsteinx
👤
ຍິນດີຕ້ອນຮັບສູ່ Ainsteinx
ເຂົ້າສູ່ລະບົບ

ປ່ຽນພາສາ

ສະກຸນເງິນ

ໜ້າທຳອິດ
ບົດຄວາມ
ບໍລິການ
ບົດ 05 · RL ແບບຕາຕະລາງ

ປະເມີນພຶດຕິກຳຂອງ agent

TD ແລະ Monte Carlo: ຄາດຄ່າຂອງ policy ຈາກປະສົບການ.

ບົດນີ້ລວມ 2 ບັນຫາເຂົ້າກັນ: feedback ຕໍ່ເນື່ອງ ແລະ ປະເມີນ. ເປົ້າໝາຍແມ່ນຄາດຄ່າຂອງ policy ທີ່ມີ ໂດຍບໍ່ຮູ້ MDP ແລະ ໃຊ້ພຽງປະສົບການທີ່ເກັບໄດ້ (prediction problem).

ໂຄດຕົວຢ່າງປຽບທຽບ TD(0) ແລະ Monte Carlo ໃນເກມ random walk ທີ່ຮູ້ຄ່າຈິງ.

Monte Carlo (MC)ລໍຖ້າຈົນຈົບເກມ ແລ້ວໃຊ້ຜົນຕອບແທນຈິງ G. ບໍ່ມີ bias ແຕ່ variance ສູງ
Temporal-Difference (TD)ອັບເດດທຸກກ້າວ ໂດຍໃຊ້ຄ່າຄາດຂອງ state ຖັດໄປ (bootstrapping). variance ຕ່ຳ ແຕ່ມີ bias
MC : V(s) ← V(s) + α [ Gₜ − V(s) ] TD : V(s) ← V(s) + α [ rₜ₊₁ + γ·V(sₜ₊₁) − V(s) ] └──── TD target ────┘ └──────── TD error ─────────┘
  • n-step TD: ໃຊ້ລາງວັນຈິງ n ກ້າວ ແລ້ວຈຶ່ງ bootstrap. n=1 ຄື TD, n=∞ ຄື MC
  • TD(λ): ປະສົມທຸກ n ເຂົ້າກັນດ້ວຍນ້ຳໜັກ λ ໂດຍໃຊ້ eligibility traces

ສິ່ງທີ່ຄວນຈື່

  • MC ↔ TD ຄືສອງປາຍຂອງເສັ້ນດຽວກັນ: bias ຕ່ຳ/variance ສູງ ↔ bias ສູງ/variance ຕ່ຳ
  • TD error ແມ່ນຫົວໃຈຂອງເກືອບທຸກ algorithm ໃນບົດຕໍ່ໄປ
deep-rl-ep05-td-and-monte-carlo.py
import numpy as np

# Random walk 7 ຊ່ອງ: 0 ແລະ 6 ແມ່ນຈຸດຈົບ, ໄປຮອດ 6 ໄດ້ +1
rng = np.random.default_rng(0)

def episode():
    s, traj = 3, []
    while s not in (0, 6):
        s2 = s + rng.choice([-1, 1])
        traj.append((s, 1.0 if s2 == 6 else 0.0, s2))
        s = s2
    return traj

def td0(n_episodes=5000, alpha=0.01, gamma=1.0):
    V = np.zeros(7)
    for _ in range(n_episodes):
        for s, r, s2 in episode():
            target = r + gamma * V[s2]        # TD target (bootstrap)
            V[s] += alpha * (target - V[s])   # TD error × learning rate
    return V

def monte_carlo(n_episodes=5000):
    V, N = np.zeros(7), np.zeros(7)
    for _ in range(n_episodes):
        traj = episode()
        G = traj[-1][1]                       # γ=1, ລາງວັນມີແຕ່ຕອນທ້າຍ
        for s in {s for s, _, _ in traj}:     # first-visit MC
            N[s] += 1
            V[s] += (G - V[s]) / N[s]         # ສະເລ່ຍຜົນຕອບແທນຈິງທັງເກມ
    return V

print("ຄ່າຈິງ :", np.round(np.arange(1, 6) / 6, 3))
print("TD(0) :", np.round(td0()[1:6], 3))
print("MC    :", np.round(monte_carlo()[1:6], 3))

ຜົນລັບ

ຄ່າຈິງ : [0.167 0.333 0.5   0.667 0.833]
TD(0) : [0.183 0.34  0.489 0.657 0.817]
MC    : [0.161 0.327 0.501 0.666 0.841]
  • #DeepRL
  • #ReinforcementLearning
  • #PythonສຳລັບຄົນLaos
  • #AI
  • #ບອກຕໍ່ຄວາມຮູ້