Ainsteinx Logo
Ainsteinx
👤
欢迎使用 Ainsteinx
登录

切换语言

货币

首页
博客
服务
>>> 深度强化学习
第 12 / 13 课
第 12 课 · 策略与 Actor-Critic

进阶 Actor-Critic:DDPG、TD3、SAC、PPO

实际项目中最常用的 4 个算法。

DDPG 和 TD3 为连续动作学习确定性策略,SAC 加入熵让策略保持多样,PPO 则限制每次更新时策略的变化幅度。

代码中,当比值为 1.8(超过 1.2)时,优势为正的动作被裁剪(梯度为 0),而优势为负的动作仍有把它拉回的梯度。

算法Policy学习方式特点
DDPGDeterministicOff-policy用于连续动作的 DQN,加入高斯噪声进行探索
TD3DeterministicOff-policy① 双 Q ② 目标动作加噪声 ③ 延迟更新策略
SACStochasticOff-policy加入熵:用最多样化的策略获得高奖励
PPOStochasticOn-policy裁剪目标限制策略变化,因此同一批数据可以多次更新
SAC : J(π) = E[ Σ γᵗ ( rₜ + α·H(π(·|sₜ)) ) ] PPO : rₜ(θ) = πθ(aₜ|sₜ) / πθ_old(aₜ|sₜ) L = E[ min( rₜ·Âₜ , clip(rₜ, 1−ε, 1+ε)·Âₜ ) ]

要点

  • 连续动作 + 节省样本 → TD3 或 SAC
  • 想要稳定且适用面广的方法 → PPO
deep-rl-ep12-ddpg-td3-sac-ppo.py
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
  • #ບອກຕໍ່ຄວາມຮູ້