skip to content
s7ev3n'space

Introduction to RL

/ 32 min read

拾起Reinforcement Learning的基础概念和算法。

Terminology

强化学习中有很多的术语和概念,初学时经常被搞得很懵逼,所以先从术语开始,把基础的概念理解好。

强化学习是一套框架,这套框架通用的描述一个可以执行动作的所谓Agent通过和环境的交互进行学习,框架图如下图所示: rl_framework

强化学习这套框架中充满了随机性,每一个概念几乎都是一个随机变量或概率密度函数,下面的开始的介绍中,简单规定一些符号:大写字母XX表示随机变量,小写字母xx表示随机变量的观测值,大写的PP概率密度函数,花体字母S\mathcal{S}表示集合。不同的教材对下面的概念会采用相当不同的符号表示,例如David Silver的课程,UCB的课程等,不同的符号系统随着概念和算法的深入公式会变得更困难,因此坚持一套符号表示即可。

Basics

  1. Agent: Agent是环境中活动(执行动作)的主体,例如在真实世界中行驶的自动驾驶车(Ego Vehicle)。

  2. Environment 环境或者现在的有些说法叫世界模型(World Model),是Agent所活动的环境的抽象。

  3. State SS: 状态指的是当前Agent所包含的信息,这些信息决定着Agent的未来。在某时刻tt的状态StS_t是一个随机变量,sts_t是当前时刻的观测值,可以有很多可能的sts_t。所有可能的状态的集合称为状态空间S\mathcal{S},即State Space。

  4. Action AA: 动作指的是Agent采取的动作。在某时刻tt的状态AtA_t是一个随机变量,ata_t是当前时刻的观测值,可以有很多可能的ata_t,这些动作可能是离散值,也可能是连续值。所有可能的动作的集合称为动作空间A\mathcal{A},即Action Space。

  5. Reward RR: 奖励指的是Agent采取了动作环境给予Agent的奖励值。在某时刻tt的状态RtR_t是一个随机变量,rtr_t是当前时刻的观测值。奖励也会被称为奖励函数(reward function),环境根据当前的状态sts_t和采取的不同动作ata_t,会有不同的奖励值。

    奖励也是一个很难的话题,因为RL是一个框架,Agent的目标是最大化未来的奖励,它塑造了Agent的学习目标和效率。很难有通用的奖励函数,一般是根据某个任务定义的,例如AlphaGo下棋,赢了得到了价值100的奖励,输了要惩罚100,这里奖励值的确定并没有科学的依据。例如在大语言模型应用强化学习进行RLHF,最大化的奖励是和人类对齐(alignment)的回答,但是模型也会出现Reward Hacking1

    RL算法也经常会面临奖励稀疏(Sparse Reward)的问题,导致RL比较大的问题是学习低效(inefficient),即需要超级大量的试错才能学到简单的动作。

  1. Return UU: 回报的定义是累积的未来回报(Cumulative future reward),注意是未来:
Ut=Rt+Rt+1+Rt+2+Rt+3+U_t=R_t+R_{t+1}+R_{t+2}+R_{t+3}+\cdots

由于未来时刻tt的奖励和当前比不一定等价,所以打个折扣γ\gamma,也就是discounted return:

Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+U_t=R_t+\gamma R_{t+1}+\gamma^2R_{t+2}+\gamma^3R_{t+3}+\cdots

需要注意的是UtU_t是一个随机变量,它依赖于未来未观测到的奖励,而这些奖励依赖于未来采取的动作和状态,但是回报可以通过积分掉未观测到的变量获得期望值

  1. Trajectory: 轨迹是Agent与环境交互的序列:s1,a1,r1,s2,a2,r2,s_1, a_1, r_1, s_2, a_2, r_2, \cdots

  2. State Transition: 状态转移p(s,a)p(\cdot \vert s, a)指的是根据当前Agent的状态ss和采取的动作aa,环境转移到新状态ss'的概率,因此状态转移时一个概率密度函数p(ss,a)=P(S=sS=s,A=a)p(s'\vert s,a)=P(S'=s' \vert S=s, A=a)

Policy Function

策略函数π\pi是RL中最重要的概念之一,是指Agent当前的状态ss映射到动作空间A\mathcal{A}内所有动作的概率分布,它控制Agent所采取的动作:

π(as)=P(A=aS=s)\pi(a \vert s)=P(A=a \vert S=s)

它是一个概率密度函数,所以有aAπ(as)=1\sum_{a \in \mathcal{A}}\pi(a \vert s)=1

Value Functions

价值函数同样也是RL中最重要的概念之一,主要有动作-价值函数,以及状态-价值函数,两者有密切关系。 两个价值函数都是由策略函数Policy控制的期望,期望就是对未来回报的平均预期,比喻来说就是Agent的“经验”。

Action-Value Function

动作价值函数Qπ(s,a)Q_{\pi}(s, a),即经常见到的QQ函数,描述了在给定状态ss下采取某个动作aa的好坏,这个好坏是通过代表未来累积奖励的回报UtU_t的期望来进行评价的:

Qπ(s,a)=E(UtSt=st,At=at)Q_{\pi}(s, a)=\mathbb{E}(U_t \vert S_t=s_t, A_t=a_t)

为什么是期望呢?因为未来(t+1t+1时刻之后)可能采取的动作和进入的状态都是随机变量,但是我们通过求期望,即通过概率加权求和或积分消掉未来的随机变量,从而大体知道可以预期的平均回报是多少。

QQ函数依赖策略函数π(as)\pi(a \vert s)和状态转移函数p(s,a)p(\cdot \vert s, a)

State-Value Function

状态价值函数VπV_{\pi}衡量给定策略π\pi,当前状态的好坏,相当于对动作价值函数QQ,进一步积分掉所有的动作AA

Vπ=EAπ(st)[Qπ(st,A)]=Aπ(ast)Qπ(st,a)daV_{\pi}=\mathbb{E}_{A\sim \pi(\cdot \vert s_t)}\big[Q_{\pi}(s_t, A) \big]=\int_{\mathcal{A}} \pi(a\vert s_t) \cdot Q_{\pi}(s_t,a) \, da

状态价值函数描述了给定策略π\pi现在所处的状态的好坏,不管采取什么动作。

Optimal Value Functions

最佳动作价值函数(Optimal action-value function): Q(s,a)Q^*(s, a)表示在策略函数π\pi和状态ss下采取动作aa的最大预期回报:

Q(s,a)=maxπQπ(s,a)\begin{aligned} Q^*(s, a) &= \underset{\pi}{\text{max}} \, Q_{\pi}(s,a) \end{aligned}

最佳状态价值函数(Optimal state-value function): V(s)V^*(s)表示在策略函数π\pi中当前状态ss的最大预期回报:

V(s)=maxπVπ(s)V^{*}(s) = \underset{\pi}{\text{max}} \, V_{\pi}(s)

可以看到,两个最佳价值函数(Q(s,a)Q^*(s,a)V(s)V^*(s))都和策略函数π\pi有关,即只要找到最佳的策略函数π(as)\pi^*(a\vert s)

ππifVπ(s)Vπ(s),s\pi \geq \pi' \quad \text{if} \, V_{\pi}(s) \geq V_{\pi'}(s) , \forall s

对任意马尔科夫决策过程MDP有定理

  1. 一定有一个最佳策略π(as)\pi^*(a\vert s)好于或等于其他所有的策略
  2. 最优策略一定实现最优状态价值函数,Vπ(s)V(s),πV_{\pi^*}(s) \geq V^*(s), \forall \pi
  3. 最优策略一定实现最优动作价值函数,Qπ(s,a)Q(s,a),πQ_{\pi^*}(s,a) \geq Q^*(s,a), \forall \pi

RL算法的目标是最大化未来累积回报,可以看到,如果已知最优价值函数或最优策略,都可以实现RL这一目标,因此RL算法主要分为Value-based和Policy-based的方法。

Policy-based Method

Policy-based方法,例如Policy Gradient,是直接建模策略函数π(as;θ)\pi(a\vert s; \theta)来实现最大化未来累积回报的预期:

maximizeJ(θ)=Vπθ(S1)=Eπθ[V1]\text{maximize} \, \mathcal{J}(\theta)=V_{\pi_{\theta}}(S_1)= \mathbb{E}_{\pi_{\theta}}[V_1]

其中,S1S_1是初始状态。

期望累积奖励可以表示为平稳分布下的期望2

J(θ)=sSdπθ(s)Vπθ(s)=sS(dπθ(s)aAπ(as,θ)Qπ(s,a))\mathcal{J}(\theta)=\sum_{s\in \mathcal{S}}d_{\pi_{\theta}}(s)V_{\pi_{\theta}}(s)=\sum_{s\in \mathcal{S}}\big(d_{\pi_{\theta}}(s)\sum_{a\in \mathcal{A}}\pi(a\vert s,\theta)Q_{\pi}(s,a) \big)

其中,dπθ(s)d_{\pi_{\theta}}(s)称为平稳分布(stationary distribution)。

Policy Gradient

对上面的目标函数解析的求梯度(这里参考的是Wang Shusen的简化版):

J(θ)θ=sSd(s)aπ(as;θ)Qπ(s,a)θ=sSd(s)aAπ(as;θ)Qπ(s,a)θ=sSd(s)aπ(as;θ)θQπ(s,a)viaf(x)=f(x)logf(x)=sSd(s)aπ(as;θ)logπ(as;θ)θQπ(s,a)viasSd(s)=1=EA[logπ(As;θ)θQπ(s,A)]=EA[θlogπ(As;θ)Qπ(s,A)]\begin{aligned} \frac{\partial \mathcal{J}(\theta)}{\partial \theta}&=\frac{\partial \sum_{s\in \mathcal{S}}d(s)\sum_{a}\pi(a\vert s;\theta)\cdot Q_{\pi}(s,a)}{\partial \theta} \\ &=\sum_{s\in \mathcal{S}}d(s)\sum_{a\in\mathcal{A}} \frac{\partial \pi(a\vert s;\theta)\cdot Q_{\pi}(s,a)}{\partial \theta} \\ &=\sum_{s\in \mathcal{S}}d(s)\sum_{a} \frac{\partial \pi(a\vert s;\theta)}{\partial \theta}\cdot Q_{\pi}(s,a) \quad \text{via}\nabla f(x)=f(x)\nabla\log f(x)\\ &=\sum_{s\in \mathcal{S}}d(s)\sum_{a}\pi(a\vert s;\theta) \frac{\partial \log \pi(a\vert s;\theta)}{\partial \theta}\cdot Q_{\pi}(s,a) \quad \text{via} \sum_{s\in \mathcal{S}}d(s)=1 \\ &=\mathbb{E}_{\mathcal{A}}\big[\frac{\partial\log\pi(A\vert s;\theta)}{\partial \theta}\cdot Q_{\pi}(s,A) \big] \\ &=\mathbb{E}_{\mathcal{A}}[\nabla_{\theta} \log\pi(A\vert s;\theta)\cdot Q_{\pi}(s,A)] \end{aligned}

θJ(θ)\nabla_{\theta}\mathcal{J}(\theta)称为策略梯度(Policy gradient),注意的是它是一个期望值,请记住这个公式

Gradient Ascent

策略梯度算法使用梯度上升来更新参数(梯度下降用于最小化目标函数,对应的梯度上升用来最大化目标函数),伪代码如下:

  1. 从环境中得到状态sts_t
  2. 从策略函数π(st;θ)\pi(\cdot\vert s_t;\theta)中随机抽样出ata_t
  3. 计算qtQπ(st,at)q_t \approx Q_{\pi}(s_t, a_t) \leftarrow 下文回讲如何计算qtq_t
  4. 求梯度: dθ,t=logπ(atst,θ)θθ=θt\mathbb{d}_{\theta, t}=\frac{\partial \log\pi(\red{a_t}\vert s_t, \theta)}{\partial \theta} \big\vert_{\theta=\theta_t}
  5. (近似)计算policy gradient: g(at,θt)=qtdθ,t\mathbf{g}(\red{a_t},\theta_t)=q_t\cdot \mathbb{d}_{\theta, t} \leftarrow这里是使用蒙特卡洛近似,只使用一次随机采样来估计policy gradient(回想一下policy gradient是期望)
  6. 更新模型参数:θt+1=θt+βg(at,θt)\theta_{t+1}=\theta_t + \beta \cdot \mathbf{g}(\red{a_t},\theta_t)

使用蒙特卡洛近似的方法对policy gradient是无偏估计,但是它的缺点是方差高

还有一个问题:如何求Qπ(st,at)Q_{\pi}(s_t, a_t)?使用REINFORCE方法:

  • 使用当前的策略函数π\pi执行直到结束,收集轨迹:s1,a1,r1,s2,a2,r2,,sT,aT,rTs_1, a_1, r_1, s_2, a_2, r_2, \cdots, s_T, a_T, r_T
  • 计算ut=k=tTγktrku_t=\sum_{k=t}^{T}\gamma^{k-t}r_k
  • 因为Qπ(st,at)=E[Ut]Q_{\pi}(s_t,a_t)=\mathbb{E}[U_t],我们使用utu_t来近似Qπ(st,at)Q_{\pi}(s_t,a_t)

REINFORCE还有一个样本效率低的问题:执行当前策略πold\pi_{old}收集到的轨迹后,更新参数得到了策略函数πnew\pi_{new},这时之前收集到的轨迹就完全没有办法使用了。REINFORCE属于严格的on-policy算法。

另外一个方法是使用一个网络来近似Qπ(st,at)Q_{\pi}(s_t, a_t),这个就属于Actor-Critic方法了,在后面小节进行。

Policy Gradient with Baseline

前述使用MC采样的Policy Gradient算法的问题是方差较高,学者引入Baseline技巧,可以实现降低方差的作用。

首先来看一个推导:

EAπ[bθlogπ(As;θ)]=bEAπ[θlogπ(As;θ)]=baπ(as;θ)[logπ(as;θ)θ]via ddxlog(f(x))=1xf(x)=baπ(as;θ)[1π(as;θ)π(as;θ)θ]=baπ(as;θ)θ=b1θ=0\begin{aligned} \quad &\mathbb{E}_{A\sim \pi}[\blue{b}\cdot \nabla_{\theta} \log\pi(A\vert s;\theta)] \\ =& \blue{b} \cdot \mathbb{E}_{A\sim \pi}[\nabla_{\theta} \log\pi(A\vert s;\theta)] \\ =& \blue{b} \cdot \sum_{a}\pi(a\vert s;\theta) [\frac{\partial \log \pi(a\vert s;\theta)}{\partial \theta}] \quad \text{via }\frac{d}{dx} \log(f(x)) = \frac{1}{x}f'(x)\\ =& \blue{b} \cdot \sum_{a} \cancel{\pi(a\vert s;\theta)}[\frac{1}{\cancel{\pi(a\vert s;\theta)}}\cdot \frac{\partial \pi(a\vert s;\theta)}{\partial \theta}] \\ =& \blue{b} \cdot \frac{\partial\sum_{a}\pi(a\vert s;\theta)}{\partial \theta} \\ =& \blue{b} \cdot \frac{\partial 1}{\partial \theta} \\ =& 0 \end{aligned}

bb就是baseline,只要bb和求导的参数θ\theta以及动作aa无关,它的期望就是00,所以把上式添加到Policy Gradient中,不改变Policy Gradient的期望值:

PG=EA[θlogπ(As;θ)Qπ(s,A)]=EA[θlogπ(As;θ)Qπ(s,A)θlogπ(As;θ)b]=EA[θlogπ(As;θ)(Qπ(s,A)b)]\begin{aligned} PG =& \mathbb{E}_{\mathcal{A}}\big[\nabla_{\theta} \log\pi(A\vert s;\theta) \cdot Q_{\pi}(s,A) \big] \\ =& \mathbb{E}_{\mathcal{A}}\big[\nabla_{\theta} \log\pi(A\vert s;\theta) \cdot Q_{\pi}(s,A) - \nabla_{\theta} \log\pi(A\vert s;\theta)\cdot\blue{b}\big] \\ =& \mathbb{E}_{\mathcal{A}}[\nabla_{\theta} \log\pi(A\vert s;\theta)\cdot(Q_{\pi}(s,A)-\blue{b})] \end{aligned}

其中,A(s,a)=Qπ(s,a)bA(s,a)=Q_{\pi}(s,a)-\blue{b}又称为Advantage函数

但是为什么要加呢?虽然不改变期望值,但是在使用蒙特卡洛近似(随机采样ata_t并计算gtg_t)时,选择合适的baseline,可以降低方差。baseline的选择有很多,bb可以为常数,更常见的选择是b=V(s)b=V(s),即A(s,a)=Qπ(s,a)b=Qπ(s,a)Vπ(s)A(s,a)=Q_{\pi}(s,a)-\blue{b}=Q_{\pi}(s,a)-V_{\pi}(s)。 直观的解释Advantange函数的话就是:

  • A(s,a)>0A(s,a) > 0,则表示当前动作aa的回报优于平均值
  • A(s,a)<0A(s,a) < 0,则表示当前动作aa的回报低于平均值

TRPO

TRPO全称是Trust Region Policy Optimization,是优化策略函数的方法,将数值优化领域的Trust Region优化巧妙应用到策略函数的优化。

Trust Region

单独拿出来Trust Region是因为这不是TRPO的发明,而是数值优化领域的算法,首先理解Trust Region的基础,可以更好的理解TRPO。这里推荐Wang Shusen老师的视频TRPO 置信域策略优化,非常清晰。

假设N(θold)\mathcal{N}(\theta_{\text{old}})是参数θold\theta_{\text{old}}的邻域,即这个邻域内的参数距离θold\theta_{\text{old}}在一定的距离之内,度量距离有多种选择,例如KL散度。 如果我们有一个函数,L(θθold)L(\theta \vert \theta_{\text{old}})N(θold)\mathcal{N}(\theta_{\text{old}})内近似J(θ)\mathcal{J}(\theta),那么称N(θold)\mathcal{N}(\theta_{\text{old}})为Trust Region。

Trust Region算法重复两件事情:

  1. Approximation: 给定当前参数θold\theta_{old},构建L(θθold)L(\theta \vert \theta_{\text{old}}),它是在邻域N(θold)\mathcal{N}(\theta_{\text{old}})内对目标函数J(θ)J(\theta)的近似
  2. Maximization: 在Trust Region,更新参数θnew\theta_{\text{new}}: θnewargmaxθN(θold)L(θθold)\theta_{\text{new}} \leftarrow \underset{\theta \in \mathcal{N}(\theta_{\text{old}})}{\text{argmax}}\,L(\theta\vert \theta_{\text{old}})

TR Policy Optimization

首先,重新改写目标函数J(θ)\mathcal{J}(\theta),其中的技巧是重要性采样:

J(θ)=ES[Vπ(S)]=ES[aπ(as;θ)Qπ(s,a)]=ES[π(as;θold)π(as;θ)π(as;θold)Qπ(s,a)]=ES[EAπ(s;θold)[π(as;θ)π(as;θold)Qπ(s,a)]]=ES,A[π(AS;θ)π(AS;θold)Qπ(S,A)]\begin{aligned} \mathcal{J}(\theta) &= \mathbb{E}_{S}[V_{\pi}(S)] \\ &= \mathbb{E}_{S}\big[\sum_{a}\pi(a\vert s;\theta)\cdot Q_{\pi}(s,a)] \\ &= \mathbb{E}_{S}\big[\pi(a\vert s;\theta_{\text{old}}) \cdot \frac{\pi(a\vert s;\theta)}{\pi(a\vert s;\theta_{\text{old}})} \cdot Q_{\pi}(s,a) \big] \\ &= \mathbb{E}_{S}\Big[\mathbb{E}_{A \sim \pi(\cdot\vert s;\theta_{\text{old}})}\big[\frac{\pi(a\vert s;\theta)}{\pi(a\vert s;\theta_{\text{old}})} \cdot Q_{\pi}(s,a) \big]\Big] \\ &= \mathbb{E}_{S,A}\big[\frac{\pi(A\vert S;\theta)}{\pi(A\vert S;\theta_{\text{old}})} \cdot Q_{\pi}(S,A) \big] \end{aligned}

TRPO论文中是使用Advantage函数来替代QQ函数的,公式推导和理解上差异不大,这里与Wang Shushen老师的课程中的公式一致。

在做重要性采样时,如果提议分布和目标分布差异过大,是没有办法进行优化的,因此我们假设的也是当前策略函数的分布θold\theta_{\text{old}}和将要优化的策略函数的分布非常的近似,因此在Trust Region小步更新,更新步长太大也会造成优化不稳定。

下面开始应用Trust Region的两步(Approximation和Maximization)来优化目标函数:

Step 1. Approximation: 在参数θold\theta_{\text{old}}的邻域内构建L(θθold)L(\theta\vert \theta_{\text{old}})近似J(θ)=ES,A[π(AS;θ)π(AS;θold)Qπ(S,A)]\mathcal{J}(\theta)=\mathbb{E}_{S,A}\big[\frac{\pi(A\vert S;\theta)}{\pi(A\vert S;\theta_{\text{old}})} \cdot Q_{\pi}(S,A) \big]

由于SSAA都是状态和动作的随机变量,可以从状态转移函数和π\pi函数中随机采样得到,使用π(As;θold)\pi(A\vert s;\theta_{\text{old}})和概率转移函数得到一组轨迹:s1,a1,r1,s2,a2,r2,,sn,an,rns_1,a_1,r_1,s_2,a_2,r_2,\cdots,s_n,a_n,r_n,这些轨迹点相当于是训练策略函数πθ\pi_{\theta}的训练数据。 使用这组轨迹(蒙特卡洛)近似J(θ)\mathcal{J}(\theta):

J(θ)L(θθold)=1ni=1nπ(aisi;θ)π(aisi;θold)Qπ(si,ai)\mathcal{J}(\theta)\approx L(\theta\vert\theta_{old})=\frac{1}{n}\sum_{i=1}^{n}\frac{\pi(a_i\vert s_i;\theta)}{\pi(a_i\vert s_i;\theta_{old})}\cdot Q_{\pi}(s_i,a_i)

上式中,Qπ(si,ai)Q_{\pi}(s_i,a_i)可以使用REINFORCE方法用roll out的轨迹进行估计,即uiu_i,则:

L~(θθold)=1ni=1nπ(aisi;θ)π(aisi;θold)ui\tilde{L}(\theta\vert\theta_{old})=\frac{1}{n}\sum_{i=1}^{n}\frac{\pi(a_i\vert s_i;\theta)}{\pi(a_i\vert s_i;\theta_{old})}\cdot u_i

Step 2. Maximization: 在Trust Region,更新参数θnew\theta_{\text{new}}:

θnewargmaxθN(θold)L~(θθold);s.t.θN(θold)\theta_{\text{new}} \leftarrow \underset{\theta \in \mathcal{N}(\theta_{\text{old}})}{\text{argmax}}\,\tilde{L}(\theta\vert \theta_{\text{old}}); \quad \text{s.t.} \theta\in \mathcal{N}(\theta_{\text{old}})

这是一个带约束的优化问题,求解这个问题比较复杂,可以简单理解一个二阶优化问题,即使用到了Hessian矩阵。因此,后续PPO对此进行了改进。

PPO

近端策略优化算法是对TRPO算法的改进,TRPO有训练稳定的优点,但是使用二阶计算量较大。 PPO是对TRPO的改进,主要是对比较复杂的带约束的最优化问题进行了简化,可以使用一阶的优化算法进行,大大加快了效率。

我们回顾一下TRPO的带约束的优化问题:

maximizeθE[π(as;θ)π(as;θold)Aπold(s,a)]s.t.E[DKL(πθold(s)πθ(s))]δ\begin{aligned} &\underset{\theta}{\text{maximize}} \quad \mathbb{E}\big[\frac{\pi(a\vert s;\theta)}{\pi(a\vert s;\theta_{\text{old}})}A_{\pi_{\text{old}}}(s,a) \big] \\ &\text{s.t.} \quad \mathbb{E}[D_{KL}(\pi_{\theta_{\text{old}}}(\cdot\vert s) \parallel \pi_{\theta}(\cdot \vert s))] \leq \delta \end{aligned}

PPO算法有两个变体,相对TRPO来说都很简洁,它们是PPOKLPEN\text{PPO}^{KLPEN}PPOCLIP\text{PPO}^{CLIP},其中PPOCLIP\text{PPO}^{CLIP}效果更好,更常见。

PPO Penalty

PPOKLPEN\text{PPO}^{KLPEN},把约束项DKLD_{KL}放入到目标函数中去(有些类似拉格朗日乘子法),就变成了无约束的优化问题,这样就可以直接使用各种一阶优化算法了,例如SGD,ADAM:

E[π(as;θ)π(as;θold)Aπold(s,a)]βE[DKL(πθold(s)πθ(s))]\mathbb{E}\big[\frac{\pi(a\vert s;\theta)}{\pi(a\vert s;\theta_{\text{old}})}A_{\pi_{\text{old}}}(s,a) \big] - \beta \cdot \mathbb{E}[D_{KL}(\pi_{\theta_{\text{old}}}(\cdot\vert s) \parallel \pi_{\theta}(\cdot \vert s))]

其中的β\beta是一个自适应的调整项,需要一个作为超参数的dtargetd_{\text{target}},首先计算d=E[DKL(πθold(s)πθ(s))]d=\mathbb{E}[D_{KL}(\pi_{\theta_{\text{old}}}(\cdot\vert s) \parallel \pi_{\theta}(\cdot \vert s))]:

  • 如果d<dtarget/1.5β=β/2d < d_{\text{target}} / 1.5 \rightarrow \beta=\beta / 2
  • 如果d>dtarget×1.5β=β×2d > d_{\text{target}} \times 1.5 \rightarrow \beta=\beta \times 2

PPO CLIP

PPOCLIP\text{PPO}^{CLIP}对Trust Region的进行了简化,通过控制重要性采样比率控制更新的补偿。令重要性采样比率为r(θ)=π(a;θ)π(a;θold)r(\theta)=\frac{\pi(a;\theta)}{\pi(a;\theta_{\text{old}})},对r(θ)r(\theta)进行截断,并选择最小(“悲观”)的那一项:

LCLIP(θ)=E[min(r(θ)Aπold(s,a),clip(r(θ),1ϵ,1+ϵ))Aπold(s,a)]L^{CLIP}(\theta)=\mathbb{E}[\text{min}(r(\theta)A_{\pi_{\text{old}}}(s,a), \text{clip}(r(\theta), 1-\epsilon, 1+\epsilon))A_{\pi_{\text{old}}}(s,a)]

PPOCLIP\text{PPO}^{CLIP}是更常见的目标函数,论文的实验中也有更好的表现。

PPO论文作者在第5节中提到,很多方法会使用一个网络来估计advantage函数中的Vπ(s)V_{\pi}(s),如果policy网络和value网络共享参数,需要增加价值函数项LVFL^{VF}和熵奖励项(Entropy Bonus)SS,写作:

LCLIP+VF+S=E[LCLIP(θ)c1LVF(θ)+c2S[πθ(s)]]L^{CLIP+VF+S}=\mathbb{E}[L^{CLIP}(\theta)-c_1L^{VF}(\theta)+c_2S[\pi_{\theta}(s)]]

其中的c1,c2c_1, c_2都是超参数,其他两项:

  • LVF=(Vθ(s)Vtarget)2L^{VF}=(V_{\theta}(s)-V^{target})^2VtargetV^{target}可以通过广义优势估计(General Advantage Estimation, GAE)得到。

  • S[πθ(s)]=E[πθ(as)logπθ(as)]S[\pi_{\theta}(s)]=\mathbb{E}[-\pi_{\theta}(a\vert s)\log \pi_{\theta}(a\vert s)],这一公式是从熵的定义中来,熵越大表明信息量越大,目标函数鼓励这一项更大(因为使用的是++号),可以估计模型增加探索,因为π\pi函数控制动作。

PPO的算法的实现3有非常多的细节和技巧,对于复现PPO算法很重要,有博客4总结了PPO实现的各种细节,会再另外一篇博客中单独叙述。

Valued-based Method

Value函数的定义即为对未来回报的期望,因此直接使用函数来近似动作/状态价值函数(Value Functions)称为基于价值函数的算法。

DQN

深度学习时代,经典的Deep Q Network就是使用深度网络Q(s,a;w)Q(s,a ;\mathbf{w})来近似动作价值函数Q(s,a)Q(s,a),并用来控制Agent的动作:

at=argmaxaQ(st,a;w)a_t=\underset{a}{\text{argmax}} \, Q(s_t, a;\mathbf{w})

每次贪心地选择最大化价值的动作,则得到最佳动作-价值函数Q(s,a)Q^*(s,a)

我们不对DQN的网络做过多解读,举一个简单的打马里奥的例子,游戏的动作动作是A=[left,right,up]\mathcal{A}=[\text{left}, \text{right}, \text{up}],网络的输入是当前的图像,输出是每个动作的价值,例如[200,100,150][200, 100, 150],每次选择最大价值的动作。

Temporal Difference

如何训练DQN呢? 一般使用TD Learning进行训练。

RL是时序决策框架,通常以一个片段(episode)为基础,即一定会包含终止的状态。在某时刻tt,使用Q(st,a;w)Q(s_t, a;\mathbf{w})来估计不同动作的未来预期回报,但是什么时候才会得到未来预期回报的真值(GroundTruth)呢?那显然得得等到这个片段结束才会知道真值,使用梯度下降来更新模型参数,这样效率就会比较低下。

能不能在片段没有结束之前进行更新模型参数呢?可以,因为经过了某些步数之后,获得了这部分奖励的真值,可以使用这部分的真值来更新最初的预测,即每一步都修正之前的预测,每一步都更新模型的参数。

回报UtU_t包含一定的递归属性:Ut=Rt+γRt+1+γ2Rt+2+γ3Rt+3+=Rt+γUt+1U_t=R_t + \gamma R_{t+1} + \gamma^2 R_{t+2} + \gamma^3 R_{t+3} + \cdots=R_t + \gamma U_{t+1}

把上面关于UtU_t的递归方程应用在DQN中:

Q(st,a;w)Estimate of UtE[rt+γQ(St+1,At+1;w)]Estimate of Ut+1\underbrace{Q(s_t,a;\mathbf{w})}_{\text{Estimate of }U_t} \approx \mathbb{E}[r_t+\gamma\cdot \underbrace{Q(S_{t+1}, A_{t+1}; \mathbf{w})]}_{\text{Estimate of }U_{t+1}}

把求期望括号内的部分称为TD Target:

Q(st,a;w)PredictionE[rt+γQ(St+1,At+1;w)]TD Target\underbrace{Q(s_t,a;\mathbf{w})}_{\text{Prediction}} \approx \mathbb{E}\underbrace{[r_t+\gamma\cdot Q(S_{t+1}, A_{t+1}; \mathbf{w})]}_{\text{TD Target}}

有了Prediction和Target,就可以构建常见的损失函数更新模型参数了,令:

yt=rt+γQ(st+1,at+1;wt)=rt+γmaxaQ(st+1,a;wt)\begin{aligned} y_t &= r_t + \gamma \cdot Q(s_{t+1},a_{t+1};\mathbf{w_t}) \\ &= r_t + \gamma \cdot \underset{a}{\text{max}}Q(s_{t+1}, a; \mathbf{w_t}) \end{aligned}

损失函数即为:

L=12[Q(st,at;wt)yt]2L = \frac{1}{2}[Q(s_{t},a_{t};\mathbf{w_t})-y_t]^2

梯度更新参数:

wt+1=wtαLww=wt\mathbf{w_{t+1}=\mathbf{w_t}-\alpha\cdot\frac{\partial L}{\partial w}\Big\vert_{w=w_t}}

使用TD训练DQN的伪代码:

  1. 获得状态St=stS_t=s_t,执行动作At=atA_t=a_t
  2. 预测价值:qt=Q(st,at;wt)q_t=Q(s_t,a_t;\mathbf{w_t})
  3. 求微分:dt=Q(st,at;wt)wtw=wt\mathbf{d_t}=\frac{\partial Q(s_t,a_t;\mathbf{w_t})}{\partial \mathbf{w_t}} \big \vert_{w=w_t}
  4. 环境提供下一个状态st+1s_{t+1}和当前的奖励rtr_t
  5. 计算TD Target:yt=rt+γmaxaQ(st+1,a;wt)y_t=r_t + \gamma \cdot \underset{a}{\text{max}}Q(s_{t+1}, a; \mathbf{w_t})
  6. 使用梯度下降更新参数:wt+1=wtα(qtyt)dt\mathbf{w_{t+1}}=\mathbf{w_t}-\alpha\cdot (q_t-y_t) \mathbf{d}_t

Actor-Critic Method

Actor-Critic Method是Value-based和Policy-based的结合,即使用模型同时对策略函数π(as;θ)\pi(a \vert s; \mathbf{\theta})和动作-价值函数Qπ(a,s;w)Q_{\pi}(a,s;\mathbf{w})进行建模。在前面Policy Gradient的训练处已经提到使用模型来估计QQ函数。

Actor指的是策略函数π(as;θ)\pi(a \vert s; \mathbf{\theta}),用来控制动作的输出,Critic指的是动作-价值函数Qπ(a,s;w)Q_{\pi}(a,s;\mathbf{w}),用来对采取的动作进行打分,两者同时训练,使得Agent对动作的预期回报的估计越来越准,也更有可能得到更好的动作:

Vπ(s)=aπ(as;θ)Qπ(a,s;w)V_{\pi}(s)=\sum_a \pi(a \vert s; \mathbf{\theta}) \cdot Q_{\pi}(a,s;\mathbf{w})

Training Actor-Critic

同时训练策略函数π(as;θ)\pi(a \vert s; \mathbf{\theta})和动作-价值函数Qπ(a,s;w)Q_{\pi}(a,s;\mathbf{w}),需要分别用到前面的TD和梯度上升,伪代码如下:

  1. 获得状态sts_t
  2. 根据π(as;θ)\pi(a \vert s; \mathbf{\theta})随机采样动作ata_t
  3. 执行动作ata_t,从环境中获得奖励rtr_t,并转移到下一个状态st+1s_{t+1}
  4. 使用TD更新Critic网络参数w\mathbf{w}
    1. π(st+1;θ)\pi(\cdot \vert s_{t+1}; \mathbf{\theta})采样动作a~t+1\tilde a_{t+1},但是并不执行a~t+1\tilde a_{t+1}
    2. 使用Qπ(a,s;w)Q_{\pi}(a,s;\mathbf{w})来计算:qt=Q(st,at;wt)q_t=Q(s_t, a_t;\mathbf{w_t})qt+1=Q(st+1,a~t+1;wt)q_{t+1}=Q(s_{t+1}, \tilde a_{t+1}; \mathbf{w_t})
    3. 计算TD target: yt=rt+γqt+1y_t=r_t+\gamma \cdot q_{t+1}
    4. 损失函数:L(w)=12[qtyt]2L(\mathbf{w})=\frac{1}{2}[q_t-y_t]^2
    5. 梯度下降更新参数:wt+1=wtαL(wt)ww=wt\mathbf{w_{t+1}}=\mathbf{w_t}-\alpha \cdot \frac{\partial L(\mathbf{w_t})}{\partial \mathbf{w}} \big |_{\mathbf{w}=\mathbf{w_t}}
  5. 使用policy gradient来更新参数θ\mathbf{\theta}
    1. 计算梯度: dθ,t=logπ(atst,θ)θθ=θt\mathbb{d}_{\theta, t}=\frac{\partial \log\pi(a_t \vert s_t, \theta)}{\partial \theta} \big\vert_{\theta=\theta_t}
    2. 更新参数:θt+1=θ+βqtdθ,t\mathbf{\theta_{t+1}}=\mathbf{\theta}+\beta \cdot q_t \cdot \mathbb{d}_{\theta, t}
  6. 重复直到收敛

Policy vs Value vs Actor-Critic

方法优点缺点
Policy-based1.直接优化策略函数,适合连续动作空间
2.支持随机策略(从策略函数中采样得到动作)
1.高方差,训练不稳定
2.采样效率低(on-policy),收敛速度慢
3.可能陷入局部最优,对超参敏感
Value-based1.采样效率高:经验回放复用样本
2.确定性策略,通过价值函数选择最佳动作
3.收敛性较好
1.无法处理连续动作空间
2.确定性策略函数灵活性差
3.Q-learning的max操作导致价值函数高估
Actor-Critic1.结合Policy和Value方法,平衡探索与利用(随机/确定性策略)
2.低方差,Critic估计逼policy方法方差更低
3.可处理连续和离散动作空间
1.训练难度高,同时训练两个网络,调参难度大
2.Critic估计的误差可能误导Actor
3.依赖Critic估计的准确性

MISC

on-policy v.s off-policy

名称on-policyoff-policy
定义行为策略(生成数据的策略)和目标策略(正在被优化的策略)必须是同一个策略行为策略和目标策略不是同一个策略
特性1.必须用当前策略与环境交互(rollout)的数据使用策略更新
2.策略更新后之前的数据被扔掉,样本效率低
1.可复用历史数据,样本效率高
2.行为策略可以更自由(如更注重探索),而目标策略更注重优化
3.数据来自不同策略,需处理分布的差异
算法典型算法:REINFORCE, SARSA, PPO典型算法:Q-Learnig, DQN, DDPG

model-free v.s model-based

model-based方法:

  • 显式地学习动态模型,即转移函数P(ss,a)P(s' \vert s, a)和奖励函数R(s,a)R(s,a),利用该模型进行规划(Planning),例如通过模拟环境预测未来状态,从而优化策略或价值函数
  • 特点:依赖环境模型,通过模型生成的虚拟轨迹来辅助决策
  • 典型算法:Monte Carlo Tree Search (MCTS)(如AlphaGo中的规划方法),Dyna-Q, PILCO

model-free方法:

  • 显式地学习动态模型,直接通过试错从经验中学习策略或价值函数,依赖与环境的实时交互数据,而非通过动态模型的预测
  • 特点:不依赖动态模型,数据驱动,样本效率低,需要海量的交互数据;这也是目前主流的算法方向
  • 典型算法:Q-Learning, DQN,REINFORCE, PPO,A3C

Footnotes

  1. Reward Hacking in Reinforcement Learning

  2. Policy Gradient

  3. Clean RL PPO

  4. The 37 Implementation Details of Proximal Policy Optimization