本篇文章6198字,读完约15分钟
本文是首次在微信公共平台上发表:新智元。 文案是作者个人的观点,不代表网络的角度。 投资者据此,风险请自己承担。
上次深入分析了gym环境的构筑强化学习实战“第一届gym学习和二次开发-知乎专栏”。 这是利用gym和tensorflow实现基于两个最经典的增强学习算法qleanring和战略梯度的方法。 本课参考了一些令人讨厌的代码(参见知乎问答“强化学习”,推荐使用什么好的开源项目、网站和副本? 》),在此表示感谢。 这个故事分为两小节,2.1小节以qlearning的做法处理机器人寻找金币(这个环境已经在前一节给出了)。 在2.2节中,以小型车的倒立摆为例,详细说明基于政策梯度的强化学习方法。 之所以选择这两种方法,是因为考虑到两种方法都是经典的算法,以及机器人寻找金币是典型的表型强化学习问题,推车的倒立摆是典型的状态空间连续型强化学习问题。
节q学习算法的实现。
1.1 q学习伪代码
qlearning算法是基于off-policy值函数的td(0)强化学习算法。 基于值函数的强化学习算法的本质是更新值函数。 其理论和伪代码已经在第四届给出了。 现在让我们回顾一下
从图2.1可以看出,qlearning算法的实现可以分为以下重点。
行为值函数的表现、搜索环境的战略、epsilon贪婪战略、值函数更新时选择动作的贪婪战略、值函数更新。 接下来,逐一说明。
1.2 q学习的行为值函数表示
表型强化学习算法时,值函数是表。 关于行为值函数,这个表可以看作二维表,其中一维是状态,另一维是动作。 关于机器人寻找金币的例子:
状态空之间是: [ 1,2,3,4,5,6,7,8 ]
动作空之间: ['n ',' e ',' s ',' w']
动作值函数可以用词典数据类型表示。 词典的索引由状态-行为对表示。 这个动作值函数的初始化如下。
qfunc = dict ( ) #行的值函数是qfun
for s in states :
for a in actions :
key =“d % _ s %”( s,a )
qfun[key] = 0.0
1.3环境搜索战略: epsilon贪婪战略
代理通过eplilon贪婪战略探索环境,epsilon贪婪战略的数学公式如下
#首先找到最大行动
amax = 0
key = "%d_%s"%(state,actions[0] )
qmax = qfunc[key]
for i in range(len(actions ) ) :在#扫描动作空之间得到最大动作值的函数
key = "%d_%s"%(state,actions[i] )
q = qfunc[key]
if qmax q :
qmax = q
amax = i
#概率部分
pro = [ 0.0 foriinrange ( len ( actions ) ) ]
pro[amax] += 1-epsilon
for i in range(len(actions ) ) :
pro[i] += epsilon/len(actions )
根据##上的概率分布选择动作
r = random.random ( )
s = 0.0
for i in range(len(actions ) ) :
s += pro[i]
if s = r: return actions[i]
return actions[len(actions)-1]
从上面的代码注释可以看出,这个代码可以分为三个短语。 第一个短语是在当前状态下首先找到最大的动作。 第2短语对各动作分配概率第3短语根据概率分布对一个动作进行采样。
1.4值函数更新时,选择行动的贪婪战略
选择动作的贪婪战略是选择状态为s’时值函数最大的动作。 python的实现如下。
def greedy(qfunc,state ) :
amax = 0
key = "%d_%s" % (state,actions[0] )
qmax = qfunc[key]
for i in range(len(actions ) ) :在#扫描动作空之间得到最大动作值的函数
key = "%d_%s" % (state,actions[i] )
q = qfunc[key]
if qmax q :
qmax = q
amax = i
return actions[amax]
这个分段代码和上层代码几乎一样,取的状态值不同。 该段码的状态是当前状态s的下一个状态s’。 另外,dqn进行的变更,将用于选择行动的值函数网络称为目标值函数网络,与现在值函数网络不同。
1.5值函数的更新
值函数的更新公式如下
#与环境对话,从环境中获得新的状态和收益
s1,R,t1,i =grid.step(a )
key1 = " "
#s1中的最大动作
a1 = greedy(qfunc,s1 )
key1 = "%d_%s"%(s1,a1 )
使用qlearning方法更新值函数
q func [ key ] = q func [ key ] + alph a * ( r + gamm a * q func [ key1]-q func [ key ] )
注释:在基于表的值函数更新过程中,我们发现每个更新只影响表中的一个值,不影响行为值函数的其他值。 这与动作值函数的近似方法不同。 表型强化学习算法是高效的,通常经过几次重复后收敛。 所有代码都参见github.gxnk上的qlearning。 qlearning算法的测试位于文件learning_and_test.py中
第二部分:基于战略梯度算法实现详细解
本节需要tensorflow和绘图库,所以首先安装cpu版的tensorflow。
2.1 tensorflow安装:
step1:在终端上激活虚拟环境(如何以前安装):source activate gymlab
step2:安装的tensorflow版本为1.0.0,python=3.5是以下命令:
pip3 install matplotlib
2.2战略梯度算法理论基础
本专栏的第六次给出了战略梯度的理论推导,但战略梯度理论表明随机战略的梯度由下式给出。
图2.2手推车倒立摆系统
上一节详细分析了gym环境的构建。 从购物车倒立的环境模型可以看出,购物车倒立的状态空之间为
,动作为1时,施加正方向的力10n。 动作为0时,施加负的力-10n。
由于操作空之间是离散的,因此随机策略设计为softmax策略。 根据如何构建softmax战略以及如何构建损失函数,将强化学习问题作为优化问题。
2.3 soft策略及其损失函数
如图2.3所示,设计前向神经互联网战略。
这个神经softmax战略的输入层是推车倒立的状态,维数是4,最后一层是softmax层,维数是2。 有机器学习的同学很熟悉,softmax通常是多分类器的最后一层。
最基本的概念之一是什么是softmax层?
如图2.3所示,如果设layer2的输出为z,则所谓softmax层就是对z作用一个softmax函数。 即:
以上,我们把战略梯度方法转换为分类问题的训练过程。 损失函数如下。
第一:小型车倒立的状态s
第二:作用于手推车的动作a
第三,与各行动对应的累积收益率v
我们逐一说明,这些输入怎么获得?
首先,手推车倒立的状态s是与环境相互作用得到的。 接着,作用于购物车的动作a从取样互联网得到,在训练中作为标签发挥作用的最后,各动作的累计返回通过将该动作后的累计返回进行标准化来解决。
因此,这个代码可以分为几个重要的函数。
策略神经网络的构建、行为选择函数、损失函数的构建、累计收益函数v的解决。 我们将逐一介绍如何实现。
基于2.4 tensor流的策略梯度算法的实现
政策互联网的构建。
构建神经网络最简单的方法是利用现有的深度学习软件,为了兼容性和通用性,这里选择了tensorflow。 我们构建的战略互联网结构如图2.4所示。
这个神经网络是最简单的前向神经网络,输入层是状态s,共计4个神经元,第一层是10个神经元,激活函数是relu。 输出是动作的概率,所以有两个动作。 这第二层是两个神经元,没有激活函数,最后一层是softmax层。
如果把这个代码翻译成tensorflow语言,就会变成这样。
def _build_net(self ) :
with tf.name_scope('input ' ) :
#创建一个占位符作为输入
self.TF _ OBS = TF.Placeholder
self.TF _ ACTS = TF.Placeholder ( TF.INT 32,[none,],NAME = " A
self.TF _ VT = TF.Placeholder ( TF.Float 32,[none,],name="actions_value
#1楼
layer = tf.layers.dense (
inputs=self.tf_obs,
units=10,
activation=tf.nn.tanh,
kernel _ initializer = TF.random _ normal _ initializer ( Mean = 0,stddev=0.3 ),
BIAS _ Initializer = TF.Constant _ Initializer ( 0.1 ),
name='fc1 ',
#2楼
all_act = tf.layers.dense (
inputs=layer,
units=self.n_actions,
activation=none,
kernel _ initializer = TF.random _ normal _ initializer ( Mean = 0,stddev=0.3 ),
BIAS _ Initializer = TF.Constant _ Initializer ( 0.1 ),
name='fc2 '
利用softmax函数得到各动作的概率
self.all _ act _ prob = TF.nn.soft max ( all _ act,name='act_prob ' )
所有的代码都可以在github上看到。 在policynet.py文件中。
动作选择函数:
动作选择函数是从采样互联网生成概率分布,利用该概率分布对动作进行重新采样,具体的代码如下。
#如何选择行为,即,定义状态s下行为采样
def choose_action(self,observation ) :
PROB _ weights = self.SESS.run ( SELF.ALL _ ACT _ PROB,FEED
#按给定概率进行采样
action = NP.Random.choice ( Range ( PRB _ Weights.ShaPe [1] ),P
返回操作。
其中函数np.random.choice是根据概率分布p=prob_weights.ravel ( )采样的函数。
构建损失函数:
理论部分中损失函数
with tf.name_scope('loss ' ) :
选择neg _ log _ prob = TF.nn.sparse _ soft max _ cross _ entropy _ with _ logits ( logits = all _ act,labels=self
loss = 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
for t in reversed(range(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 )
return discounted_ep_rs
如果有策略神经网络、动作选择函数、损失函数、累积收益函数,学习过程很简单,只需调用一个语句即可。
#定义培训并更新参数
with tf.name_scope('train ' ) :
self.train _ op = TF.train.Adam optimizer ( self.lr ).minimize(loss )。
这个训练过程是使用自适应动量的最佳方法。 学习的优化过程如下。
#学习以更新策略的互联网参数,在episode之后学习一次
def learn(self ) :
计算episode的折扣收益率
discounted _ EP _ RS _ norm = self._ discount _ and _ norm _ rewards ( )。
#调用训练函数来更新参数
self.sess.run(self.train_op,feed_dict={ )
SELF.TF _ OBS:NP.V stack ( SELF.EP _ OBS ),
self.TF _ ACTS:NP.Array ( SELF.EP _ AS ),
self.TF _ vt:discounted _ EP _ RS _ norm,
中所述情节,对概念设计中的量体外部表面积进行分析
#清空episode数据
选择self.ep_obs、self.ep_as、self.ep_rs = [],[ ]。
return discounted_ep_rs_norm
基于2.5战略梯度算法的推车倒立摆问题
有了战略互联网和培训流程,购物车问题就很容易处理了。 基本框架是:
1 .创建环境
2 .生成策略互联网
3 .反复学习
通过与环境的对话,学习更新战略的互联网参数
4 .利用学到的战略互联网测试推车倒立摆系统
利用softmax战略定义贪婪战略。
具体的代码位于github上的learning_cartpole.py文件中。
本讲座结束。
ps :这部分有点乱。 我强烈建议github下载代码。 我做了中文注释。 大家可以更改参数,自己体验。 所有代码在github的第一个演讲文件夹中都有gxnk/reinforcement-learning-code。
复制源:微信公共平台新智元
标题:“【强化学习实战】基于gym和tensorflow的强化学习算法实现”
地址:http://www.china-huali.com/cjxw/45866.html