[Reinforcement Learning] Policy Gradient Methods
2019-11-29

上一篇博文的内容整理了我们如何去近似价值函数或者是动作价值函数的方法:[V_{heta}(s)approx V^{pi}(s) \Q_{heta}(s)approx Q^{pi}(s, a)]通过机器学习的方法我们一旦近似了价值函数或者是动作价值函数就可以通过一些策略进行控制,比如 (epsilon)-greedy。

那么我们简单回顾下 RL 的学习目标:通过 agent 与环境进行交互,获取累计回报最大化。既然我们最终要学习如何与环境交互的策略,那么我们可以直接学习策略吗,而之前先近似价值函数,再通过贪婪策略控制的思路更像是"曲线救国"。这就是本篇文章的内容,我们如何直接来学习策略,用数学的形式表达就是:[pi_{heta}(s, a) = P[a | s, heta]]

这就是被称为策略梯度(Policy Gradient,简称PG)算法。

当然,本篇内容同样的是针对 model-free 的强化学习。

Value-Based vs. Policy-Based RL

Value-Based:

学习价值函数Implicit policy,比如 (epsilon)-greedy

Policy-Based:

没有价值函数直接学习策略

Actor-Critic:

学习价值函数学习策略

三者的关系可以形式化地表示如下:

认识到 Value-Based 与 Policy-Based 区别后,我们再来讨论下 Policy-Based RL 的优缺点:

优点:

收敛性更好对于具有高维或者连续动作空间的问题更加有效可以学习随机策略

缺点:

绝大多数情况下收敛到局部最优点,而非全局最优评估一个策略一般情况下低效且存在较高的方差

Policy Search

我们首先定义下目标函数。

Policy Objective Functions

目标:给定一个带有参数 (heta) 的策略 (pi_{heta}(s, a)),找到最优的参数 (heta)但是我们如何评估不同参数下策略 (pi_{heta}(s, a)) 的优劣呢?

对于episode 任务来说,我们可以使用start value:[J_1(heta)=V^{pi_{heta}}(s_1)=E_{pi_{heta}}[v_1]]对于连续性任务来说,我们可以使用 average value:[J_{avV}(heta)=sum_{s}d^{pi_{heta}}(s)V^{pi_{heta}}(s)]或者每一步的平均回报:[J_{avR}(heta)=sum_{s}d^{pi_{heta}}(s)sum_{a}pi_{heta}(s, a)R_s^a]其中 (d^{pi_{heta}}(s)) 是马尔卡夫链在 (pi_{heta}) 下的静态分布。

Policy Optimisation

在明确目标以后,我们再来看基于策略的 RL 为一个典型的优化问题:找出 (heta) 最大化 (J(heta))最优化的方法有很多,比如不依赖梯度(gradient-free)的算法:

爬山算法模拟退火进化算法...

但是一般来说,如果我们能在问题中获得梯度的话,基于梯度的最优化方法具有比较好的效果:

梯度下降共轭梯度拟牛顿法...

我们本篇讨论梯度下降的方法。

策略梯度定理

假设策略 (pi_{heta}) 为零的时候可微,并且已知梯度 (riangledown_{heta}pi_{heta}(s, a)),定义 (riangledown_{heta}logpi_{heta}(s, a)) 为得分函数(score function)。二者关系如下:[riangledown_{heta}pi_{heta}(s, a) = riangledown_{heta}pi_{heta}(s, a) frac{riangledown_{heta}pi_{heta}(s, a)}{pi_{heta}(s, a)}=pi_{heta}(s, a)riangledown_{heta}logpi_{heta}(s, a)]接下来我们考虑一个只走一步的MDP,对它使用策略梯度下降。(pi_{heta}(s, a)) 表示关于参数 (heta) 的函数,映射是 (p(a|s,heta))。它在状态 (s) 向前走一步,获得奖励(r=R_{s, a})。那么选择行动 (a) 的奖励为 (pi_{heta}(s, a)R_{s, a}),在状态 (s) 的加权奖励为 (sum_{ain A}pi_{heta}(s, a)R_{s, a}),应用策略所能获得的奖励期望及梯度为:[J(heta)=E_{pi_{heta}}[r] = sum_{sin S}d(s)sum_{ain A}pi_{heta}(s, a)R_{s, a}\riangledown_{heta}J(heta) = color{Red}{sum_{sin S}d(s)sum_{ain A}pi_{heta}(s, a)}riangledown_{heta}logpi_{heta}(s, a)R_{s, a}=E_{pi_{heta}}[riangledown_{heta}logpi_{heta}(s, a)r]]

再考虑走了多步的MDP,使用 (Q^{pi_{heta}}(s, a)) 代替奖励值 (r),对于任意可微的策略,策略梯度为:[riangledown_{heta}J(heta) = E_{pi_{heta}}[riangledown_{heta}logpi_{heta}(s, a)Q^{pi_{heta}}(s, a)]]

策略梯度定理

对于任意可微策略 (pi_{heta}(s, a)),任意策略目标方程 (J = J_1, J_{avR}, ...),策略梯度:[riangledown_{heta}J(heta) = E_{pi_{heta}}[riangledown_{heta}logpi_{heta}(s, a)Q^{pi_{heta}}(s, a)]]

蒙特卡洛策略梯度算法(REINFORCE)

Monte-Carlo策略梯度算法,即REINFORCE:

通过采样episode来更新参数:;使用随机梯度上升法更新参数;使用return (v_t) 作为 (Q^{pi_{heta}}(s_t, a_t)) 的无偏估计

(Deltaheta_t = alpha riangledown_{heta}logpi_{heta}(s_t, a_t)v_t),具体如下:

Actir-Critic 策略梯度算法

Monte-Carlo策略梯度的方差较高,因此放弃用return来估计行动-价值函数Q,而是使用 critic 来估计Q:[Q_w(s, a)approx Q^{pi_{heta}}(s, a)]这就是大名鼎鼎的 Actor-Critic 算法,它有两套参数:

Critic:更新动作价值函数参数 (w)Actor: 朝着 Critic 方向更新策略参数 (heta)

Actor-Critic 算法是一个近似的策略梯度算法:[riangledown_heta J(heta)approx E_{pi_{heta}}[riangledown_{heta}log pi_{heta}(s, a)Q_w(s, a)]\Deltaheta = alphariangledown_hetalogpi_{heta}(s,a)Q_w(s,a)]

Critic 本质就是在进行策略评估:How good is policy (pi_{heta}) for current parameters (heta).策略评估我们之前介绍过MC、TD、TD((lambda)),以及价值函数近似方法。如下所示,简单的 Actir-Critic 算法 Critic 为动作价值函数近似,使用最为简单的线性方程,即:(Q_w(s, a) = phi(s, a)^T w),具体的伪代码如下所示:

在 Actir-Critic 算法中,对策略进行了估计,这会产生误差(bias),但是当满足以下两个条件时,策略梯度是准确的:

价值函数的估计值没有和策略相违背,即:(riangledown_w Q_w(s,a) = riangledown_hetalogpi_{heta}(s,a))价值函数的参数w能够最小化误差,即:(epsilon = E_{pi_{heta}}[(Q^{pi_{heta}}(s, a) - Q_w(s,a))^2])

优势函数

另外,我们可以通过将策略梯度减去一个基线函数(baseline funtion)B(s),可以在不改变期望的情况下降低方差(variance)。证明不改变期望,就是证明相加和为0:[egin{align}E_{pi_{heta}}[riangledown_hetalogpi_{heta}(s,a)B(s)]&=sum_{sin S}d^{pi_{heta}}(s)sum_a riangledown_hetapi_{heta}(s, a)B(s)\&=sum_{sin S}d^{pi_{heta}}(s)B(s)riangledown_hetasum_{ain A}pi_{heta}(s,a )\&= 0end{align}]

状态价值函数 (V^{pi_{heta}}(s)) 是一个好的基线。因此可以通过使用优势函数(Advantage function)(A^{pi_{heta}}(s,a)) 来重写价值梯度函数。[A^{pi_{heta}}(s,a)=Q^{pi_{heta}}(s,a)-V^{pi_{heta}}(s)\riangledown_heta J(heta)=E_{pi_{heta}}[riangledown_hetalogpi_{heta}(s,a)A^{pi_{heta}}(s,a)]]

(V^{pi_{heta}}(s)) 是真实的价值函数,TD算法利用bellman方程来逼近真实值,误差为 (delta^{pi_{heta}}=r+gamma V^{pi_{heta}}(s") - V^{pi_{heta}}(s))。该误差是优势函数的无偏估计。因此我们可以使用该误差计算策略梯度:[riangledown_heta J(heta)=E_{pi_{heta}}[riangledown_hetalogpi_{heta}(s,a)delta^{pi_{heta}}]]该方法只需要critic,不需要actor。更多关于 Advantage Function 的可以看这里。

最后总结一下策略梯度算法:

Reference

[1] Reinforcement Learning: An Introduction, Richard S. Sutton and Andrew G. Barto, 2018[2] David Silver"s Homepage[3] Advantage Learning