强化学习策略梯度梳理4-SOTA中(DDPG TD3 SAC SAC-dicrete 附代码)

本文梳理强化学习中的策略梯度方法,包括DDPG、TD3和SAC。DDPG适用于连续动作空间,而TD3通过双网络和延迟更新改进了DDPG。SAC引入最大熵强化学习,鼓励智能体的探索。文章提供了相关代码实现。


notice!这个系列的梯度回传和前面完全不是一个套路了。

强化学习策略梯度梳理-SOTA中

同前文
这个部分仍然参考周博磊老师的第六节的顺序
主要参考课程 Intro to Reinforcement Learning,Bolei Zhou
相关文中代码 https://github.com/ThousandOfWind/RL-basic-alg.git
DDPG和TD3的实现参考了Addressing Function Approximation Error in Actor-Critic Methods,TD3作者的代码非常清晰明了!
SAC主要参考openai的官方tutorialpytorch复现版本code , pytorch复现版本2

进阶方向2

Q-learning

这里标出Q-learning只是为了强调DQN的target网络结构和经验池。

然而尽管和DQN关系匪浅,这里的算法都主要适用于连续控制

DDPG

DDPG很好的继承了DQN的特性,如果DQN用的多其实是很好理解DDPG结构的。

  1. critic网络用于估计Q值,利用奖赏值更新
  2. actor网络用于估计动作,利用 − c r i t i c ( s , a c t o r ( s ) ) -critic(s,actor(s)) critic(s,actor(s))更新
连续动作空间

代码这里需要注意的是,和上一个系列不同,DDPG这里actor 和critic网络是分别训练的。

        self.Q = DDPG_Critic(param_set)
        self.actor = DDPG_Actor(param_set)

        self.targetQ = copy.deepcopy(self.Q)
        self.targetA = copy.deepcopy(self.actor)

        self.critic_optimiser = Adam(params=self.Q.parameters(), lr=self.learning_rate)
        self.actor_optimiser = Adam(params=self.actor.parameters(), lr=self.learning_rate)
        currentQ = self.Q(obs, action_index)
        targetQ = (reward + self.gamma * (1-done) * self.targetQ(next_obs, self.targetA(next_obs))).detach()
        critic_loss = F.mse_loss(currentQ, targetQ)
        self.writer.add_scalar('Loss/TD_loss', critic_loss.item(), self.step )


        # Optimize the critic
        self.critic_optimiser.zero_grad()
        critic_loss.backward()
        self.critic_optimiser.step()

        actor_loss = - self.Q(obs, self.actor(obs))
        self.writer.add_scalar('Loss/pi_loss', actor_loss.item(), self.step )

        self.actor_optimiser.zero_grad()
        actor_loss.backward()
        self.actor_optimiser.step()

另外target网络一般采用软更新方式

        for param, target_param in zip(self.Q.parameters(), self.targetQ.parameters()):
            target_param.data.copy_(self.tau * param.data + (1 - self.tau) * target_param.data)

        for param, target_param in zip(self.actor.parameters(), self.targetA.parameters()):
            target_param.data.copy_(self.tau * param.data + (1 - self.tau) * target_param.data)

这里有个我一直困惑的问题,当动作时连续的时候显然critic到actor的梯度是通的,但是动作离散时,是怎样向actor回传梯度的呢?
软更新和硬更新各有什么优缺点呢?

离散动作空间 - 待学习

TD3(Twin Delayed DDPG)

这个就有点像Double DQN的扩展版本了
他的两个改进就如同名字

  1. Twin: Q值具有双网络,计算targetQ时,取更小的值
  2. delayed: 用更小的频率更新actor
        currentQ1, currentQ2  = self.Q(obs, action_index)
        targetQ1, targetQ2 = self.targetQ(next_obs, self.targetA(next_obs))
        targetQ = th.min(targetQ1, targetQ2)
        targetQ = (reward + self.gamma * (1-done) * targetQ).detach()
        critic_loss = F.mse_loss(currentQ1, targetQ) + F.mse_loss(currentQ2, targetQ)
        self.writer.add_scalar('Loss/TD_loss', critic_loss.item(), self.step )

      
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值