Policy-Based算法
Value-Based算法试图学习$Q$函数, 通过评估每个动作得到回报的期望来获得一个理性的策略$\pi$. Policy-Based则直接学习策略$\pi$.
因此, 我们先要显式定义$\pi$, 将其参数化为$\pi_\theta$. $\pi_\theta(s)$是一个分布$\mathbb{P}(\cdot|s; \theta)$. 而优化$\theta$可以使用梯度上升法. 即策略梯度方法.
策略梯度方法
首先我们需要设计一个用于梯度上升的目标函数$ J(\theta) $. 直觉上来说, 我们希望策略获得的奖励期望最大, 即:
$$ \begin{align*} J(\theta) = \mathbb{E}_\tau[R(\tau)] \tag{1} \end{align*} $$$ \tau $即轨迹(trajectory), 该式即对所有可能的轨迹, 求奖励的期望. 这个式子虽然没写$\theta$, 但是其实和$\theta$有关. 因为:
$$ \begin{align*} \mathbb{E_\tau}[R(t)] = \sum_\tau P(\tau ; \theta)R(\tau) \tag{2} \end{align*} $$$\theta $可以影响轨迹$ \tau $的分布. 因此来影响期望. 接下来, 我们对目标函数求梯度:
$$ \begin{align*} \nabla_\theta J(\theta) &= \nabla_\theta \sum_\tau P(\tau ; \theta)R(\tau) \tag{3.a}\\ &= \sum_\tau R(\tau) \nabla_\theta P(\tau ; \theta) \tag{3.b} \end{align*} $$如果我们可以通过计算机计算或者估计这个梯度值, 我们就可以更新我们的策略参数.
策略梯度定理
由于奖励$ R(\tau) $与$\theta$无关, 因此式$ (3.\mathrm{b}) $实际上只对$ P(\tau; \theta) $求梯度. 一般来说, $ R(\tau) $比较容易得到, 知道了$ \tau $可以按照规则来求和奖励. 而$ P(\tau; \theta) $我们直接用条件概率硬算:
$$ \begin{align*} P(\tau; \theta) = P(s_0)\prod_{t=1}^H{P(s_{t+1}| s_t, a_t)\pi_\theta(a_t| s_t)} \tag{4} \end{align*} $$$ P(s_0) $是初始状态的概率. 如果直接代入式子$ (3.\mathrm{a}) $中, 会发现难以进一步化简, 因为梯度无法直接处理连乘. 我们希望这里是个求和! 这样和的梯度等于梯度的和, 式子可以进一步化简. 这里使用一个数学技巧:
$$ \begin{align*} \nabla_\theta J(\theta) &= \sum_\tau R(\tau) \nabla_\theta P(\tau ; \theta) \tag{5.a} \\ &= \sum_\tau R(\tau) \frac{\nabla_\theta P(\tau; \theta)}{P(\tau; \theta)} P(\tau; \theta) \tag{5.b} \\ &= \sum_\tau P(\tau; \theta) R(\tau) \nabla_\theta \log P(\tau; \theta) \tag{5.c} \\ &= \mathbb{E}_{\tau}[R(\tau)\nabla_\theta\log P(\tau; \theta)] \tag{5.d} \end{align*} $$通过这个变换, 我们引入了$ \log $, 它可以把连乘变成求和. 更好的是, 我们把梯度的计算写成了一个期望的形式. 这意味我们可以进行采样估计. 原先可是要对所有的$ \tau $求和, 轨迹空间一般十分巨大, 我们无法直接求. 而现在写成期望形式后, 我们就可以进行采样估计了!
这里先处理$ \nabla_\theta\log P(\tau; \theta)$, 待会再处理期望估计. 把$ (4) $式代入, 得:
$$ \begin{align*} \nabla_\theta \log P(\tau; \theta) &= \nabla_\theta \log P(s_0)\prod_{t=1}^H{P(s_{t+1}| s_t, a_t)\pi_\theta(a_t| s_t)} \tag{6.a} \\ &= \nabla_\theta\log P(s_0) + \nabla_\theta\sum_{t=1}^H\log P(s_{t+1}| s_t, a_t)\pi_\theta(a_t| s_t) \tag{6.b} \\ &= \nabla_\theta\log P(s_0) + \sum_{t=1}^H\nabla_\theta\log P(s_{t+1}| s_t, a_t) + \sum_{t=1}^H\nabla_\theta\log \pi_\theta(a_t| s_t) \tag{6.c} \\ &= \sum_{t=1}^H\nabla_\theta\log \pi_\theta(a_t| s_t) \tag{6.d} \end{align*} $$在式$ (6.\mathrm{c}) $中, 由于$ P(s_0) $和$ P(s_{t+1}| s_t, a_t) $与$\theta$无关, 因此, 其对应的梯度项为0, 最后只剩下了$ (6.\mathrm{d}) $中的策略的梯度项.
将$ (6.\mathrm{d}) $代入$ (5.\mathrm{d}) $中, 得到:
$$ \begin{align*} \mathbb{E}_{\tau}[R(\tau)\nabla_\theta\log P(\tau; \theta)] = \mathbb{E}_\tau[R(\tau)\sum_{t=1}^H\nabla_\theta \log\pi_\theta(a_t|s_t)] \tag{7} \end{align*} $$该式子右边即为策略梯度定理. 写得完整一些, 就是:
$$ \begin{align*} \nabla_\theta J(\theta) = \mathbb{E}_\tau[R(\tau)\sum_{t=1}^H\nabla_\theta \log\pi_\theta(a_t|s_t)] \tag{8} \end{align*} $$期望估计与工程实现
接下来我们处理期望估计的问题, 假如说我们采样$ N $条轨迹:
$$ \begin{align*} \mathbb{E}_\tau[R(\tau)\sum_{t=1}^H\nabla_\theta \log\pi_\theta(a_t|s_t)] &\approx \frac{1}{N}\sum_{i=1}^N R(\tau^{(i)})\sum_{t=1}^{H^{(i)}}\nabla_\theta \log\pi_\theta(a_t^{(i)}|s_t^{(i)}) \tag{9.a} \\ &= \frac{1}{N}\sum_{i=1}^N\sum_{t=1}^{H^{(i)}}R(\tau^{(i)})\nabla_\theta \log\pi_\theta(a_t^{(i)}|s_t^{(i)}) \tag{9.b} \end{align*} $$为此, 我们的目标函数应该设计为:
$$ \begin{align*} J(\theta) = \frac{1}{N}\sum_{i=1}^N\sum_{t=1}^{H^{(i)}}R(\tau^{(i)})\log\pi_\theta(a_t^{(i)}|s_t^{(i)}) \tag{10} \end{align*} $$如果使用深度学习框架实现, 损失函数可以为:
$$ \begin{align*} loss = -J(\theta) = -\frac{1}{N}\sum_{i=1}^N\sum_{t=1}^{H^{(i)}}R(\tau^{(i)})\log\pi_\theta(a_t^{(i)}|s_t^{(i)}) \tag{11} \end{align*} $$

欢迎友好讨论~