莫烦 强化学习课程代码笔记
本文档为第一版,后续还会修改,修改后的文档会
放入 Github 中
本文档是针对莫烦老师深度学习课程(Reinforcement Learning)
视频做的笔记
编者:何志强
1603868203@qq.com
https://github.com/18279406017
2018.10.09
目录
1.Q-Learning............................................................................................................................... 3
2.Sarsa......................................................................................................................................... 6
3.Sarsa lambda............................................................................................................................ 6
4.Deep Q Network...................................................................................................................... 8
5.Double DQN.......................................................................................................................... 14
6.Policy Gradients.....................................................................................................................17
7.Actor Critic............................................................................................................................ 19
8.DDPG.....................................................................................................................................22
1.Q-Learning
首 先 放 上 相 关 文 件 代 码 链 接
https://github.com/18279406017/Reinforcement-learning-with-tensorflow/tree/master
/contents/2_Q_Learning_maze
Maze_env.py 文件编写的是相当于一个游戏环境,大概长下图这个样子:
Observation:Observation 打印出来也是四个维度的。
Action:Action 的维度是四维的,代表上下左右等等。
Reward:黄色的是天堂 (reward 1), 黑色的地狱 (reward -1),其他的
(Reward 0)。
RL_brain.py
在这个文件里面编写的就是 Q-learning 的核心算法。
里面主要包含的就是两个函数:choose_action 函数接收当前观测值,返回一
个动作;Learn 函数接收四个值:当前状态,依据当前状态选择的动作,选择动
作加入到环境中后得到的奖励,选择动作后环境切换到的下一个状态。除此之外
还有一个函数 check_state_exist,用于检测 Q-learning 的表格中是否含有当前状
态。在编写函数之前,我们需要先定义一些参数:
1.
2.
3.
4.
5.
self.action=actions # 代表有多少个action,方便之后建立Q-table。
self.lr=learning_rate # 代表学习率。
self.gamma=reward_decay # 代表折扣因子。
self.epsion=e_greedy # 代表贪婪度。
self.q_table=pd.DataFrame(columns=self.action,dtype=np.float64)# 创建Q 表。
Columns:代表表的行标签。行标签代表的是 state 的名称,这里没有写。
我们将 q_table 打印出来的话长下图所示的样子:
0,1,2,3:代表的就是动作的标签。
前面的列表:代表的就是状态的值。
接下来我们详细解析一下这里面的几个代码函数:
Check_state_exist:
这个函数传入一个 state,如果这个 state 不在 q_table 中的话,我们就需要将
其加入到 q_table 中去。要完成这个功能的话,我们首先就需要去查看我们原来
的 q_table 中是否含有这个 state,也就是需要去查看行标签中是否含有这样一个
state(每一个 state 都有所有动作的值)。我们使用 q_table.index 去查看所有的行
的名称,如果行的名称里面没有当前 state 的话,我们就将其加入到 q_table 中去。
我们创建的当前 state 的初始值为 0,传入行标签,再用 append 函数将其加入到
q_table 中去。
Choose_action:
在 choose_action 函数中,我们传入的是一个 state,也是 observation,我们
需要返回的是一个 action。拿到一个 state 后我们首先就要去检查一下 q_table 中
是否含有当前的 state。之后我们需要依据贪婪度来选择动作,np.random.uniform
函数的意思是从 0-1 之间随机采样。Q_table.loc 是依据行名查看这一行的数据值。
随机排列一个序列,返回一个排列的序列(同一个 state, 可能会有多个相同的 Q
action value, 所以我们乱序一下)。reindex 使它符合新的索引。Idxmax 返回的是
最大的值对应的列标签,也就是我们的动作。
如果随机值不在贪婪度里面的话,那么我们就随机选择动作。
Learn:
Learn 函数的作用就是我们来依据算法更新 q_table 里面的数值(因为我们的
动作是依据 q_table 选择出来的,有效的更新算法能够帮助我们更好地玩好这个
方格游戏)。输入是四个值:这个时刻的 state s,依据这个时刻的 state 选择的动
作 a,在这个状态下选择这个动作获取到的奖励 r,在这个状态 s 下,采取动作 a
之后,状态更新到下一个状态 s_。我们首先依据已知参数[s,a],就可以得到 q_table
中对应的预测值。我们将其称为 q_predict。如果下个时刻会使得游戏终止
(Terminal)的话,我们的目标奖励 q_target 就是当前依据状态 s,采取动作 a 得到
的奖励 r, 如果没有终止的话,那么的目标奖励 q_target 就是当前奖励 r,加上
折扣因子 gamma 乘以下一个时刻所能得到的最大奖励。最终地话我们更新我们
当前 state s,采取动作 a 后所能得到的奖励,也就是更新 q_table。到现在为止的
话我们可以通读一下 q_learning 算法的更新公式:
Run_this.py
这个文件下面是强化学习的大体思想。
首先初始化一个状态 observation;之后依据这个 observation 选择一个动作;
将动作加入到环境中后,得到奖励以及环境变化后的下一个状态。这样依次迭代
循环,就可以得到 Q-learning 算法的伪代码。
2.Sarsa
首 先 放 上 相 关 文 件 代 码 链 接 :
https://github.com/18279406017/Reinforcement-learning-with-tensorflow/tree/master
/contents/3_Sarsa_maze
Sarsa 的决策部分和 Q learning 一模一样, 因为我们使用的是 Q 表的形式
决策, 所以我们会在 Q 表中挑选值较大的动作值施加在环境中来换取奖惩. 但
是不同的地方在于 Sarsa 的更新方式是不一样的.
具体的不同表现在下面两个方面:
从上图可以看出来,Sarsa 在更新的时候对下一个状态所能得到的奖励是实
际的真的能得到的奖励,而在 Q-learning 是选择的最大值,但是实际的时候有可
能并不能选择到最大值(存在贪婪度的一个问题)。由于需要得到下一个状态采
取的动作,所以我们需要在 Run_this.py 做相应的改变。
在上图中 sarsa 相对 q-learning 做的改变就是将下一个 state: observation_,依
据 observation_选择出对应的动作,再将其放入 sarsa 算法中对 q_table 进行更新。
3.Sarsa lambda
首 先 放 上 相 关 文 件 代 码 链 接 :
https://github.com/18279406017/Reinforcement-learning-with-tensorflow/tree/master
/contents/4_Sarsa_lambda_maze
除了与 sarsa 一样之外,sarsa lambda 还多了一张与 q_table 一模一样的表,
这里把它叫做 self.eligibility_trace。如下图所示:
由于我们现在有两张表了,所以我们需要稍微改变一下 check_state_exist 函
数:
主要改动的地方就是在加入新的状态到 q_table 中的时候,也需要将其加入
到 self.eligibility_trace 里面。之后我们需要改的就是 sarsa 算法的更新部分。
Method 1 的意思就是:每次经历过[s, a]这个状态的话,就将 self.eligibility
表格中对应[s, a]的这个值加 1,并且没有上限。
Method 2 的意思就是:每次经历过[s, a]这个状态的话,就先将行索引中的
当前状态 s 的值全部清 0。之后再将 self.eligibility_trace 表格中对应[s, a]的这个
值加 1,上限就被限制为 1。
接下来的话再更新 q_table 的值,sarsa lambda 与 sarsa 的不同之处在于 sarsa
是没有乘 self.eligibility_trace 这个表格,而 sarsa lambda 是乘了这个表格。
4.Deep Q Network
首 先 放 上 相 关 文 件 代 码 链 接 :
https://github.com/18279406017/Reinforcement-learning-with-tensorflow/tree/master
/contents/5_Deep_Q_Network
在学习下面的相关代码之前呢,需要了解一点点的 tensorflow 编写神经网络
的知识,这样的话看起来就会比较方便,如果您还没有学习 tensorflow 的话,也
没有关系,我之前解析了 tensorflow 官方文档的一些代码,可以在我的 CSDN,
也就下面的链接中找到:
https://blog.csdn.net/weixin_39059031/article/category/8076812
和之前一样,我们有三个文件 Maze_env.py: 强化学习交互的环境对象,
RL_brain.py : 强化学习核心算法部分,run_this.py :强化学习与环境交互迭
代部分。
Maze_env.py
这里的环境和之前的一样,也是九宫格的那个,就不说了。
RL_brain.py
在这个文件下面主要是写了强化学习的大脑部分,内部有五个函数:
def _bulid_net(): 构建神经网络架构,里面有两个结构一模一样的神经网络,
被称为目标网络(Target network),和评估网络(Eval network)。
def _store_transition(): 这个函数里面主要是用于存储强化学习与环境交互
之后得到的数据,也叫做强化学习智能体的记忆。
choose_action():选择动作,依据观测的状态作为输入,然后再将输入传入神
经网络中计算应该采取哪一步动作。
Learn(): 强化学习策略的学习过程,其实就是神经网络如何进行迭代更新的
部分。
plot_cost():绘制强化学习的 loss 曲线。
在开始之前,我们需要定义先导入一些模块,然后定义一些强化学习需要的
参数,如学习率,折扣因子等等这些。在这里我们采用 class 类的编写方式: