强化学习策略梯度梳理-SOTA中
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的官方tutorial, pytorch复现版本code , pytorch复现版本2
进阶方向2
Q-learning
这里标出Q-learning只是为了强调DQN的target网络结构和经验池。
然而尽管和DQN关系匪浅,这里的算法都主要适用于连续控制!
DDPG
DDPG很好的继承了DQN的特性,如果DQN用的多其实是很好理解DDPG结构的。
- critic网络用于估计Q值,利用奖赏值更新
- 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的扩展版本了
他的两个改进就如同名字
- Twin: Q值具有双网络,计算targetQ时,取更小的值
- 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 )

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





