ปรับปรุงพฤติกรรมของ agent
SARSA, Q-learning และ Double Q-learning
เพื่อปรับปรุง policy โดยไม่รู้ MDP ต้องเรียน Q(s,a) แทน V และต้องสำรวจไปพร้อมกัน ทุกวิธีทำตามแบบ GPI: ประเมิน Q → เลือก action ที่ดีขึ้น → วนซ้ำ
Q-learning ในโค้ดเรียนจากการลองเล่นล้วนๆ แต่ได้ policy เดียวกับ value iteration ในบทที่ 3 ที่ต้องรู้ MDP ทั้งหมด
SARSA (on-policy): Q(s,a) ← Q(s,a) + α [ r + γ·Q(s',a') − Q(s,a) ]
Q-learning (off-policy): Q(s,a) ← Q(s,a) + α [ r + γ·maxₐ' Q(s',a') − Q(s,a) ]
- On-policy (SARSA): เรียนค่าของ policy ที่ใช้เล่นอยู่ รวมทั้งการสุ่มสำรวจ
- Off-policy (Q-learning): เล่นด้วย policy หนึ่งแต่เรียนค่าของ policy ที่ดีที่สุด
- Double Q-learning: ใช้ Q 2 ชุด เพื่อแก้การประเมินค่าสูงเกินจาก max
- GLIE: ต้องสำรวจทุกทางไม่สิ้นสุด แต่ค่อยๆ กลายเป็น greedy
สิ่งที่ควรจำ
- Prediction = ประเมิน policy, Control = หา policy ที่ดีที่สุด
- Double learning จะกลับมาใช้ใน Double DQN และ TD3
import numpy as np
import gymnasium as gym
env = gym.make("FrozenLake-v1", is_slippery=True)
n_s, n_a = env.observation_space.n, env.action_space.n
Q = np.zeros((n_s, n_a))
rng = np.random.default_rng(0)
gamma, alpha = 0.99, 0.1
n_episodes = 20000
for ep in range(n_episodes):
eps = max(0.01, 1.0 - ep / (0.8 * n_episodes)) # epsilon ຫຼຸດລົງເລື້ອຍໆ
s, _ = env.reset(seed=ep)
done = False
while not done:
a = rng.integers(n_a) if rng.random() < eps else int(np.argmax(Q[s]))
s2, r, term, trunc, _ = env.step(a)
target = r + gamma * Q[s2].max() * (not term) # off-policy: ໃຊ້ max
Q[s, a] += alpha * (target - Q[s, a])
s, done = s2, term or trunc
pi = Q.argmax(axis=1)
wins = 0
for ep in range(1000):
s, _ = env.reset(seed=100000 + ep)
done = False
while not done:
s, r, term, trunc, _ = env.step(pi[s])
done = term or trunc
wins += r
print("π =", "".join("←↓→↑"[a] for a in pi))
print(f"ອັດຕາສຳເລັດ: {wins / 10:.1f}%")
ผลลัพธ์
π = ←↑↑↑←←←←↑↓←←←→↓← ອັດຕາສຳເລັດ: 73.4%
- #DeepRL
- #ReinforcementLearning
- #PythonສຳລັບຄົນLaos
- #AI
- #ບອກຕໍ່ຄວາມຮູ້