强化学习(三)--Reinforce算法
前两节的Q-learning和DQN算法都是强化学习中的Value-based的方法,它们都是先经过Q值来选择动作,而在强化学习中还有另外一大类算法:Policy-based。而在Policy-based算法中最著名的就是Policy Gradient,而Policy Gradient算法又可以根据更新方式分为两大类:
- MC更新方法:Reinfoce算法;
- TD更新方法:Actor-Critic算法;
1. Reinforce算法
详细的算法介绍还是推荐科老师的课程(公开课地址),以及李宏毅老师的Policy Gradient算法课程。
Reinfoce算法是基于MC更新方式的Policy Gradient算法。MC更新方式是指每完成一个episode才进行算法的更新,它是基于策略梯度的一种算法,策略梯度算法是指先找到一个评价指标,然后利用随机梯度上升的方法来更新参数使评价指标不断的上升。随机梯度上升算法公式如下:
对于式中 q 的不同改进形成了各种算法,而在Reinfoce算法中则是利用未来总收益Gt来代替q值,表示t步骤后回报的总和,因此Reinfoce的算法公式如下:
其中,如果 Gt 大于零,参数更新的方向会增加它在当前状态的概率。意思就是如果回报是有利的,就增加这个动作出现的概率。并且回报越大,梯度更新的幅度越大,概率增加的也就越大。它的算法伪代码如下:
2. Reinforce算法的代码实现
这里使用的环境是gym中的 ‘CartPole-v0’,Reinforce算法的整体框架如下图:
- Net类:神经网络的搭建;
- RF类:Reinfoce算法的主要更新步骤和动作的选取函数;
- test_episode函数:测试算法效果时的函数;
- main函数:主函数。
2.1 Main函数的实现
主函数主要实现 run episode的过程,首先定义RF的类,然后进行3000个episode的循环,每个episode最多进行300个step,要注意的是:
- 每个episode中的每个step与环境进行交互的数据都要进行记录 (s,a,r);
- 每个episode结束后才进行网络的训练;
每100个episode进行一次测试,也就是运行test_episode函数,代码如下:
def main():
# 初始化RF类
agent = RF(env)
# 进行训练
for episode in range(EPISODE):
obs = env.reset()
for step in range(STEP):
# 与环境的交互
action = agent.choose_action(obs)
next_obs,reward,done,_ = env.step(action)
# 存储一个episode中每个step的s,a,r
agent.store_transition(obs,action,reward)
# 进入下一个状态
obs = next_obs
# 每个episode结束再进行训练(MC)
if done:
agent.learn()
break
# 每100个episode进行测试
if episode % 100 == 0:
avg