logo资料库

莫烦强化学习部分算法代码解析.pdf

第1页 / 共24页
第2页 / 共24页
第3页 / 共24页
第4页 / 共24页
第5页 / 共24页
第6页 / 共24页
第7页 / 共24页
第8页 / 共24页
资料共24页,剩余部分请下载后查看
1.Q-Learning
2.Sarsa
3.Sarsa lambda
4.Deep Q Network
5.Double DQN
6.Policy Gradients
7.Actor Critic
8.DDPG
莫烦 强化学习课程代码笔记 本文档为第一版,后续还会修改,修改后的文档会 放入 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 类的编写方式:
分享到:
收藏