知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒

admin 2019-04-02 阅读:219

前不久,百度发布了依据PaddlePaddle的深度强化学习结构PARL。

作为一个强化学习小白,自己怀着学习的心态,装置并运转了PARL里的quick-start。不体会不知道,一体会吓一跳,不愧是 NeurIPS 2018 冠军团队的创作,代码可读性杰出,函数功用十分明晰,模块之间耦合度低、内聚性强。不只是合适零根底的小白快速建立DRL环境,也十分合适科研人员复现论文成果。

废话不多说,咱们从强化学习最经典的比方——迷宫寻宝(俗称格子国际Grid知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒World)开端,用战略梯度(Policy-Gradient)算法体会一把PARL。



模仿环境


强化学习合适处理智能决议计划问题。如图,给定如下迷宫,黑色方格代表墙,黄色代表瑰宝,赤色代表机器人;一开端,机器人处于恣意一个方位,因为走一步要耗电,撞墙无上辐光后需求修补,所以咱们需求练习一个模型,来通知机器人怎么防止撞墙、并给出寻宝的最优途径。赵春城苏媚




接下来,界说强化学习环境所需的各种要素:状况state、动作action、奖赏reward等等。

state便是机器人所在的方位,用(行、列)这个元组来标明,一起能够标明墙:

self.wallList=[(2,0),(3,2),(1,3),(4,4)]
self.start=(0,4)
self.en李大壮d=(4,0)


运用random-start战略完结reset功用,以添加初始状况的随机性:

defreset(self):
for _ in range(0,1024):
i=np.random.randint(self.row)
j=np.random.randint(self.col)
if (i,j) not in self.wallList and (i,j王钦和莲心)!=self.end:
self.pos=(i,j)
break
return self.pos


界说动作action,很显然,机器人能够走上下左右四个方向:

action_dim=4
dRow=[0,0,-1,1]sewowo
dCol=[1,-1,0,0]


界说奖赏reward,抵达结尾奖赏为10,走其他格子需求耗电,奖赏为-1:

def reward(self, s):
if s == self.end:
return 10.0
else:
return -1.0


别的,越界、撞墙需求给较大赏罚:

if not checkBounds(nextRow, nextCol) :
#越界
return self.pos, -5.0, False, {'code':-1,'MSG':'OutOfBounds!'}
nextPos=(nextRow,nextCol)
if meetWall(self.wallList, nextPos):
#撞墙
return self.pos, -10.0, False, {'code':-1,'MSG':'MeetWall!'}


至此,强化学习所需的状况、知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒动作、奖赏均界说结束。接下来简略推导一下战略梯度算法的原理。


战略梯度(Policy-Gradient)算法是什么?

咱们知道,强化学习的方针是给定一个马尔可夫决议计划进程,寻找出最优战略。所谓战略是指状况到动作的映射,常用符号标明,它是指给定状况s时,动作集上的一个散布,即:




战略梯度的做法十分开门见山,它直接对求解最优战略进行参数化建模,战略p(a|s)将从一个概率调集变成一个概率密度函数p(a|s,),即:




这个战略函数标明,在给定状况s和参数的状况下,采纳任何或许动作的概率,它是一个概率密度函数,在实践运用该战略的时分,是依照这个概率散布进行动作action的采样的,这个散布能够是离散(如伯努利散布),也能够说是接连(如高斯散布)。最直观的办法,咱们能够运用一个线性模型标明这个战略函数:



其间,(s)标明对状况s的特征工程,是需求练习的参数。这样建模有什么优点呢?其实最大的优点便是能时时刻刻学到一些随机战略,增强探究性exploration。


为什么能够添加探究性呢?


比方迷宫寻宝问题,假定一开端机器人在最左上角的方位,此刻p(a|s,)能够初始化为[0.25,0.25,0.25,0.25],标明机器人走上、下、左、右、的概率都是0.25。当模型练习到必定程度的时分,p(a|s,)变成了[0.1,0.6,0.1,0.2],此刻,向下的概率最大,为0.6,机器人最有或许向下走,这一步表现为运用exploitation;可是,向右走其实也是最优战略,0.2也是或许被挑选的,这一步表现为探究explorat南昌大学办公自动化体系ion;相对0.6和0.2,向上、向左两个动作的概率就小许多,但也是有或许被挑选的。假如模型持续练习下去,p(a|s,)很有或许收敛成[0.05,0.45,0.05,0.45],此刻,机器人根本上只走向下或许向右,挑选吴岛光实向上、向左的或许性就极小了。这是最左上角方位(状况)的状况,其他状况,跟着模型的练习,也会收敛到最优解。

有了模型,就想到求梯度,那么,怎么知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒构建丢失函数呢?标签y-Target又是什么?

一个十分朴素的主意便是:假如一个动作取得的reward多,那么就跳动的人生使其呈现的概率变大,不然减小,所以,能够构建一个有关状况-动作的函数 f(s,a) 作为丢失函数的权重,这个权重函数能够是长时间报答G(t),能够是状况值函数V(s),也能够是状况-行为函数Q(s,a),当然也能够是优势函数A。可是,这个权重函数和参数无关,对的梯度为0,只是作为p(a|s,)的系数。

现在考虑模型的输出(a|s,),它标明动作的概率散布,咱们知道,智能体每履行完一轮episode,就会构成一个完好的轨道Trajectory:



其间,状况

和参数无关,状况搬运概率P(s'|s,a)是由环境所决议的,和参数也无关。所以,咱们的方针简化为:优化参数,使得每个动作概率的乘积

到达最大,即使得

这个累乘概率到达最大,可用如下公式标明:



这显然是咱们了解的极大似然估量问题,转化为对数似然函数:



乘以权重 f(s,a),构建如下方针函数,这个方针函数和咱们平常见到的丢失函数正好相反,它需求运用梯度上升的办法求一个极大值:



留意到,这儿的aTrue便是标签y-Target,标明agent在状况$s_{t}$时实在采纳的动作,能够依据轨道trajectory采样得到。学过机器学习的同学都知道,一般用方针函数的均值替代求和,作为新的方针函数:



均值,便是数学希望,所以方针函数也能够标明为:



有了方针函数,梯度就很简略核算了,因为

关于来说是系数,故梯度公式如下:



那么,战略详细的表现方法怎么?前文说到,战略能够是离散的,也能够是接连的,无妨考虑离散的战略。因为咱们需求求解最大值问题,也便是梯度上升问题,自然而然就想到把梯度上升问题转化为梯度下降问题,这样才干使得方针函数的相反数到达最小,而什么样的函数能够将梯度下降和对数函数相关起来呢?显然是咱们了解的穿插熵知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒,所以终究的丢失函数确定为:


接连战略的推导与离散战略相似,有爱好的读者能够参阅相关文献。

自此,公式推导能够告一段落。战略梯度的根本算法便是Reinforce,也称为蒙特卡洛战略梯度,简称MCPG,PARL的官方policy-gradient便是依据以下算法结构完结的:





PARL源码结构


在建立模型之前,咱们先剖析一下PARL的首要模块:

1. env:环境,在这儿,咱们的环境便是迷宫寻宝。

2. model:模型,能够是简略的线性模型,也能够是CNN、RNN等深度学习模型。

3. algorithm:算法,对model层进行封装,并运用模型进行predict(猜测),一起构建丢失函数进行learn(学习)汇众教育是真是假;详细完结方法能够是DQN、PG、DDPG等等。

4. agent:智能体,对algorithm层进行封装,一般也包括predict、learn两个函数;一起,因为智能体要一起进行探究exploration-运用exploitation,还常常包括一离婚硝烟个sample函数,用于决议到底是randomSelect(随机挑选或许依据散布函数挑选动作),仍是argmax(100%贪心,总是挑选或许性最大的动作)。

5. train:练习和测验,用于完结agent和环境的交互,当模型收敛后,能够测验智能体的准确性。

6. utils:其他辅佐功用。

以下的架构示意图,能够协助咱们更好的了解PARL:





代码完结&源码解读


在了解了结构的各个模块之后,咱们就能够依照模板填代码了,学过MVC、ORM等结构的同学都知道,这是一件十分轻松愉快的工作。

1、MazeEnv。迷宫环境,承继自gym.Env,完结了reset、step、reward、render四个首要办法,这儿不再赘述。

2、MazeModel。模型层,建立如下全链接神经网络,输入是状况state-input,输出是战略函数action-out,因为战略函数是动作的概率散布,所以选用softmax作为激活函数,中心还有若干躲藏层。




代码完结十分的简略,让Maze触手游戏Model承继官方的Model类,然后照本宣科建立模型即可:

class MazeModel(Model):
def__init__(self, act_dim):
self.act_dim = act_dim
hid1_size = 32
hid2_size = 32
self.fc1 = layers.fc(size=hid1_size, act='ta磁力把nh')
self.fc2 = layers.fc(size=hid2_size, act='tanh')
self.fcOut = layers.fc(size=act_dim,act='soft何寻何寻max')
defpolicy(self, obs):
out = self.fc1(obs)
out = self.fc2(out)
out = self.f迈腾凯撒金雅士银比照cOut(out)
return out


3、policy_gradient。算法层;官方库房供给了许多的经典强化学习算法,咱们无需自己重复写,能够直接复用算法库(parl.algorithms)里面的 PolicyGradient 算法!

简略剖析一下policy_gradient的源码完结。

define_predict函数,接纳状况obs,调用model的policy办法,输出状况所对应的动作:

def define_predict(self, obs):
""" use policy model se知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒lf.model to predict the actionprobability
"""
return self.model.policy(obs)


define_learn函数,接纳状况obs、实在动作action、长时间报答reward,首要调用model的pocliy办法,猜测状况obs所对应的动作概率散布act_prob,然后丝足恋运用穿插熵和reward的乘积结构丢失函数cost,最终履行梯度下降法,优化器为Adam,完结学习功用:

def define_learn(self, obs, action, reward):
""" update policy model self.model with policy gradientalgorithm
"""
act_prob = self.model.policy(obs)
log_prob = layers.cross_entropy(act_prob, action)
cost = log_prob * reward
cost = layers.reduce_mean(cost)
optimizer = fluid.optimizer.Adam(self.lr)
optimizer.m看蜜桃inimize(cost)
return cost


4、MazeAgent。智能体。其间,self.pred_program是对algorithm中define_predict的简略封装,self.train_program是对algorithm中define_learn的简略封装,咱们能够参阅官方的CartpoleAgent完结,依照结构模板填入相应的格局代码。

这儿,只是剖析self.pred_program,self.train_program写法相似:

self.pred_program = fluid.Program()#固定写法
with fluid.program_guard(self知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒.pred_program):
obs= layers.data(
name='obs',shape=[self.obs_dim], dtype='float32')#接纳外界传入的状况obs
self.act_prob = self.alg.define_predict(obs)
#调用algorithm的define_predict,self.act_prob为动作的概率散布


sample函数,留意这句话:

act = np.random.choice(range(self.act_dim),p=act_prob)


这句话标明依据概率散布随机选出相应的动作;假定上、下、左、右的概率分别为[0.5,0.3,0.15,0.05],那么上被挑选的概率是最大的,右被挑选的概率是最小的,所以sample函数既能explorati舒嫔坐胎药on,又能exploitation,表现了强化学习中的探究-运用的平衡。

predict函数,和sample函数不同的是,它总是贪心的挑选或许性最大的动作,常常用于测验阶段:

act = np.argmax(act_prob)


learn函数,接纳obs、action、reward,进行批量梯度下降,回来丢失函数cost。

5、TrainMaze。让环境env和智能体agent进行交互,最主悲瑟独弦琴攻略要的部分便是以下代码,表现了MCPG进程:

#迭代十万个episode
for i in range(1,100001):
#采样

obs_list, action_list, reward_list = run_train_episode(env, agent)

#运用滑动均匀的方法核算奖赏的希望

MeanReward=MeanReward+(sum(reward_list)-MeanReward)/i

batch_obs = np.array(obs_list)

batch_action = np.array(action_list)

#经过backup的方法核算G(t),并进行归一化处理

batch_reward = calc_discount_norm_reward(reward_list, GAMMA)

#学习

agent.learn(batch_obs, batch_action, batch_reward)


其间,滑动均匀能够挑选恣意一个公式,无偏估量标明实在的均值,有偏估量愈加挨近收敛后的均匀奖赏:

无偏估量:


有偏估量:

,是学习率,取0.1、0.01等等

其他代码都是辅佐功用,如记载log、画图、烘托环境等等。


运转程序并调查成果


运转TrainMaze,能够看到如下输出。

1、练习之前,机器人并不知道怎么寻宝,所以越界、撞墙次数十分多,也绕了许多弯路,均匀奖赏比较低。

ErrorCountBeforeTrain:25052 #越界+撞墙次数

均匀奖赏曲线:




2、练习模型。迭代十万个episode,调查如下学习曲线,纵轴标明均匀奖赏,能够看到,模型现已收敛了:




3、测验模型的准确性。测验阶段,咱们迭代128轮,智能体几乎没有任何越界或许撞墙行为,因为是random-start,所以均匀奖赏有少量动摇,但稳定在5-7之间。

ErrorCountAfterTrain:0 #没有任何撞墙或许越界

练习后的均匀奖赏:




源码Git地址

https://github.com/kosoraYintai/PARL-Sample

参阅文献:

知否知否应是绿肥红瘦txt,PARL源码走读——运用战略梯度算法求解迷宫寻宝问题,养血清脑颗粒CS 294-112 at UC Berkeley,DeepReinforcement Learning.

Deepmind,Silver.D,R纳兰福雅einforcement Learning Open Class.

冯超. 强化学习精要[M]. 北京:电子工业出版社,2018.

郭宪,方勇纯. 浅显易懂强化学习[M]. 北京:电子工业出版社,2018.