本篇文章6198字,读完约15分钟

本文是首次在微信公共平台上发表:新智元。 文案是作者个人的观点,不代表网络的角度。 投资者据此,风险请自己承担。

上次深入分析了gym环境的构筑强化学习实战“第一届gym学习和二次开发-知乎专栏”。 这是利用gym和tensorflow实现基于两个最经典的增强学习算法qleanring和战略梯度的方法。 本课参考了一些令人讨厌的代码(参见知乎问答“强化学习”,推荐使用什么好的开源项目、网站和副本? 》),在此表示感谢。 这个故事分为两小节,2.1小节以qlearning的做法处理机器人寻找金币(这个环境已经在前一节给出了)。 在2.2节中,以小型车的倒立摆为例,详细说明基于政策梯度的强化学习方法。 之所以选择这两种方法,是因为考虑到两种方法都是经典的算法,以及机器人寻找金币是典型的表型强化学习问题,推车的倒立摆是典型的状态空间连续型强化学习问题。

“【强化学习实战】基于gym和tensorflow的强化学习算法实现”

节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中

“【强化学习实战】基于gym和tensorflow的强化学习算法实现”

第二部分:基于战略梯度算法实现详细解

本节需要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