浅谈Policy Gradient

浅谈Policy Gradient

最近学习论文的时候,发现越来越多地使用到了强化学习方法,比较常用的优化方法就是
Policy Gradient。这里记录下对该方法的理解。希望能对大家有所帮助。

1. 什么是Policy

首先大致说明一下强化学习的基本结构:

图1 强化学习的基本结构

如图1,一个由Agent(相当于我们的模型)和Environment(所处状态)组成的结构。

Agent通过观察当前环境的状态 s_t ,得出当前应当执行的动作 a_t 。Agent执行完动作之后环境对应发生了改变,并且环境会给予Agent一个反馈reward r_t。此时又会是一个新的环境状态 s',基于本次的环境状态,Agent又会执行对应的动作...以此类推持续进行下去,直到无法继续。

如下图2所示,Env表示环境,Actor即为Agent:

图2 执行过程
上面实际上就是对一系列操作进行了抽象描述。如果以玩游戏为例说明,我们(Agent)通过观察游戏(Environment)的运行情况(State),选择接下来要执行的操作(Action),游戏往往还会反馈给我们我们的得分(Rewards)。

在不同的状态(State)采取的动作 Action 也就是我们所说的策略 Policy 常用符号 \pi 来表示策略。


2. 应该怎样进行梯度下降

现在,我们大概能够猜测到了,Policy Gradient就是基于我们的策略Policy来做梯度下降从而优化我们的模型。

我们会希望Agent能够尽量能够执行较好的动作。那么我们会使用执行了该动作后得到的反馈reward来判定本次的策略好坏

图3 超级马里奥游戏
如图三所示的超级马里奥,在这个游戏运行状态下(state),假设我们可以选择的操作(policy)有继续向前走和跳起两种。
假设我们执行的操作为继续向前走,然后会碰到敌人,此时马里奥让自己变小或死亡,这个时候系统会得到比较不好的结果,返回的reward值会较小甚至是负的。而假如我们选择起跳,那么我们会获得金币,并且还会将敌人踩死或是跳过,此时得到的结果则是较好的,返回的reward值会是较大的正数。

我们会希望Agent所做的Policy所做出来的反馈reward一直都会比较高。也就是说我们想要训练我们的Agent倾向于做出那些reward较高的动作。


3. 用监督学习的角度看策略梯度下降

在监督学习中,我们会使用交叉熵来比较两个分布的差异。进而使用梯度下降法来逼近我们想要的梯度。

H(p, q) = -\sum_{x}p(x) \log q(x) 。其中 p(x) 为对应的标签, q(x) 则为输出的概率。

这里默认大家都对交叉熵比较熟悉,就不多讲了


然而,在强化学习中,是没有对应的label的。那么我们怎么进行优化呢?这种情况,我们会基于reward来充当我们的label。

具体怎么做呢,我们会在游戏中,多次运行我们的Agent,Agent会基于概率而采样选择不同的策略。假设一次状态行为序列为 \tau = \{ s_1, a_1, r_1, s_2, ..., s_t, a_t\} ,其中 s_t 表示位于t时刻的状态, a_t 代表位于时刻t时候所作出的动作。

基于不同的动作策略,我们会得到不同reward R(\tau) 。假设运行得到比较好的分数得到了+3分,一般的分数得到了+1分,比较差的结果则得到了-1分。那么这个时候我们将会希望得到尽可能往+3分的结果,而-1分的则要尽量去避免。

我们会使用如下的式子做为损失函数进行计算:

L(\theta) = -\frac{1}{N}\sum_{\tau}R(\tau) \log \pi_\theta(\tau) ,其中 \pi_\theta(\tau) 表示采取 \tau 策略的发生概率,N为采样 \tau 的数目。

我们将其展开为假设情况有:

L(\theta) = -\frac{1}{N}\sum_{\tau}R(\tau) \log \pi_\theta(\tau) = -\frac{1}{3}\left[3 * \log \pi_\theta(\tau_1) + 1 * \log \pi_\theta(\tau_2) + (-1) * \log \pi_\theta(\tau_3) \right]

为了方便比较,我们再将最后结果化作 L(\theta) = -\frac{1}{3}\left[3 *1 * \log \pi_\theta(\tau_1) + 1 * \log \pi_\theta(\tau_2) + (-1) * 1 * \log \pi_\theta(\tau_3) \right]

相比交叉熵的梯度下降,这里实际上就相当于在出现的概率上加了一个reward系数。什么意思呢,直观上来讲,可以看做多训练几下。比如说,在超级玛丽这个游戏中,一次游戏中通过跳跃吃到了金币,那么在返回的reward如果为正的,那么会倾向于多训练几次这个过程,也可以视为向这个梯度方向多走几步。而如果reward结果为负的,那么则可视为向原本这个梯度方向的反方向走几步,以后也就尽量减少这种策略出现的概率。

如下图4采样执行了三种策略,反馈(打勾的)较好会训练更经常出现,而反馈较差的(打叉)的,则会训练让其较少出现。

图4 优化策略

4. 关于每次动作的反馈

上面讲的反馈来自于一次完整的动作叠加得到,即经历了一次完整的状态-行为序列后得到的

R(\tau) = \sum_{t=0}^{H}{r(s_t, a_t)}

之所以这么做,是因为在中间状态时候,我们往往无法获得反馈。比如说在围棋比赛中,我们下的棋,一般情况下是得不到反馈的,只有在棋局结束的时候,通过输赢我们才能够知道我们这些子下的好不好。

那么这样就造成了一个问题:假如一盘游戏输了,那么我们就会全盘否定掉本次游戏中所做的所有操作。那么如果本次游戏中的一些好的操作,是不是也会相应地被否定掉了?答案是肯定的,这些操作同样会被限制出现,如下假设反馈为-1时。

L(\theta) = - R(\theta)*\log P(\tau) = -[-1 * \log P(\tau)]

但是我们也会发现,这些好的操作普遍存在于好的反馈游戏结局中。当我们采样足够多的时候,这些操作就会较多地被肯定了,那么最终还是会被较好地训练到的。

假设说在一次游戏中,采样了以下 \tau_1, \tau_2,\tau_3 三种过程并得到了三种过程所对应的reward。
\tau_1 = \{ s_1, jump, s_2, left, s_3, left\}R(\tau_1) = -1
\tau_2 = \{ s_1, right, s_2, right, s_3, right\}R(\tau_2) = 1
\tau_3 = \{ s_1, jump, s_2, right, s_3, right\}R(\tau_3) = 3

我们可以看到 \tau_1s_1 状态下选择动作为 jump 时最终得到的reward为 -1 ,而 \tau_3s_1 状态相比 \tau_1 选择了 jump 最终得到的结果却是 3 。基于上面的样本可以看到在 s_1 这个状态下使用jump是有可能得到更多的正向反馈的。(假定这里的 s_1、s_2、s_3 为相同状态)

我们带入损失函数并求其梯度得到:
\begin{aligned} \nabla L(\theta) &= -\frac{1}{N}\sum_{\tau}R(\tau) \nabla \log \pi_\theta(\tau) \\&= -\frac{1}{3}\left[-1 * \nabla \log \pi_\theta(\tau_1) + 1 * \nabla \log \pi_\theta(\tau_2) + 3 * \nabla \log \pi_\theta(\tau_3) \right] \\ &= -\frac{1}{3}\{-1*\nabla [\log \pi_\theta(jump|s_1)+\log \pi_\theta(left|s_2)+\log \pi_\theta(left|s_3)] \\ & \quad\quad+1*\nabla[\log \pi_\theta(right|s_1) + \log \pi_\theta(right|s_2) + \log \pi_\theta (right|s_3)]+\\&\quad\quad\quad 3*\nabla [\log \pi_\theta (jump|s_1) + \log \pi_\theta(right|s_2)+\log \pi_\theta(right|s_3) ]\} \\ &= -\frac{1}{3}[2*\nabla \log \pi_\theta(jump|s_1)+\nabla \log \pi_\theta(right|s_1) + \\&\quad\quad(-1)*\nabla \log \pi_\theta(left|s_2)+4*\nabla \log \pi_\theta(right|s_2)+ \\&\quad\quad(-1)*\nabla \log \pi_\theta(left|s_3) +4*\nabla \log \pi_\theta(right|s_3) ] \end{aligned}

这样一波计算下来,可以看到,对于 s_1 状态下的 jump 最终还是得到的是正反馈。由此可见,只要采样充分,我们并不需要担心在不良反馈结局下的某些好的操作会被消除。

5. 蒙特卡洛方法

从上面看到,只要采样充分,就能够对一些操作得到恰当的反馈。但是,很多时候,由于搜索空间过于庞大,很难对每一个操作都采样充分,这个时候我们就希望能够对每一步操作都能进行较为恰当的得分。比如说围棋,每一盘的搜索状态都几乎不一样,而每一盘的反馈也只能通过“下完”一盘棋来进行判定胜负和反馈。这个时候我们就可以对棋局进行蒙特卡洛搜索。

这种局面我们就会使用蒙特卡洛搜索来得到大致每一步棋的reward。

下面以九宫棋为例来感受蒙特卡洛搜索:

图5 九宫棋

假设我们处在最上面的 s_0 状态时刻,这个时候我们有五种下法,对应于箭头指向的第二行中的 s_{0.1}s_{0.5} 。我们要判断 s_{0.1} 这一步下的怎样呢,那么我们会继续以它为基础走剩下的可能步骤,以此类推直到棋局结束。最终按照胜利棋局的比例得出最终的reward。

这里大致说明了思想,具体实现细节还需要自己去细看


6. 结束语

文章是凭着看过内容之后凭着相关记忆和理解写出来的,能大概给一个感性认识,但是更多的数学细节还需要自己去仔细琢磨。很多地方可能不是很严谨,欢迎交流指点。

觉得有用就点个赞支持一下吧。


7. 参考文献

[1] 李宏毅 强化学习 lecture1

[2] CS 294-112: Deep Reinforcement Learning

[3] Deep Reinforcement Learning: Pong from Pixels Andrew Karpathy

编辑于 2018-08-19

文章被以下专栏收录