ชั่งเป้าหมายระยะสั้นและระยะยาว
Policy, value function และการวางแผนเมื่อรู้ MDP
เป้าหมายของ agent คือทำให้ expected return (รางวัลรวมที่คาดไว้) สูงที่สุด รางวัลในอนาคตถูกลดค่าด้วย γ เพราะ "เงินวันนี้มีค่ากว่าเงินพรุ่งนี้"
โค้ดตัวอย่างใช้ Value Iteration หา policy ที่ดีที่สุดของ FrozenLake แม้จะดีที่สุดแล้วก็สำเร็จเพียงราว 3 ใน 4 ครั้ง เพราะน้ำแข็งลื่น
Gₜ = rₜ₊₁ + γ·rₜ₊₂ + γ²·rₜ₊₃ + …
V^π(s) = E_π[ Gₜ | sₜ = s ] ค่าของ state
Q^π(s,a) = E_π[ Gₜ | sₜ = s, aₜ = a ] ค่าของ action ใน state
A^π(s,a) = Q^π(s,a) − V^π(s) ดีกว่าค่าเฉลี่ยแค่ไหน
Bellman: V^π(s) = Σₐ π(a|s) Σₛ' T(s'|s,a) [ R + γ·V^π(s') ]
- Policy (π) คือ "แผนสำหรับทุกสถานการณ์" มีแบบ deterministic และ stochastic
- Policy evaluation: คำนวณ V ของ policy ที่มี
- Policy improvement: สร้าง policy ใหม่ที่ greedy ตาม V
- Policy / Value iteration: สลับ 2 ขั้นตอนจนไม่เปลี่ยน Value iteration ตัด evaluation เหลือรอบเดียวจึงเร็วกว่า
- GPI: ทุกวิธีที่จะเรียนต่อไปล้วนเป็น "ประเมิน ↔ ปรับปรุง"
สิ่งที่ควรจำ
- V บอกค่าของ state, Q บอกค่าของ action, A บอกว่าดีกว่าค่าเฉลี่ยแค่ไหน
- ถ้ารู้ MDP ใช้ Value/Policy Iteration หา π* ได้โดยตรง (planning)
import numpy as np
import gymnasium as gym
def value_iteration(P, gamma=0.99, theta=1e-10):
n_s, n_a = len(P), len(P[0])
V = np.zeros(n_s)
while True:
Q = np.zeros((n_s, n_a))
for s in range(n_s):
for a in range(n_a):
for prob, s2, r, done in P[s][a]:
Q[s, a] += prob * (r + gamma * V[s2] * (not done))
if np.max(np.abs(V - Q.max(axis=1))) < theta:
break
V = Q.max(axis=1) # Bellman optimality backup
pi = Q.argmax(axis=1) # ນະໂຍບາຍ greedy
return V, pi
env = gym.make("FrozenLake-v1", is_slippery=True)
V, pi = value_iteration(env.unwrapped.P)
print(np.round(V.reshape(4, 4), 3))
print("π* =", "".join("←↓→↑"[a] for a in pi))
# ທົດສອບນະໂຍບາຍ 1,000 ເກມ
wins = 0
for ep in range(1000):
s, _ = env.reset(seed=ep)
done = False
while not done:
s, r, term, trunc, _ = env.step(pi[s])
done = term or trunc
wins += r
print(f"ອັດຕາສຳເລັດ: {wins / 10:.1f}%")
ผลลัพธ์
[[0.542 0.499 0.471 0.457] [0.558 0. 0.358 0. ] [0.592 0.643 0.615 0. ] [0. 0.742 0.863 0. ]] π* = ←↑↑↑←←←←↑↓←←←→↓← ອັດຕາສຳເລັດ: 75.5%
- #DeepRL
- #ReinforcementLearning
- #PythonສຳລັບຄົນLaos
- #AI
- #ບອກຕໍ່ຄວາມຮູ້