【新知源简介】知乎专栏强化学习大讲堂作者郭宪博士作了《强化学习从初级到高级》的讲座。我们为大家精选了第二节《基于Gym和Tensorflow的强化学习算法实现》。希望这对您有所帮助。同时,以郭贤博士等老师为老师的深度强化学习国庆集训营也将于10月2日至6日在北京举行。
基于gym和tensorflow的强化学习算法的实现
上一讲深入剖析了健身房环境建设与强化学习实践《健身房学习与二次开发第一讲——知乎专栏》。在本次讲座中,我们将使用gym和tensorflow来实现两个最经典的强化学习算法,qleanring和policy gradient-based方法。本课参考了莫凡的部分代码(见知乎问答《强化学习有哪些好的开源项目、网站和文章推荐?》),在此向他表示感谢。本次讲座分为两个小节。2.1节讲了用qlearning解决机器人找金币的问题(环境在上一节已经给出);2. 2小节以汽车倒立摆为例,详细讲解基于策略梯度的强化学习方法。之所以选择这两种方法,是因为它们都是经典算法,而寻找金币的机器人是典型的表格强化学习问题,而倒立摆是典型的状态空间连续强化学习问题。
第1节qlearning算法实现
1.1 qlearning 伪代码
qlearning算法是一种off-policy的基于价值函数的TD(0)强化学习算法。基于价值函数的强化学习算法的本质是更新价值函数。它的理论和伪代码已经在第四讲。现在让我们回顾一下:
图2.1 qlearning算法伪代码
从图2.1可以看出qlearning算法的实现可以分为以下几个关键点:行为值函数的表示、探索环境的策略、epsilon贪心策略、贪心值函数更新时选择动作的策略,值函数更新。下面,我将一一解释。
1.2 qlearning的行为值函数表示
对于表格强化学习算法,价值函数是一个表格。对于行为值函数,这张表可以看成是一张二维表,一张是状态,一张是动作。寻找金币的机器人示例:
状态空间为:[1,2,3,4,5,6,7,8]
动作空间为:[‘n’,’e’,’s’,’w’]
行为值函数可以用字典数据类型表示,其中字典的索引由状态-动作对表示。所以行为值函数的初始化为:
qfunc = dict() #行为值函数为qfun
对于状态中的 s:
对于一个 in 动作:
键 = “d%_s%”%(s,a)
qfun[key] = 0.0
1.3 探索环境的策略:epsilon 贪婪策略
代理通过 epsilon 的贪婪策略探索环境。epsilon 贪心策略的数学表达式为:
这个公式的python代码实现是:
def epsilon_greedy(qfunc, state, epsilon):
#首先找到最大动作
amax = 0
key = “%d_%s”%(状态,动作[0])
qmax = qfunc[键]
for i in range(len(actions)): #扫描动作空间得到最大动作值函数
key = “%d_%s”%(状态,动作[i])
q = qfunc[键]
如果 qmax
qmax = q
amax = 我
#概率部分
pro = [0.0 for i in range(len(actions))]
pro[amax] += 1-epsilon
对于我在范围内(len(actions)):
pro[i] += epsilon/len(动作)
##根据上面的概率分布选择动作
r = random.random()
s = 0.0
对于我在范围内(len(actions)):
s += 亲[i]
如果 s>= r:返回动作[i]
返回动作[len(actions)-1]
从上面的代码注释可以看出,代码可以分为3个小节:第一个小节是先找到当前状态下最大的action;第二小节为每个动作分配一个概率;第三小节是根据概率分布对动作进行采样。
1.4 值函数更新时,选择动作的贪心策略
选择动作的贪心策略是在状态为s’时选择价值函数最大的动作。它的python实现是:
def 贪婪(qfunc,状态):
amax = 0
key = “%d_%s” %(状态,动作[0])
qmax = qfunc[键]
for i in range(len(actions)): # 扫描动作空间得到最大动作值函数
key = “%d_%s” % (状态,动作[i])
q = qfunc[键]
如果 qmax
qmax = q
amax = 我
返回动作[amax]
这段代码和前面的代码差不多,不同的是取的状态值不同。这段代码的状态就是当前状态s的下一个状态s’。另外,DQN所做的改变是用于选择行为的价值函数网络,称为目标价值函数网络,不同于当前的价值函数网络。
1.5 值函数更新
价值函数更新公式为:
代码实现为:
键 = “%d_%s”%(s, a)
#与环境交互一次基于q学习算法和bp神经网络的倒立摆控制,从环境中获取新的状态和奖励
s1, r, t1, i = grid.step(a)
键1 = “”
#s1 的最大动作
a1 = 贪心(qfunc, s1)
key1 = “%d_%s”%(s1, a1)
#使用qlearning方法更新值函数
qfunc[key] = qfunc[key] + alpha*(r + gamma * qfunc[key1]-qfunc[key])
点评:对于表值函数的更新过程,我们看到每次更新只影响表中的一个值,而不影响行为值函数的其他值,这与行为值函数逼近方法不同。表格强化学习算法非常有效,通常在几次迭代后收敛。有关完整代码,请参阅 github.gxnk 中的 qlearning。qlearning 算法的测试在文件 learning_and_test.py 中
第二节:基于策略梯度算法的实现详解
这部分需要用到tensorflow和绘图库,所以我们先安装tensorflow的cpu版本。
2.1张量流安装:
Step1:在终端激活虚拟环境(如何安装在上一讲):source activate gymlab
Step2:安装的tensorflow版本为1.0.0,python=3.5如下命令:
按照这个命令安装的tensorflow是不带gpu的,不带gpu的tensorflow学习是没有障碍的。当然,如果你在做项目,建议安装 tensorflow 的 gpu 版本。
Step3:安装绘图模块,命令为:
pip3 安装 matplotlib
2.2 策略梯度算法的理论基础
本专栏的第 6 讲已经给出了策略梯度的理论推导,其中指出随机策略的梯度由下式给出:
当随机策略是高斯策略时,第六讲已经给出了随机梯度的计算公式。随机策略非高斯时如何优化参数?
小车的倒立摆系统如下图2.2所示。
图2.2 小车倒立摆系统
在上一节中,我们深入剖析了健身房环境的建设。从汽车倒立摆的环境模型可以很容易看出汽车倒立摆的状态空间为
,动作空间为
,作用为1时,施加10N的正力;当动作为0时,施加-10N的负力。
因为动作空间是离散的,我们设计了一个随机策略作为softmax策略。Softmax 策略是如何构建的,以及损失函数是如何构建的,将强化学习问题变成了优化问题。
2.3 软策略及其损失函数
我们设计了一个前向神经网络策略,如图 2.3 所示。
图2.3 softmax策略
神经softmax策略的输入层为汽车倒立摆的状态,维度为4;最后一层是softmax层,维数为2。机器学习的同学很清楚softmax经常被用作多分类器的最后一层。
最基本的概念之一是什么是 softmax 层?
如图2.3,设layer2的输出为z,所谓softmax层是指对z应用一个softmax函数。这是:
对于softmax策略,策略梯度理论中的随机策略为:
如图2.3所示,对应layer2的输出。
表示动作a对应的softmax输出。上面的公式给出了智能体在状态 s 采取行动 a 的概率。该公式是 的函数,可以直接对数求出,然后将推导带入策略梯度公式,利用策略梯度理论进行参数更新。但是,在这里我们转换问题。对于一个情节,策略梯度理论的一步更新实际上是一个损失函数
一步更新。
损失函数可以写成:
在
是交叉熵。
在实际计算中,
通过未更新的参数策略网络进行采样,
就是直接带状态,是参数的函数。例如,当前动作由采样网络决定
, 导致 a=1; 然后
,
,但
这是从信息论中的交叉熵的角度来理解softmax层。理论部分暂时介绍到这里,接下来我们关心的是如何将理论转化为代码。
上面,我们已经将策略梯度方法转化为一个分类问题的训练过程,其中损失函数为:
那么这个网络的输入数据是什么?
有三个输入数据:
一:小车倒立摆的状态
二:作用在小车上的动作
第三:每个动作对应的累积奖励v
我们一一解释这些输入是如何获得的。
首先,通过与环境交互得到汽车倒立摆的状态s;其次,通过采样网络获得作用在汽车上的动作a,在训练过程中充当标签;最后,每个动作的累积奖励是通过对动作后的累积奖励进行累积和归一化得到的。
因此,代码可以分为几个关键函数:策略神经网络的构建,动作选择函数,损失函数的构建,以及累积奖励函数v的处理。下面我们描述如何做一个一个。
2.4 基于tensorflow的策略梯度算法实现
政策网络建设
构建神经网络的最简单方法是使用现有的深度学习软件。这里我们选择tensorflow是因为兼容性和通用性。我们要构建的策略网络结构如图2.4所示:
图2.4 策略神经网络
神经网络是最简单的前向神经网络基于q学习算法和bp神经网络的倒立摆控制,输入层是状态s,一共4个神经元,第一个隐藏层包括10个神经元,激活函数是relu。因为输出的是动作的概率,并且有两个动作,第二层是2个神经元,没有激活函数,最后一层是softmax层。
将此代码翻译成 tensorflow 语言是:
def _build_net(self):
使用 tf.name_scope(‘input’):
#创建占位符作为输入
self.tf_obs = tf.placeholder(tf.float32, [None, self.n_features],)
self.tf_acts = tf.placeholder(tf.int32, [None, ],)
self.tf_vt = tf.placeholder(tf.float32, [无, ],)
#一级
层 = tf.layers.dense(
输入=self.tf_obs,
单位=10,
激活=tf.nn.tanh,
kernel_initializer=tf.random_normal_initializer(mean=0, stddev=0.3),
bias_initializer=tf.constant_initializer(0.1),
名称=’fc1’,
)
#二楼
all_act = tf.layers.dense(
输入=层,
单位=self.n_actions,
激活=无,
kernel_initializer=tf.random_normal_initializer(mean=0, stddev=0.3),
bias_initializer=tf.constant_initializer(0.1),
名称=’fc2′
)
#使用softmax函数得到每个动作的概率
self.all_act_prob = tf.nn.softmax(all_act,)
所有代码都可以在 github 上的 policynet.py 文件中看到。
动作选择功能:
动作选择函数根据采样网络生成概率分布,并使用该概率分布对动作进行采样。具体代码为:
#定义如何选择行为,即状态s处的行为采样。根据当前行为概率分布抽样
def 选择动作(自我,观察):
prob_weights = self.sess.run(self.all_act_prob, feed_dict={self.tf_obs:observation[np.newaxis,:]})
# 根据给定的概率采样
动作 = np.random.choice(范围(prob_weights.shape[1]), p=prob_weights.ravel())
返回动作
函数 np.random.choice 是一个根据概率分布 p=prob_weights.ravel() 进行采样的函数。
损失函数的构造:
在理论部分我们已经说过损失函数是
也就是说,交叉熵乘以累积奖励函数。以下是代码部分:
#定义损失函数
使用 tf.name_scope(‘loss’):
neg_log_prob = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=all_act,labels=self.tf_acts)
损失 = tf.reduce_mean(neg_log_prob*self.tf_vt)
累积奖励函数 v 的处理:
def _discount_and_norm_rewards(self):
#折扣退货和
discounted_ep_rs =np.zeros_like(self.ep_rs)
running_add = 0
对于 t 反转(范围(0,len(self.ep_rs))):
running_add = running_add * self.gamma + self.ep_rs[t]
discounted_ep_rs[t] = running_add
#标准化
discounted_ep_rs-= np.mean(discounted_ep_rs)
discounted_ep_rs /= np.std(discounted_ep_rs)
返回 discounted_ep_rs
有了策略神经网络、动作选择函数、损失函数、累积奖励函数,学习过程很简单,只需要调用一个语句:
#定义训练,更新参数
使用 tf.name_scope(‘train’):
self.train_op = tf.train.AdamOptimizer(self.lr).minimize(loss)
训练过程是一种使用自适应动量的优化方法。学习优化的过程如下:
#Learning为了更新策略网络参数,在一个episode之后学习
定义学习(自我):
# 计算一集的贴现回报
discounted_ep_rs_norm = self._discount_and_norm_rewards()
#调用训练函数更新参数
self.sess.run(self.train_op, feed_dict={
self.tf_obs: np.vstack(self.ep_obs),
self.tf_acts: np.array(self.ep_as),
self.tf_vt: discounted_ep_rs_norm,
})
#清除剧集数据
self.ep_obs,self.ep_as,self.ep_rs = [],[],[]
返回 discounted_ep_rs_norm
2.5 基于策略梯度算法的倒立摆问题
有了政策网络和培训流程,解决汽车问题就很简单了。基本框架是:
1. 创建环境
2. 生成策略网络
3. 迭代学习
学习通过与环境交互来更新策略网络参数
4. 使用学习到的策略网络测试购物车倒立摆系统
使用 softmax 策略定义一个贪心策略。
具体代码在github上的learning_cartpole.py文件中。
本次讲座结束。
PS:这部分有点乱。强烈建议大家去github下载代码。我发表了中文评论。您可以更改参数并亲自体验。所有代码都在 github gxnk/reinforcement-learning-code 上的第一个讲座文件夹中。
国庆深度强化学习实战训练营
深度强化学习国庆集训营将于10月2日至6日在北京举行。
报名请扫描上图中的二维码。
潭岭教育科技于8月初成功举办了首期强化学习入门进阶培训班,受到学员们的一致好评。根据学生的反馈和我们最新的教学和研究成果,我们对课程进行了进一步的升级和改进。国庆期间,专门开展了为期五天的强化学习特训营。通过五天的理论讲解和编程实践,帮助大家对强化学习技术有了全面系统的认识和掌握。
面向对象:强化学习初学者,初学者,有一定基础但尚未建立系统知识体系的人,以及对强化学习感兴趣的其他人。有一定的微积分、线性线性代数、概率论基础、python编程基础。学生需要自带电脑上课。
上课时间地点:北京市海淀区10.2-10.6(具体地点另行通知)
招生人数:精品小班制,最多30名学生,15名以上学生一个班。
学费:7999早鸟票7499(9.24日前报名)
特别声明:凡报名参加本次国庆特训营的学员,一年内均可免费参加我司主办的两次为期两天的线下课程(价值5999元)。
导师:
郭宪,南开大学计算机与控制工程学院博士后。2009年毕业于华中科技大学机械设计制造及其自动化专业。同年,他被派往中国科学院沉阳自动化研究所攻读硕士和博士学位,研究方向为机器人动力学建模与控制。在国内外知名期刊和会议上发表论文10篇。2016年以来,郭博士一直专注于机器人智能感知和智能决策。目前主持两个国家级项目,涉及深度学习、深度强化学习等智能算法在机器人领域的应用。2017 年 3 月,博士。郭在知乎栏目开始加强学习知识讲座,通俗易懂的讲解受到了广大知识分子的好评。即将出版的《强化学习讲解深入浅出的教程》一书。
知道链接:
Traffas,2014年7月获得瑞典皇家理工学院硕士学位,曾在瑞典Accedo从事程序开发工作,现为香港理工大学计算机系研究助理。Traffas 的研究兴趣是机器学习和强化学习。发表论文6篇,其中中国计算机学会推荐B类论文1篇,C类会议论文1篇。
日程:
第一天:特拉法斯老师
1. 什么是强化学习以及强化学习方法的总结?
强化学习让 AlphaGo 在没有人类指导的情况下通过“对战”来学习更好的围棋技能;它可以让机器人的动作不再需要复杂的人工编程,并且可以适应它所处的环境。为什么强化学习有这么神奇的力量?强化学习到底是什么?本课将告诉你这个故事……
2. 强化学习领域的基本概念。
解锁强化学习领域的术语。介绍强化学习可以解决的问题。介绍贝尔曼方程的原理,介绍强化学习与动态规划的异同。介绍传统的基于管状的强化学习。
3.安装Python简介2.7+Anconda+jupyter Notebook
4. 动手编写第一个用于强化学习的 python 程序(30 分钟),以找到玩老虎机的最佳策略。
5. 蒙特卡洛强化学习、同策略和异策略强化学习算法简介。
6.问答、交流
第 2 天:特拉法斯老师
1、强化学习算法练习,玩基于强化学习的二十一点游戏和gridworld游戏。
2、 强化学习时间差分算法。介绍同策略Q-learning强化学习方法和异策略Sara算法。比较和蒙特卡洛算法的异同。介绍资格树和TD(lamda)算法。
3、 健身房环境搭建和强化学习算法实现。包括 Gym 环境的安装和测试,Gym 环境的关键功能讲解以及如何创建自定义的 Gym 环境。
4、 学生动手实践
5、 教师答疑并交流。
第 3 天:特拉法斯老师
1、DQN 详细信息
DQN 是深度强化学习的有力武器。DeepMind 团队使用 DQN 技术使计算机在 Atari 视频游戏中的表现优于人类顶级玩家。同时,我们将解释 DQN、Double DQN、Prioritized Replay 和 Dual DQN 的变体。
2、练习准备
介绍深度神经网络DNN和RNN。Keras安装,动手设计RNN网络解决分类问题。
3、深度强化学习在实践中,写一个可以靠自己打败游戏高手的AI。
4、Bug调试,老师答疑,指导,交流。
第四天:郭贤老师
1、策略梯度法:
教学内容包括:策略梯度法介绍、似然率策略梯度推导和重要性抽样视角推导、似然率策略梯度的直观理解、常用策略表示、常用降低方差的方法:引入基函数法、修改估计值函数法
2、编程实践课:基于tensorflow和gym实现汽车倒立摆系统和乒乓球比赛
3、TRPO方法的介绍与推导:包括替代奖励函数的构建、单调改进策略、TRPO实用算法的介绍、寻找可行方向的共轭梯度法、PPO法、以及基于python的TRPO方法的实现
4、编程指导、交流、问答。
第五天:郭贤讲师
1、AC方法,具体内容包括随机策略与确定性策略的比较,随机策略AC的方法,确定性策略梯度法,DDPG方法及其实现,A3C方法的讲解,以及基于python的DDPG方法的实现。
2、AC方法和DDPG,A3C实现。
3、逆强化学习简介,包括逆强化学习分类、学徒学习、MMP法、结构化分类法、神经逆强化学习、最大熵逆强化学习、相对熵逆强化学习、深度逆强化学习。
4、编程指导、问答、交流。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网