养生

PARL源码走读使用策略梯度算法求解迷宫

2019-05-15 02:39:57来源:励志吧0次阅读

前不久,百度发布了基于PaddlePaddle的深度强化学习框架PARL。git传送门

作为一个强化学习小白,本人怀着学习的心态,安装并运行了PARL里的quick-start。不体验不知道,一体验吓一跳,不愧是 NeurIPS 2018 团队的杰作,代码可读性良好,函数功能非常清晰,模块之间耦合度低、内聚性强。不单单适合零基础的小白快速搭建DRL环境,也十分合适科研人员复现论文结果。

废话不多说,我们从强化学习经典的例子迷宫寻宝(俗称格子世界GridWorld)开始,用策略梯度(Policy-Gradient)算法体验一把PARL。

模拟环境

强化学习适合解决智能决策问题 。如图,给定如下迷宫,黑色方格代表墙,黄色代表宝藏,红色代表机器人;一开始,机器人处于任意一个位置,由于走一步要耗电,撞墙后需要修理,所以我们需要训练一个模型,来告诉机器人如何避免撞墙、并给出寻宝的路径。

接下来,定义强化学习环境所需的各种要素:状态state、动作action、嘉奖reward等等。

state就是机器人所处的位置,用(行、列)这个元组来表示,同时可以表示墙:

使用random-start策略实现reset功能,以增加初始状态的随机性:

定义动作action,很明显,机器人可以走上下左右四个方向:

定义奖励reward,到达终点奖励为10,走其他格子需要耗电,奖励为-1:

另外,越界、撞墙需要给较大惩罚:

至此,强化学习所需的状态、动作、奖励均定义终了。接下来简单推导一下策略梯度算法的原理。

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

我们知道,强化学习的目标是给定一个马尔可夫决策过程,寻觅出策略。所谓策略是指状态到动作的映照,常用符号 $\pi$表示,它是指给定状态 s 时,动作集上的一个分布,即: $$\pi (a|s)=p[A{t}=a|S{t}=s]$$

策略梯度的做法十分直截了当,它直接对求解策略 进行参数化建模,策略p(a|s)将从一个几率集合变成一个几率密度函数p(a|s,),即:$$\pi_{\theta}=p[a|s,\theta]$$

这个策略函数表示,在给定状态s和参数的情况下,采取任何可能动作的概率,它是一个概率密度函数,在实际运用该策略的时候,是按照这个几率分布进行动作action的采样的,这个分布可以是离散(如伯努利分布),也可以说是连续(如高斯散布)。直观的方法,我们可以使用一个线性模型表示这个策略函数: $$\pi _{\theta }=\phi (s)*\theta$$

其中,$\phi(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也是可能被选择的,这一步表现为探索 exploration ;相对0.6和0.2,向上、向左两个动作的概率就小很多,但也是有可能被选择的。如果模型继续训练下去,p(a|s,)很有可能收敛成[0.05,0.45,0.05,0.45],此时,机器人基本上只走向下或向右,选择向上、向左的可能性就极小了。这是左上角位置(状态)的情况,其他状态,随着模型的训练,也会收敛到解。

有了模型,就想到求梯度,那末,如何构建损失函数呢?标签y-Target又是什么?

一个非常朴素的想法就是:如果一个动作获得的reward多,那么就使其出现的概率变大,否则减小,因而,可以构建一个有关状态-动作的函数 f(s,a) 作为损失函数的权重,这个权重函数可以是长期回报G(t),可以是状态值函数V(s),也可以是状态-行为函数Q(s,a),固然也可以是优势函数A。但是,这个权重函数和参数无关,对的梯度为0,仅仅作为p(a|s,)的系数。

现在考虑模型的输出$\pi(a|s,)$,它表示动作的概率散布,我们知道,智能体每执行完一轮episode ,就会构成一个完全的轨迹Trajectory: $$T=[S{0},a{0},P(S{1}|S{0},a{0}),S{1},a{1},P(S{2}|S{1},a{1}),S{2}...S{n-1},a{n-1},P(S{n}|S{n-1},a{n-1}),S{n}]$$ 其中,状态$S{0},S_{1}...S{n}$和参数无关,状态转移几率P(s'|s,a)是由环境所决定的,和参数也无关。所以,我们的目标简化为:优化参数,使得每一个动作概率的乘积$p(a{0})p(a{1})...p(a{n})$达到,即使得$\pi (a{0}|s{0},\theta)\pi (a{1}|s{1},\theta)\pi (a{2}|s{2},\theta)...*\pi (a{n}|s{n},\theta)$这个累乘概率到达,可用如下公式表示:$$Maximize[arg(\theta )],T=\prod{t=0}^{N}\pi (a|s{t},\theta)$$

这显然是我们熟悉的极大似然估计问题,转化为对数似然函数: $$log(T)=log(\prod{t=0}^{N}\pi (a|s{t},\theta))=\sum{t=0}^{N}log(\pi (a|s{t},\theta))$$

乘以权重 f(s,a),构建如下目标函数 ,这个目标函数和我们平时见到的损失函数正好相反,它需要使用梯度上升的方法求一个极大值: $$J(\theta )=\sum{t=0}^{N}log(\pi(a |s{t},\theta) )*f(s,aTrue)$$

注意到,这里的aTrue就是标签y-Target,表示agent在状态$s_{t}$时真实采取的动作,可以根据轨迹trajectory采样得到。

学过机器学习的同学都知道,一般用目标函数的均值代替求和,作为新的目标函数: $$J(\theta )=\frac{1}{N}\sum{t=0}^{N}log(\pi (a|s{t},\theta ))*f(s_{t},aTrue)$$

均值,就是数学期望,所以目标函数也可以表示为: $$J(\theta )=E{\pi (\theta )}(log(\pi (a|s{t},\theta ))*f(s_{t},aTrue))$$

有了目标函数,梯度就很容易计算了,由于$f(s{t},a)$对来说是系数,故梯度公式如下: $$\triangledown J(\theta )=E{\pi(\theta)}(\triangledown log(\pi(a|s{t},\theta))*f(s{t},aTrue))$$

那么,策略$\pi$具体的表现形式如何?前文提到,策略可以是离散的,也可以是连续的,无妨考虑离散的策略。由于我们需要求解值问题,也就是梯度上升问题,自然而然就想到把梯度上升问题转化为梯度下降问题,这样才能使得目标函数的相反数 达到小,而什么样的函数可以将梯度下落和对数函数关联起来呢?显然是我们熟悉的交叉熵,所以终究的损失函数肯定为: $$Minimize[arg(\theta)],J(\theta)=E_{\pi(\theta)}(CrossEntropy(\pi(a|s{t},\theta),aTrue)*f(s{t},aTrue))$$

连续策略的推导与离散策略类似,有兴趣的读者可以参考相干文献。

自此,公式推导可以告一段落。策略梯度的基本算法就是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:

123下一页

子宫内膜炎如何治疗
子宫内膜炎的治疗方法
子宫内膜炎引起原因
分享到: