ชั่งการสำรวจและการใช้ประโยชน์
ตู้สล็อตหลายตู้ เลือกตู้ไหนดี?
เมื่อไม่รู้ MDP agent เห็นเพียงตัวเลขรางวัล เช่น +1, −4 จึงไม่รู้ว่ายังมีทางเลือกที่ดีกว่าซ่อนอยู่หรือไม่
นี่คือปัญหา exploration vs exploitation รางวัลที่เสียไปเพราะไม่ได้เลือกทางที่ดีที่สุดเรียกว่า regret
ในโค้ด: greedy ล้วนๆ ติดอยู่กับตู้ที่เจอก่อน ส่วน UCB ใช้ความไม่แน่นอนช่วยเลือก จึงใกล้ค่าสูงสุดกว่า
| วิธี | แนวคิด |
|---|---|
| ε-greedy | ส่วนใหญ่เลือกตัวที่ดีที่สุด มีโอกาส ε สุ่มเลือก |
| Decaying ε-greedy | สำรวจมากในช่วงแรกแล้วค่อยลด ε |
| Optimistic initialization | ตั้งค่า Q เริ่มต้นสูงๆ เพื่อบังคับให้ลองทุกทาง |
| Softmax | สุ่มตามสัดส่วนของค่า Q |
| UCB | บวก "โบนัสความไม่แน่นอน" ให้ทางที่ลองน้อย |
| Thompson sampling | สุ่มจากการแจกแจงความเชื่อ (Bayesian) ของแต่ละทาง |
สิ่งที่ควรจำ
- ไม่สำรวจ = อาจติดอยู่กับทางเลือกที่ไม่ดี สำรวจมากเกินไป = เสียรางวัล
- วิธีที่ดีมักใช้ข้อมูล "ความไม่แน่นอน" ไม่ใช่สุ่มแบบไม่มีทิศทาง
import numpy as np
rng = np.random.default_rng(0)
true_means = rng.normal(0, 1, size=10) # ເຄື່ອງ slot 10 ເຄື່ອງ (ບໍ່ຮູ້ຄ່າຈິງ)
def run(strategy, steps=1000):
Q, N, total = np.zeros(10), np.zeros(10), 0.0
for t in range(1, steps + 1):
a = strategy(Q, N, t)
r = rng.normal(true_means[a], 1)
N[a] += 1
Q[a] += (r - Q[a]) / N[a] # ຄ່າສະເລ່ຍແບບ incremental
total += r
return total / steps
def epsilon_greedy(Q, N, t, eps=0.1):
return rng.integers(10) if rng.random() < eps else int(np.argmax(Q))
def ucb(Q, N, t, c=2.0):
if (N == 0).any():
return int(np.argmin(N)) # ລອງທຸກເຄື່ອງກ່ອນ
return int(np.argmax(Q + c * np.sqrt(np.log(t) / N)))
print(f"ຄ່າສູງສຸດທີ່ເປັນໄປໄດ້ : {true_means.max():.3f}")
print(f"greedy (eps=0) : {run(lambda Q, N, t: epsilon_greedy(Q, N, t, 0)):.3f}")
print(f"epsilon-greedy (0.1) : {run(epsilon_greedy):.3f}")
print(f"UCB : {run(ucb):.3f}")
ผลลัพธ์
ຄ່າສູງສຸດທີ່ເປັນໄປໄດ້ : 1.304 greedy (eps=0) : 0.642 epsilon-greedy (0.1) : 1.039 UCB : 1.195
- #DeepRL
- #ReinforcementLearning
- #PythonສຳລັບຄົນLaos
- #AI
- #ບອກຕໍ່ຄວາມຮູ້