强化学习笔记(六)- 策略梯度

  |     |   本文总阅读量:

版权声明:本文原创,转载请留意文尾,如有侵权请留言,谢谢

引言

  之前我们几篇文章提到的算法都是最优价值算法(optimal value algorithm),因为它们在求解最优策略的过程中试图估计最优策略。本文提到的策略梯度(Policy Gradient)算法,它求解最优策略不一定要估计最优价值函数,而试图用含参函数近似最优策略,并通过迭代更新参数值。

策略近似

  用函数近似方法估计最优策略 \(\pi(a|s)\) 的基本思想使用含参函数 \(\pi(a|s;\boldsymbol{\theta})\) 来近似最优策略。为了满足 \(\sum_a \pi(a|s) = 1\),我们引入动作偏好函数(Action Preference Function),它的 softmax 值为 \(\pi(a|s;\boldsymbol{\theta})\)

\[ \pi(a | s, \boldsymbol{\theta}) \doteq \frac{e^{h(s, a, \boldsymbol{\theta})}}{\sum_{b} e^{h(s, b, \boldsymbol{\theta})}} \]

  之前我们从动作价值函数导出的最优策略估计往往有特定的形式,例如 \(\epsilon\) 贪心策略,然而从动作偏好导出的最优策略的估计则不拘泥于特定的形式,\(\boldsymbol{\theta}\) 随着迭代可以逼近最优策略。

策略梯度定理

  策略梯度定理给出了期望回报和策略梯度之间的关系,我们给出回合制任务下的目标函数,它是 Start Value 形式的:

\[ J(\boldsymbol{\theta}) \doteq v_{\pi_{\theta}}\left(s_{0}\right) \]

  除了 Start Value 形式的目标函数,还有 Average Value 形式的 \(J(\boldsymbol{\theta}) = \sum_s \mu(s)v_{\pi_{\theta}}(s)\) 和 Average reward per time-step 形式的 \(J(\boldsymbol{\theta}) = \sum_s \mu(s) \sum_a \pi\left(a | s, \boldsymbol{\theta}\right) q(s,a)\)。其中 \(\mu(s)\) 是状态 \(s\) 的分布函数,其满足 \(\mu(s) \ge 0, \sum_s \mu(s) = 1\)

  我们先给出策略梯度定理给出的结论,目标函数无论是何种形式,对任意的 MDP 过程,目标函数对策略参数的梯度均为如下形式:

\[ \begin{aligned} \nabla J(\boldsymbol{\theta}) & \propto \sum_{s} \mu(s) \sum_{a} q_{\pi}(s, a) \nabla \pi(a | s, \boldsymbol{\theta}) \\ &=\mathbb{E}_{\pi}\left[\sum_{a} q_{\pi}\left(S_{t}, a\right) \nabla \pi(a | S_{t}, \boldsymbol{\theta})\right] \end{aligned} \]

  下面是 Start Value 形式的目标函数的证明过程:

  根据此定理,目标函数的梯度等于策略函数梯度与 Q 值两部分乘积的期望,这两部分都是较为容易确定的,因此参数的更新就变得容易了。

同策回合更新策略梯度算法

REINFORCE:Mente Carlo Policy Gradient

  这里所说的同策回合更新策略梯度算法主要就是蒙特卡洛策略梯度算法,在每一个回合结束后,我们可以做以下更新:

\[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha \sum_a \hat{q}\left(S_{t}, a, \mathbf{w}\right) \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right) \]

  上式列出的方法也叫做 all-actions 方法,因为它每次更新都需要用到所有动作,下面我们只考虑在 \(t\) 时刻采取 \(A_t\) 的情况:

\[ \begin{aligned} \nabla J(\boldsymbol{\theta})&=\mathbb{E}_{\pi}\left[\sum_{a} \pi\left(a | S_{t}, \boldsymbol{\theta}\right) q_{\pi}\left(S_{t}, a\right) \frac{\nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(a | S_{t}, \boldsymbol{\theta}\right)}\right]\\ &\begin{array}{ll} {=\mathbb{E}_{\pi}\left[q_{\pi}\left(S_{t}, A_{t}\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}\right]} & { \text { (replacing }\left.a \text { by the sample } A_{t} \sim \pi\right)} \\ {=\mathbb{E}_{\pi}\left[G_{t} \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}\right)}\right],} & { \text { (because }\left.\mathbb{E}_{\pi}\left[G_{t} | S_{t}, A_{t}\right]=q_{\pi}\left(S_{t}, A_{t}\right)\right)} \end{array} \end{aligned} \]

  于是更新式可以变为:

\[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha G_{t} \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} \]

  因为 \(\nabla \ln x=\frac{\nabla x}{x}\),所以迭代式又可以变为:

\[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha G_{t} \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]

  \(\nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)\) 又被称为 eligibility vector,这样的算法也称为 REINFORCE(REward Increment = Nonnegative Factor ✖ Offset Reinforcement ✖ Charasteristic Eligibility),表示了增量是由三个部分组成的。
  算法的伪代码如下,其中加入了折扣因子,之前我们一直忽略折扣因子,是因为默认 \(\gamma=1\)

REINFORCE with Baseline

  我们对策略梯度算法做一些改进,给它加入基线,引入基线函数 \(B(s)\)

\[ \nabla J(\boldsymbol{\theta}) \propto \sum_{s} \mu(s) \sum_{a}\left(q_{\pi}(s, a)-b(s)\right) \nabla \pi(a | s, \boldsymbol{\theta}) \]

  它可以降低学习过程中的方差,基线函数可以是任意随机函数或确定函数,它可以与状态 \(s\) 有关,但是不能和动作 \(a\) 有关。添加基线有效,是因为下式为 0:

\[ \sum b(s) \nabla \pi(a | s, \boldsymbol{\theta})=b(s) \nabla \sum \pi(a | s, \boldsymbol{\theta})=b(s) \nabla 1=0 \]

  更新式也就变为了:

\[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha\left(G_{t}-b\left(S_{t}\right)\right) \frac{\nabla \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)}{\pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right)} \]

  一个能有效降低方差的基线是状态价值函数的估计,下面的伪代码给出了用状态价值函数的估计作为基线的算法,算法里的两套参数 \(\boldsymbol{\theta}\)\(\boldsymbol{w}\) 分别是最优策略估计和最优状态价值函数估计的参数,每次迭代时,它们都可以以各自的学习算法进行学习:

异策回合更新策略梯度算法

  在简单的策略梯度算法上引入重要性采样,就可以得到对应的异策算法,记行为策略 \(b(a|S_t)\)

\[ \begin{aligned} & \sum_{a} \pi\left(a | S_{t}, \boldsymbol{\theta}\right) q_{\pi}\left(S_{t}, a\right) \ln \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right) \\ &= \sum_{a} b(a|S_t) \frac{\pi\left(a | S_{t}, \boldsymbol{\theta}\right)}{b(a|S_t)} q_{\pi}\left(S_{t}, a\right) \ln \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right) \\ &= \sum_{a} b(a|S_t) \frac{1}{b(a|S_t)} q_{\pi}\left(S_{t}, a\right) \ln \nabla \pi\left(a | S_{t}, \boldsymbol{\theta}\right) \end{aligned} \]

  即:

\[ \mathbb{E}_{\pi}\left[\gamma^t G_t \ln \nabla \pi(A_t | S_{t}, \boldsymbol{\theta}) \right] = \mathbb{E}_{b}\left[\frac{1}{b(A_t|S_t)} \gamma^t G_t \ln \nabla \pi(A_t | S_{t}, \boldsymbol{\theta}) \right] \]

Actor–Critic 算法

  我们之前说的算法基本只能用于回合制任务,下面说的 Actor-Critic 算法不仅可以用于回合制任务,还可以用于连续性任务,用于时序差分,可以使用自益。
  Actor-Critic 算法是策略(Policy Based)和价值(Value Based)相结合的方法,这种算法就是通过引入一种评价机制来解决高方差的问题。具体来说,Critic就类似于策略评估,去估计动作值函数,而 Actor 就是我们之前说到的策略函数,负责生成动作并和环境交互。所以Actor-Critic算法中就有两组参数,也就是两个估计:

  • Critic:更新价值函数的估计,例如 \(\hat{v}(s, w) \approx v_{\pi}(s)\)\(\hat{q}(s, a, w) \approx q_{\pi}(s, a)\)
  • Actor:策略函数的估计,\(\pi_{\boldsymbol{\theta}}(s, a)=P(a | s, \boldsymbol{\theta}) \approx \pi(a | s)\)

  再利用 MC 方法 REINFORCE 中,梯度更新部分中,eligibility vector 是不用动的,要变成 Actor 的话改动的是 \(G_t\),这块不能再使用 MC 来得到,而应该从 Critic 得到。而对于 Critic 来说,可以参考之前DQN的做法,用一个 Q 网络来做为 Critic, 这个 Q 网络的输入可以是状态,而输出是每个动作的价值或者最优动作的价值。
  总的来说,拿评估点 \(v_t\) 举例来说,就是 Critic 通过 Q 网络计算状态的最优价值 \(v_t\),而 Actor 利用 \(v_t\) 这个最优价值迭代更新策略函数的参数 \(\boldsymbol{\theta}\),进而选择动作,并得到反馈和新的状态,Critic 使用反馈和新的状态更新 Q 网络参数 \(\boldsymbol{w}\),在后面 Critic 会使用新的网络参数 \(\boldsymbol{w}\) 来帮 Actor 计算状态的最优价值 \(v_t\)
  除了评估 \(v_t\),还有很多其他的指标来做为 Critic 的评估点:

  • 基于状态价值:\(v(s, \boldsymbol{w})\),更新公式为: \[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha v(s, \boldsymbol{w}) \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]
  • 基于动作价值:\(q(s,a,\boldsymbol{w})\),更新公式为: \[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha q(s,a,\boldsymbol{w}) \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]
  • 基于 TD 误差:\(\delta(t) = r_{t+1} + \gamma v(S_{t+1}) - v(S_t)\)\(\delta(t) = r_{t+1} + \gamma q(S_{t+1}, A_{t+1}) - q(S_{t}, A_{t})\),更新公式为: \[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha \delta(t) \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]
  • 基于优势函数:\(a(s,a;\mathbf{w}) = q(s,a;\mathbf{w}) - v(s;\mathbf{w})\),更新式为: \[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha a(s,a;\mathbf{w}) \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]
  • 基于 TD(\(\lambda\)) 误差:是 TD 误差和效用迹 E的乘积 \[ \boldsymbol{\theta}_{t+1} \doteq \boldsymbol{\theta}_{t}+\alpha \delta(t) E(t) \nabla \ln \pi\left(A_{t} | S_{t}, \boldsymbol{\theta}_{t}\right) \]

  对于 Critic 本身的模型参数 \(\boldsymbol{w}\),一般都是使用均方误差损失函数来做做迭代更新。
  下面是一个基于单步 TD 估计的伪代码:

  下面是带资格迹的:

总结

  我们可以看出 策略梯度有以下优点:

  • 基于策略的学习可能会具有更好的收敛性,这是因为基于策略的学习虽然每次只改善一点点,但总是朝着好的方向在改善,但是有些价值函数在后期会一直围绕最优价值函数持续小的震荡而不收敛。
  • 在对于那些拥有高维度或连续状态空间来说,使用基于价值函数的学习在得到价值函数后,制定策略时,需要比较各种行为对应的价值大小,这样如果行为空间维度较高或者是连续的,则从中比较得出一个有最大价值函数的行为这个过程就比较难了,这时候使用基于策略的学习就高效的多。
  • 能够学到一些随机策略
  • 有时候计算价值函数非常复杂。比如当小球从从空中某个位置落下你需要左右移动接住时,计算小球在某一个位置时采取什么行为的价值是很难得,但是基于策略就简单许多,你只需要朝着小球落地的方向移动修改策略就行。

  但是策略梯度也有些缺点,原始的、未经改善(Naive)的基于策略的学习有时候效率不够高,有时候还有较高的变异性(方差,Variance)。因为基于价值函数的策略决定每次都是推促个体去选择一个最大价值的行为;但是基于策略的,更多的时候策略的选择时仅会在策略某一参数梯度上移动一点点,使得整个的学习比较平滑,因此不够高效。有时候计算朝着梯度方向改变的增量也会有较高的变异性(方差),以至于拖累了整个算法速度,但是通过一些修饰,可以改进。

Refer

相关内容


坚持原创技术分享,您的支持将鼓励我继续创作,π(3.14)元就够啦!



文章目录
  1. 1. 引言
  2. 2. 策略近似
  3. 3. 策略梯度定理
  4. 4. 同策回合更新策略梯度算法
    1. 4.1. REINFORCE:Mente Carlo Policy Gradient
    2. 4.2. REINFORCE with Baseline
  5. 5. 异策回合更新策略梯度算法
  6. 6. Actor–Critic 算法
  7. 7. 总结
  8. 8. Refer
  9. 9. 相关内容
您是第 位小伙伴 | 本站总访问量 | 已经写了 670.5k 字啦

载入天数...载入时分秒...