本文主要讲解有关 Policy Gradient(PG)算法的相关内容。
之前提到的 Sarsa、Q-Learning 和 DQN 算法都是基于价值的方法,也就是先计算每个状态对应的动作的 Q 值,再选择 Q 值最大的动作执行。而 Policy Gradient 是一种更加直接的方式,它直接计算每个状态对应的动作或者动作的概率。这样做的优点就是它可以在一个连续区间内选取动作。
Policy Gradient 算法就是对策略函数进行建模,然后用梯度下降更新网络的参数。但是在强化学习中并没有实际的损失函数,而 PG 算法的目的是最大化累计奖励的期望值,所以可以将损失函数设为:$loss=-E[\log{[\pi(a|s)]}\cdot Q(s,a)]$,可以理解为如果一个动作的奖励值较大,则下次选取该动作的可能性增加的幅度也大,反之选取该动作的可能性增加的幅度小。
但是因为策略 $\pi$ 不易求得,所以可以将其改写为 $loss=-E[\log[p_\theta(\tau)]\cdot R(\tau)]$,其中 $p_\theta(\tau)$ 是轨迹 $\tau$ 出现的概率,$R(\tau)$ 是轨迹 $\tau$ 的总奖励值。因此,策略梯度的直观含义是增大高回报轨迹的概率,降低低回报轨迹的概率。
而取对数的原因是取对数后不会改变函数的单挑性,又会避免指数的计算(如果有的话),同时可以将乘法转化为加法,既降低了计算复杂度,又避免了多个小于 1 的数相乘导致下溢出的情况。
根据采样方式的不同可以分为两种情况,第一种是基于蒙特卡洛的方式,此时会采一个回合(episode)的样本然后计算 loss;第二种是基于 TD 的方式,此时会采单步的样本然后计算 loss。前一种的代表是 REINFORCE 算法,后一种的代表是 Actor-Critic 算法。
以上是关于 PG 算法的一些感性认识和拼凑起来的总结,下面将从理性的角度以数学公式推理的形式推导一下 PG 算法的损失函数。以下内容主要是根据李宏毅老师的 RL 教程整理的。
轨迹:$\tau={s_1,a_1,s_2,a_2,…,s_T,a_T}$,则该轨迹出现的概率为:
$$
p_\theta(\tau)=p(s_1)p_\theta(a_1|s_1)p(s_2|s_1,a_1)p_\theta(a_2|s_2)p(s_3|s_2,a_2)…
$$
$$
=p(s_1)\prod_{t=1}^Tp_\theta(a_t|s_t)p(s_{t+1}|s_t,a_t)\quad\quad\quad 公式(1)
$$
在上式中,因为在给定状态 $s_t$ 确定要采取什么动作 $a_t$ 时,需要神经网络来完成,所以 $p_\theta(a_t|s_t)$ 带参数 $\theta$,相反,$p(s_{t+1}|s_t,a_t)$ 是由环境决定的,所以不带参数 $\theta$。
每一个动作 $a_t$ 获得相应的奖励 $r_t$,则总奖励为 $ R(\tau)=\sum_{t=1}^Tr_t$,我们希望总奖励最大化。
奖励的期望为:$\bar R_\theta=\sum_\tau R(\tau)p_\theta(\tau)=E_{\tau-p_\theta(\tau)}[R(\tau)]$,即奖励的期望为所有轨迹出现的概率与该轨迹奖励值乘积之和。
因为我们要求的是使得总奖励值 $\bar R_\theta$ 最大的最优策略 $\pi$,所以损失函数可以设为:
$$
L(\theta)=-\bar R_\theta
$$
损失函数(负的奖励的期望)对参数 $\theta$ 求导:
$$
\nabla L(\theta)=-\nabla \bar R_\theta=-\sum_\tau R(\tau)\nabla p_\theta(\tau)=-\sum_\tau R(\tau)p_\theta(\tau)\frac{\nabla p_\theta(\tau)}{p_\theta(\tau)}
$$
因为 $\nabla f(x)=f(x)\nabla\log f(x)$,所以:
$$
=-\sum_\tau R(\tau)p_\theta(\tau)\nabla\log p_\theta(\tau)
$$
将 $p_\theta(\tau)$ 看作是 $R(\tau)\nabla\log p_\theta(\tau)$ 的概率分布,则可改写为期望的形式:
$$
=-E_{\tau\sim p_\theta(\tau)}[R(\tau)\nabla\log p_\theta(\tau)]\thickapprox -\frac{1}{N}\sum_{n=1}^N R(\tau^n)\nabla\log p_\theta(\tau^n)
$$
上式中由于前一项没法直接结算,所以可以通过采样的方式获取多个轨迹 $\tau$ 来计算,其中 N 是轨迹的个数,$\tau^n$ 表示是第 n 个轨迹。
如公式(1) 所示,轨迹的概率 $p_\theta(\tau^n)$ 的表达式中的 $p(s_{t+1}|s_t,a_t)$ 来自环境,而 $p_\theta(a_t|s_t)$ 来自决策网络,前者是不带参数 $\theta$ 的,对其求导没什么用。所以 $p_\theta(\tau^n)$ 可以写作 $p_\theta(\tau^n)=p_\theta(a_1^n|s_1^n)\cdot p_\theta(a_2^n|s_2^n)\cdot …\cdot p_\theta(a_{T_n}^n|s_{T_n}^n)$,对其取对数后变为求和的形式,即:
$$
=-\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n} R(\tau^n)\nabla\log p_\theta(a_t^n|s_t^n)
$$
其中 $T_n$ 是第 n 个轨迹的长度。然后更新模型参数:
$$
\theta=\theta-\eta\cdot\nabla L(\theta)
$$
其中 $\eta$ 是学习率。
Tip1:增加基准
由于采取的行动概率和为一,可能存在归一化之后,好的 action 的概率相对下降,坏的 action 概率相对上升的情况,因此需要引入一个基准线 b,让 $\nabla\bar R_\theta$ 变得有正有负,将其改写为:
$$
\nabla\bar R_\theta\approx\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n}(R(\tau^n)-b)\nabla\log p_\theta(a_t^n|s_t^n)
$$
$$
b\approx E[R(\tau)]
$$
Tip2:设置适当的置信度
$$
\nabla\bar R_\theta\approx\frac{1}{N}\sum_{n=1}^N\sum_{t=1}^{T_n}(\sum_{t’=t}^{T_n}{\gamma^{t’-t}\cdot r_{t’}^n}-b)\nabla\log p_\theta(a_t^n|s_t^n)
$$
用 $\sum_{t’=t}^{T_n}{\gamma^{t’-t}\cdot r_{t’}^n}$ 代替了 $R(\tau^n)$,将从当前状态以后产生的回报作为当前状态的奖励值。$\gamma<1$ 表示折扣系数,一个状态离当前状态越远损失越大,即与当前越不相关。
- 本文作者: 俎志昂
- 本文链接: zuzhiang.cn/2019/10/13/PG/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!