Policy-based方法是强化学习中与Value-based(比如Q-learning)相对的方法,主要是对一个回合(episode)的策略进行梯度下降,相关基础参考Datawhale-Policy Gradient。
其中REINFORCE是一个最基本的Policy Gradient方法,主要解决策略梯度无法直接计算的问题,参考REINFORCE和Reparameterization Trick,其伪代码如下:
程序源码参考github,下面简要解释一下。
首先可以看REINFORCE和Reparameterization Trick的REINFORCE部分,
REINFORCE的基本流程如下:
# from torch.distributions import Bernoulli
from torch.distributions import Categorical
probs = policy_network(state)
# Note that this is equivalent to what used to be called multinomial
m = Categorical(probs)
action = m.sample()
next_state, reward = env.step(action)
loss = -m.log_prob(action) * reward
loss.backward()
所以这里需要定义一个policy_network(具体在model.py
中),输入为state,输出为一个概率,用于action的采样,policy_network如下:
class FCN(nn.Module):
''' 全连接网络'''
def __init__(self,state_dim):
super(FCN, self).__init__()
# 24和36为hidden layer的层数,可根据state_dim, n_actions的情况来改变
self.fc1 = nn.Linear(state_dim, 36)
self.fc2 = nn.Linear(36, 36)
self.fc3 = nn.Linear(36, 1) # Prob of Left
def forward(self, x):
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = F.sigmoid(self.fc3(x))
return x
然后它是需要一个trajectory的state,action和reward进行梯度下降的,所以在训练的过程中需要用一个pool来存储:
'''下面带pool都是存放的transition序列用于gradient'''
state_pool = [] # 存放每batch_size个episode的state序列
action_pool = []
reward_pool = []
也可以存储不止一个episode的数据到pool中,可以设置程序中的batch_size
每次对多个trajectory的数据进行梯度下降,实验表明batch_size=5
的效果比较好。
然后定义一个类PolicyGradient
,主要包括choose_action
(选择动作)和update
(更新网络或者说学习),具体见agent.py
,最后在main.py
完善主程序接口就可以了,结果如下(可以使用tensorboard可视化):