DDPG是强化学习里的一种经典算法。关于算法的原理我在之前的文章里有详细介绍过: 强化学习入门8—深入理解DDPG 。
在学习莫凡大神的教程中,莫凡大神用的是tensorflow实现的DDPG。因为平时使用pytorch较多,且大神当时使用的tensorflow版本也较低,于是便借此使用pytorch复现一下DDPG。
注意:本文参考的是莫凡大神的tf版本的代码,指路👉 https://mofanpy.com/tutorials/machine-learning/reinforcement-learning/intro-DDPG/
回顾DDPG
DDPG即Deep Deterministic Policy Gradient,确定性策略梯度算法。它结构上基于Actor-Critic,结合DQN算法的思想,使得它不仅可以处理离散型动作问题,也可以处理连续型动作问题。
实现
话不多说,直接上代码
首先是定义Actor和Critic两个网络。
结合上面的图,Actor的输入是当前的state,然后输出的是一个确定性的action。
class Actor(nn.Module):
def __init__(self, state_dim, action_dim, action_bound):
super(Actor,self).__init__()
self.action_bound = torch.FloatTensor(action_bound)
# layer
self.layer_1 = nn.Linear(state_dim, 30)
nn.init.normal_(self.layer_1.weight, 0., 0.3) # 初始化权重
nn.init.constant_(self.layer_1.bias, 0.1)
self.output = nn.Linear(30, action_dim)
self.output.weight.data.normal_(0.,0.3) # 初始化权重
self.output.bias.data.fill_(0.1)
def forward(self, s):
a = torch.relu(self.layer_1(s))
a = torch.tanh(self.output(a))
# 对action进行放缩,实际上a in [-1,1]
scaled_a = a * self.action_bound
return scaled_a
在动作输出这里,加了一个 action bound
在,只是用于限制一下action的范围。
Critic网络输入的除了当前的state还有Actor输出的action,然后输出的是Q-value,即 Q(s,a)
class Critic(nn.Module):
def __init__(self, state_dim, action_dim):
super(Critic,self).__init__()
n_layer = 30
# layer
self.layer_1 = nn.Linear(state_dim, n_layer)
nn.init.normal_(self.layer_1.weight, 0., 0.1)
nn.init.constant_(self.layer_1.bias, 0.1)
self.layer_2 = nn.Linear(action_dim, n_layer)
nn.init.normal_(self.layer_2.weight, 0., 0.1)
nn.init.constant_(self.layer_2.bias, 0.1