Actor-Critic ขั้นสูง: DDPG, TD3, SAC, PPO
4 algorithm ที่ใช้มากที่สุดในงานจริง
DDPG และ TD3 เรียน policy แบบ deterministic สำหรับ action ต่อเนื่อง SAC เพิ่ม entropy ให้ policy หลากหลาย และ PPO จำกัดการเปลี่ยน policy ในแต่ละครั้ง
ในโค้ด: เมื่อ ratio = 1.8 เกิน 1.2 action ที่ advantage เป็นบวกถูก clip (gradient = 0) แต่ action ที่ advantage เป็นลบยังมี gradient ดึงกลับ
| Algorithm | Policy | การเรียน | จุดเด่น |
|---|---|---|---|
| DDPG | Deterministic | Off-policy | DQN สำหรับ action ต่อเนื่อง เพิ่ม Gaussian noise เพื่อสำรวจ |
| TD3 | Deterministic | Off-policy | ① Twin Q ② ใส่ noise ให้ target action ③ อัปเดต policy ช้ากว่า critic |
| SAC | Stochastic | Off-policy | เพิ่ม entropy: ได้รางวัลสูงด้วย policy ที่หลากหลายที่สุด |
| PPO | Stochastic | On-policy | Clipped objective จำกัดการเปลี่ยน policy จึงใช้ข้อมูลชุดเดียวอัปเดตได้หลายรอบ |
SAC : J(π) = E[ Σ γᵗ ( rₜ + α·H(π(·|sₜ)) ) ]
PPO : rₜ(θ) = πθ(aₜ|sₜ) / πθ_old(aₜ|sₜ)
L = E[ min( rₜ·Âₜ , clip(rₜ, 1−ε, 1+ε)·Âₜ ) ]
สิ่งที่ควรจำ
- Action ต่อเนื่อง + อยากใช้ข้อมูลคุ้ม → TD3 หรือ SAC
- อยากได้วิธีที่เสถียรและใช้ได้กว้าง → PPO
import torch
def ppo_clip_loss(logp_new, logp_old, advantages, clip=0.2):
ratio = torch.exp(logp_new - logp_old) # π_new / π_old
unclipped = ratio * advantages
clipped = torch.clamp(ratio, 1 - clip, 1 + clip) * advantages
return -torch.min(unclipped, clipped).mean() # ເລືອກຄ່າທີ່ລະມັດລະວັງກວ່າ
logp_old = torch.log(torch.tensor([0.5, 0.5]))
adv = torch.tensor([1.0, -1.0])
for p_new in (0.5, 0.6, 0.9):
logp_new = torch.log(torch.tensor([p_new, p_new])).requires_grad_()
loss = ppo_clip_loss(logp_new, logp_old, adv)
loss.backward()
print(f"π_new={p_new}: loss={loss.item():+.3f} grad={logp_new.grad.numpy().round(3)}")
ผลลัพธ์
π_new=0.5: loss=-0.000 grad=[-0.5 0.5] π_new=0.6: loss=-0.000 grad=[-0.3 0.3] π_new=0.9: loss=+0.300 grad=[0. 0.9]
- #DeepRL
- #ReinforcementLearning
- #PythonສຳລັບຄົນLaos
- #AI
- #ບອກຕໍ່ຄວາມຮູ້