强化学习(四)--DDPG算法
上一篇文章介绍了PG算法大类的Reinforce算法,它是一种基于MC更新方式的算法,而它的另一大类是基于Actor-Critic算法,它是一种基于TD更新方式的算法。这一篇文章就来介绍AC算法中应用最多的DDPG算法,它可以直接输出确定性的连续形动作。
1. DDPG算法
详细的算法介绍还是推荐科老师的课程(公开课地址),TD更新方式是指每一个episode的每一个step都进行算法的更新。
DDPG算法有Actor网络和Critic网络,Actor网络输出浮点数,表示确定性的策略,Critic网络则是负责对Actor网络输出的动作进行评价(也就是我们常用的Q值),它的结构图如下图:
- Actor网络: 根据Critic网络的评分来更新策略网络;
- Critic网络: 在每一个step对Actor网络输出的动作评分,根据与环境的reward来调整网络的评估策略,最大化未来总收益。

因此,可以得出优化Actor网络、Critic网络的Loss函数为:
- Actor网络:Loss = -Q;
- Critic网络:Loss = MSE(Q估计,Qtarget).
要注意的是,也可以将DQN中的Target Network和Replay Memory引入到DDPG中,因此需要建立四个神经网络:Critic网络、Target_Critic网络、Actor网络、Target_Actror网络。因此,整个DDPG的框架如下图:

这个框架很清晰的讲解了DDPG算法的核心,可以多看几遍深入了解。
2. DDPG算法代码
如果搞懂了DDPG算法的核心内容,要实现它还是挺容易的,参考前几节的DQN算法,这里直接上完整代码,结合注释很清晰的能看懂:
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import gym
##################### hyper parameters ####################
EPISODES = 1000 # 进行多少个Episode
STEPS = 200 # 每个Episode进行多少step
TEST = 5 # 测试时进行多少个Episode
LR_ACTOR = 0.001 # Actor和Critic的学习率
LR_CRITIC = 0.002
GAMMA = 0.9
MEMORY_CAPACITY = 10000 # 经验池的大小
BATCH_SIZE = 32 # 从经验池中取出每个bath的数量
ENV_NAME = 'Pendulum-v0'
env = gym.make(ENV_NAME)
env = env.unwrapped # 用env.unwrapped可以得到原始的类,原始类想step多久就多久,不会200步后失败:
env.seed(1) # 随机种子
s_dim = env.observation_space.shape[0] # 状态的个数
a_dim = env.action_space.shape[0] # 动作的个数
a_bound = env.action_space.high # 动作的上下限
a_low_bound = env.action_space.low
TAU = 0.01 # 用于target网络软更新的参数
########################## DDPG Framework ######################
# # # # Actor策略网络的模型,2层全连接层 # # # #
class ActorNet(nn.Module):
def __init__(self, s_dim, a_dim):
super(ActorNet, self).__init__()
self.fc1 = nn.Linear(s_dim, 30)
self.fc1.weight.data.normal_(0, 0.1) # initialization of FC1
self.out = nn.Linear(30, a_dim)
self.out.weight.data.normal_(0, 0.1) # initilizaiton of OUT
def

本文介绍了DDPG算法,包括其工作原理、Actor和Critic网络的职责,以及如何通过损失函数进行网络优化。此外,文章还提供了DDPG算法的代码实现,并展示了在‘Pendulum-v0’环境中的应用效果,验证了算法的有效性。
最低0.47元/天 解锁文章
834

被折叠的 条评论
为什么被折叠?



