强化学习(Reinforcement Learning, RL)是机器学习的核心范式之一,其核心目标是通过智能体与环境的动态交互,自主习得最优决策策略,以最大化长期累积奖励。

本文系统梳理了强化学习算法的相关数学原理,希望能对强化学习的理解有所帮助。同时,本文省略了部分基础知识的介绍,把重点放在强化学习经典算法和数学理解上,对复杂的证明和推导也予以省略。

# 基础概念

智能体(Agent):决策主体,通过观察环境状态选择动作。例如,游戏 AI 中的角色控制器。

环境(Environment):也称为模型,是智能体交互的外部世界,提供状态信息反馈奖励。环境可以是物理世界(如机器人导航场景)或虚拟系统(如电子游戏)。

状态(State):环境的当前特征描述,例如棋盘上的棋子分布(游戏场景)或自动驾驶车辆的实时位置和速度。

动作(Action):智能体在特定状态下可执行的操作,分为​​离散动作​​(如游戏中的移动方向)和​​连续动作​​(如机器人关节角度调整)。

奖励(Reward):环境对动作的即时数值反馈,用于量化动作效果。例如,游戏得分增加(正奖励)或碰撞障碍物(负奖励)。

策略(Policy):从状态到动作的映射规则,决定智能体的行为模式。策略可以是确定性的(如查表法)或概率性的(如神经网络输出动作概率分布)。

轨迹(Trajectory):智能体与环境交互过程中产生的状态、动作、奖励的序列链,即一条完整的交互路径。

回报(Return):是轨迹中所有奖励的累积值,用于量化智能体在一条轨迹上的整体表现。

  • 无折扣回报:直接累加所有即时奖励。G=r0+r1+...+rTG = r_0 + r_1 + ... + r_T
  • 折扣回报:引入折扣因子 γ(0,1)γ \in (0,1),降低远期奖励的权重。G=r0+γr1+γ2r2+...G = r_0 + γr_1 + γ^2r_2 + ...

价值函数(Value Function):衡量状态或动作的长期价值,分为​​状态价值函数​​(预测未来累积奖励)和​​动作价值函数​​(如 Q 函数)。

强化学习示意图

接下来对上述概念再做一些补充:

智能体在环境中,根据当前状态,依据策略选择一个动作与环境进行交互,交互完以后智能体进入下一个状态。每次执行动作,环境都会给出对应的奖励。当智能体确定好策略后,就可以计算出与策略相关联的状态价值函数与动作价值函数,用以评估策略的好坏。

环境是一个重要的概念,智能体与环境交互的过程中,学习到的是如何在环境中尽可能多的获取奖励。因此,环境有两个重要组成部分:一个是状态转移概率,一个是奖励的设置。一般情况下,智能体在同一状态执行相同动作可能进入的下一状态是不同的,这由环境的状态转移概率决定。环境的奖励由人为设定,由智能体所处的状态和采取的动作决定,可以是确定的,也可以是概率控制的。不同的奖励会影响智能体学习到的策略。


# 马尔可夫过程

智能体与环境的交互过程可以表示成马尔可夫过程(MPs)。以下是相关数学符号定义:

  • 智能体的状态集合表示为 SS,动作表示为状态的函数 A(s)A(s),奖励是状态和动作的函数 R(s,a)R(s,a)

  • 环境(模型)由状态转移概率和奖励概率共同决定。状态转移概率 p(ss,a)p(s'\mid s,a) 表示智能体在状态 ss 下执行动作 aa 转移到状态 ss' 的概率。奖励概率 p(rs,a)p(r\mid s,a) 表示智能体状态 ss 下执行动作 aa 获得奖励 rr 的概率。

  • 智能体执行的策略由 π\pi 表示,其中 π(as)\pi(a \mid s) 是智能体在状态 ss 下执行动作 aa 的概率。

  • 智能体与环境执行过程满足马尔可夫性质,即:

    p(st+1st,at,st1,at1,,s0,a0)=p(st+1st,at)p(rt+1st,at,st1,at1,,s0,a0)=p(rt+1st,at),p(s_{t+1}|s_t,a_t,s_{t-1},a_{t-1},\ldots,s_0,a_0)=p(s_{t+1}|s_t,a_t)\\ p(r_{t+1}|s_t,a_t,s_{t-1},a_{t-1},\ldots,s_0,a_0)=p(r_{t+1}|s_t,a_t),

同样,智能体在当前状态下执行动作的策略也与之前所处的状态无关,因此可以表示为马尔可夫决策过程(MDPs)。


# 贝尔曼公式

在相同环境下,智能体可以采取多种策略,那么哪个策略更好呢?从直观的角度来说,当智能体在环境中获取的回报越多,该策略就越好。此外,智能体在环境中有多个状态,好的策略应该在任意状态下都能获取更好的回报。由于环境的状态转移概率和奖励概率可以是不确定的,因此我们使用期望回报来评估策略的优劣。

# 一个简单示例

下面先通过一个四状态的交互例子演示如何计算回报,接着再介绍期望回报的计算和用途。

该例子中,智能体在一个四网格世界中行走,绿色箭头表示智能体采取的策略,红色数字是对应的奖励。在该示例中,所有过程都是确定的,包括策略,状态转移和奖励。

网格行走示例

我们计算从每个状态出发,智能体能获取的回报:

v1=r1+γr2+γ2r3+=r1+γ(r2+γr3+)=r1+γv2,v2=r2+γr3+γ2r4+=r2+γ(r3+γr4+)=r2+γv3,v3=r3+γr4+γ2r1+=r3+γ(r4+γr1+)=r3+γv4,v4=r4+γr1+γ2r2+=r4+γ(r1+γr2+)=r4+γv1.\begin{gathered} v_{1}=r_1+\gamma r_2+\gamma^2r_3+\ldots=r_1+\gamma(r_2+\gamma r_3+\ldots)=r_1+\gamma v_2,\\ v_{2}=r_2+\gamma r_3+\gamma^2r_4+\ldots=r_2+\gamma(r_3+\gamma r_4+\ldots)=r_2+\gamma v_3, \\ v_{3}=r_{3}+\gamma r_{4}+\gamma^{2}r_{1}+\ldots=r_3+\gamma(r_4+\gamma r_1+\ldots)=r_3+\gamma v_4, \\ v_{4}=r_4+\gamma r_1+\gamma^2r_2+\ldots=r_4+\gamma(r_1+\gamma r_2+\ldots)=r_4+\gamma v_1. \end{gathered}

v1v2v3v4v1、v2、v3、v4 分别表示从四个状态出发获取的回报。上面式子改用矩阵形式可以表示成下面的形式:

[v1v2v3v4]v=[r1r2r3r4]+[γv2γv3γv4γv1]=[r1r2r3r4]r+γ[0100001000011000]P[v1v2v3v4]v,v=r+γv\underbrace{ \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ v_4 \end{bmatrix}}_{v}= \begin{bmatrix} r_1 \\ r_2 \\ r_3 \\ r_4 \end{bmatrix}+ \begin{bmatrix} \gamma v_2 \\ \gamma v_3 \\ \gamma v_4 \\ \gamma v_1 \end{bmatrix}=\underbrace{ \begin{bmatrix} r_1 \\ r_2 \\ r_3 \\ r_4 \end{bmatrix}}_{r}+\underbrace{\gamma \begin{bmatrix} 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ 1 & 0 & 0 & 0 \end{bmatrix}}_{P}\underbrace{ \begin{bmatrix} v_1 \\ v_2 \\ v_3 \\ v_4 \end{bmatrix}}_{v},\\ v = r + \gamma v

v1v2v3v4v1、v2、v3、v4 表示智能体在上述策略下可获取的回报。

# 状态价值与贝尔曼公式

上述例子中,所有过程都是确定的,包括状态转移,策略等,因此,给定状态的回报也是确定的。当遇上随机的情况时,需要作一些拓展。

从时间 tt 开始考虑,智能体与环境的交互的数学表示如下:

StAtSt+1,Rt+1At+1St+2,Rt+2At+2St+3,Rt+3.S_t\xrightarrow{A_t}S_{t+1},R_{t+1}\xrightarrow{A_{t+1}}S_{t+2},R_{t+2}\xrightarrow{A_{t+2}}S_{t+3},R_{t+3}\ldots.

其中 SARS、A、R 均为随机变量,以描述随机情况下的强化学习过程。基于此,回报的表达式是:

Gt=Rt+1+γRt+2+γ2Rt+3+....G_t = R_{t+1} + \gamma R_{t+2} + \gamma^2R_{t+3} +....

由于 GtG_t 是一个随机变量,从状态 StS_t 出发得到的期望回报即为 vπ(s)=E[GtSt=s]v_\pi(s)=\mathbb{E}[G_t|S_t=s]。这里,vπ(s)v_\pi(s) 称为状态价值,表示状态 ss 的价值,是反映一个策略好坏的标准

下面要解决一个重要问题:如何计算给定策略的状态价值函数?答案是使用贝尔曼公式

根据 GtG_t 的数学表达,可以得到:

Gt=Rt+1+γRt+2+γ2Rt+3+=Rt+1+γ(Rt+2+γRt+3+)=Rt+1+γGt+1\begin{aligned} G_{t} &= R_{t+1}+\gamma R_{t+2}+\gamma^{2}R_{t+3}+\ldots \\ &= R_{t+1}+\gamma(R_{t+2}+\gamma R_{t+3}+\ldots)\\ &= R_{t+1}+\gamma G_{t+1} \end{aligned}

进而状态价值函数可以改写成:

vπ(s)=E[GtSt=s]=E[Rt+1+γGt+1St=s]=E[Rt+1St=s]+γE[Gt+1St=s]\begin{aligned} v_{\pi}(s) &=\mathbb{E}[G_t|S_t=s] \\ &=\mathbb{E}[R_{t+1}+\gamma G_{t+1}|S_t=s] \\ &=\mathbb{E}[R_{t+1}|S_t=s]+\gamma\mathbb{E}[G_{t+1}|S_t=s] \end{aligned}

更进一步地,有:

E[Rt+1St=s]=aAπ(as)E[Rt+1St=s,At=a]=aAπ(as)rRp(rs,a)r\begin{aligned} \mathbb{E}[R_{t+1}|S_{t}=s] & =\sum_{a\in\mathcal{A}}\pi(a|s)\mathbb{E}[R_{t+1}|S_t=s,A_t=a]\\ & =\sum_{a\in\mathcal{A}}\pi(a|s)\sum_{r\in\mathcal{R}}p(r|s,a)r \end{aligned}\\

E[Gt+1St=s]=sSE[Gt+1St=s,St+1=s]p(ss)=sSE[Gt+1St+1=s]p(ss)=sSvπ(s)p(ss)=sSvπ(s)aAp(ss,a)π(as)\begin{aligned} \mathbb{E}[G_{t+1}|S_{t}=s] & =\sum_{s^{\prime}\in\mathcal{S}}\mathbb{E}[G_{t+1}|S_t=s,S_{t+1}=s^{\prime}]p(s^{\prime}|s)\\ & =\sum_{s^{\prime}\in\mathcal{S}}\mathbb{E}[G_{t+1}|S_{t+1}=s^{\prime}]p(s^{\prime}|s)\\ & =\sum_{s^{\prime}\in\mathcal{S}}v_\pi(s^{\prime})p(s^{\prime}|s) \\ & =\sum_{s^{\prime}\in\mathcal{S}}v_\pi(s^{\prime})\sum_{a\in\mathcal{A}}p(s^{\prime}|s,a)\pi(a|s) \end{aligned}

由此推导得到贝尔曼公式:

vπ(s)=E[Rt+1St=s]+γE[Gt+1St=s],=aAπ(as)rRp(rs,a)rmean of immediate rewards+γaAπ(as)sSp(ss,a)vπ(s)mean of future rewards=aAπ(as)[rRp(rs,a)r+γsSp(ss,a)vπ(s)]\begin{aligned} v_{\pi}(s) & =\mathbb{E}[R_{t+1}|S_t=s]+\gamma\mathbb{E}[G_{t+1}|S_t=s], \\ &= \underbrace{\sum_{a\in\mathcal{A}}\pi(a|s)\sum_{r\in\mathcal{R}}p(r|s,a)r}_{\text{mean of immediate rewards}}+\underbrace{\gamma\sum_{a\in\mathcal{A}}\pi(a|s)\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)v_\pi(s^{\prime})}_{\text{mean of future rewards}}\\ &= \sum_{a\in\mathcal{A}}\pi(a|s)\left[\sum_{r\in\mathcal{R}}p(r|s,a)r+\gamma\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)v_{\pi}(s^{\prime})\right] \end{aligned}

贝尔曼公式揭示了状态价值与即时奖励和未来奖励的关系。

上面提出的贝尔曼公式是元素形式的,即公式左侧的状态价值特定于某个状态,我们令 rπ(s)=aAπ(as)rRp(rs,a)rr_{\pi}(s) = \sum_{a\in\mathcal{A}}\pi(a|s)\sum_{r\in\mathcal{R}}p(r|s,a)r 表示状态 ss 下的及时奖励期望,pπ(ss)=aAπ(as)p(ss,a)p_\pi(s^{\prime}|s) =\sum_{a\in\mathcal{A}}\pi(a|s)p(s^{\prime}|s,a) 表示策略 π\pi 下智能体从状态 ss 转移到 ss^{\prime} 的概率,那么贝尔曼公式可以写成:

vπ(si)=rπ(si)+γsjSpπ(sjsi)vπ(sj).v_{\pi}(s_i) = r_{\pi}(s_i) + \gamma \sum_{s_j \in S} p_{\pi}(s_j | s_i) v_{\pi}(s_j).

使用矩阵形式的表达:

[vπ(s1)vπ(s2)vπ(s3)vπ(s4)]vπ=[rπ(s1)rπ(s2)rπ(s3)rπ(s4)]rπ+γ[pπ(s1s1)pπ(s2s1)pπ(s3s1)pπ(s4s1)pπ(s1s2)pπ(s2s2)pπ(s3s2)pπ(s4s2)pπ(s1s3)pπ(s2s3)pπ(s3s3)pπ(s4s3)pπ(s1s4)pπ(s2s4)pπ(s3s4)pπ(s4s4)]Pπ[vπ(s1)vπ(s2)vπ(s3)vπ(s4)]vπ\underset{v_{\pi}}{\underbrace{\begin{bmatrix} v_{\pi}(s_1) \\ v_{\pi}(s_2) \\ v_{\pi}(s_3) \\ v_{\pi}(s_4) \end{bmatrix}}} = \underset{r_{\pi}}{\underbrace{\begin{bmatrix} r_{\pi}(s_1) \\ r_{\pi}(s_2) \\ r_{\pi}(s_3) \\ r_{\pi}(s_4) \end{bmatrix}}} + \gamma \underset{P_{\pi}}{\underbrace{\begin{bmatrix} p_{\pi}(s_1|s_1) & p_{\pi}(s_2|s_1) & p_{\pi}(s_3|s_1) & p_{\pi}(s_4|s_1) \\ p_{\pi}(s_1|s_2) & p_{\pi}(s_2|s_2) & p_{\pi}(s_3|s_2) & p_{\pi}(s_4|s_2) \\ p_{\pi}(s_1|s_3) & p_{\pi}(s_2|s_3) & p_{\pi}(s_3|s_3) & p_{\pi}(s_4|s_3) \\ p_{\pi}(s_1|s_4) & p_{\pi}(s_2|s_4) & p_{\pi}(s_3|s_4) & p_{\pi}(s_4|s_4) \end{bmatrix}}} \underset{v_{\pi}}{\underbrace{\begin{bmatrix} v_{\pi}(s_1) \\ v_{\pi}(s_2) \\ v_{\pi}(s_3) \\ v_{\pi}(s_4) \end{bmatrix}}}

vπv_\pi 表示所有状态的价值,rπr_\pi 是对应的即时奖励期望,PπP_\pi 是状态转移概率矩阵。基于上述矩阵形式的贝尔曼公式,可知,给定策略和环境,我们可以通过以下表达式得出状态价值函数的解析解

vπ=(IγPπ)1rπv_{\pi} = (I - \gamma P_{\pi})^{-1} r_{\pi}

# 迭代法求状态价值

上述方法可以计算所有状态价值,但在实际应用中面临着计算复杂度的问题。上述的求逆操作复杂度与状态数量相关,当智能体在环境中可能存在非常多甚至无穷多状态时,使用以上数学解析法求解状态价值不现实。因此这里介绍另一种迭代法

vk+1=rπ+γPπvk,k=0,1,2,v_{k+1} = r_{\pi} + \gamma P_{\pi} v_k, \quad k = 0, 1, 2, \ldots

viv_i 表示第 ii 次迭代得到的状态价值函数,为矩阵形式的。v0v_0 是任意初始结果,一般初始化为全零向量。当迭代次数足够多时,有:

vkvπ=(IγPπ)1rπ,kv_k \to v_\pi = (I - \gamma P_{\pi})^{-1} r_{\pi}, \quad k \to \infty

具体证明过程从略。

# 动作价值

前面我们介绍了状态价值的定义以及计算方法,也知道了通过比较不同策略的的状态价值可以评估策略的优劣。当一个策略比另一个策略更好时,它的所有状态的价值应当都比另一个策略更大。这里,我们介绍一个新的概念:动作价值。

依据状态价值的含义,可以得到动作价值的定义:智能体在一个状态下,选择一个动作的期望回报

qπ(s,a)=E[GtSt=sAt=a]q_\pi(s,a)=\mathbb{E}[G_t | S_t = s, A_t=a]

将状态价值的表达式进行拆解,我们可以得到动作价值与状态价值的关联公式:

vπ(s)=E[GtSt=s]=aAE[GtSt=s,At=a]qπ(s,a)π(as)v_\pi(s)=\mathbb{E}[G_t | S_t = s] = \sum_{a \in \mathcal{A}} \underbrace{\mathbb{E}[G_t | S_t = s, A_t = a]}_{q_{\pi}(s,a)} \pi(a|s)

回顾贝尔曼公式的表达式,状态价值可以写成动作选择概率乘上一个式子:

vπ(s)=aAπ(as)[rRp(rs,a)r+γsSp(ss,a)vπ(s)]v_\pi(s)=\sum_{a\in\mathcal{A}}\pi(a|s)\left[\sum_{r\in\mathcal{R}}p(r|s,a)r+\gamma\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)v_{\pi}(s^{\prime})\right]

通过对比,我们就得到了动作价值的表达式,它由两部分组成,一部分是当前状态下采取该动作的即时奖励期望,另一部分是执行该动作后,智能体在下一状态的期望回报:

qπ(s,a)=rRp(rs,a)r+γsSp(ss,a)vπ(s)q_\pi(s,a)=\sum_{r\in\mathcal{R}}p(r|s,a)r+\gamma\sum_{s^{\prime}\in\mathcal{S}}p(s^{\prime}|s,a)v_{\pi}(s^{\prime})

动作价值有什么用呢?和状态价值一样,都用来衡量策略的好坏。强化学习训练的过程,本质上是在不断优化智能体策略的动作价值或者状态价值,以得到更好的策略。

那么,动作价值如何计算呢?

第一种方法就是在计算得到状态价值以后,根据上面表达式求解每一个动作价值。

第二种方法则是对表达式进行改写,类似于状态价值的的迭代法,动作价值也有自己的迭代计算方法。

qπ(s,a)=rRp(rs,a)r+γsSp(ss,a)aA(s)π(as)qπ(s,a)q_{\pi}(s, a) = \sum_{r \in \mathcal{R}} p(r | s, a) r + \gamma \sum_{s' \in \mathcal{S}} p(s' | s, a) \sum_{a' \in \mathcal{A}(s')} \pi(a' | s') q_{\pi}(s', a')

可以观察到,式子左右两侧都有 qπq_\pi,给定任意初始值,使用上述转移公式进行多次迭代后,就可以得到动作价值的近似解。


# 贝尔曼最优公式

上一节通过贝尔曼公式,我们了解了如何计算策略的状态价值、动作价值来评估策略的好坏。这一节,我们将学习另一个问题:如何优化策略?是否有最优策略?如果有,怎么得到呢?

首先,我们需要定义什么是最优策略。最优策略 π\pi^* 应当满足,对于任意策略 π\pi,任意智能体的状态 ss,都有 vπ(s)vπ(s)v_{\pi^*}(s) \ge v_\pi(s)

基于最优策略的定义以及贝尔曼公式,可以得到贝尔曼最优公式:

v(s)=maxπ(s)Π(s)aAπ(as)(rRp(rs,a)r+γsSp(ss,a)v(s))=maxπ(s)Π(s)aAπ(as)q(s,a),\begin{align*} v(s) &= \max_{\pi(s) \in \Pi(s)} \sum_{a \in \mathcal{A}} \pi(a|s) \left( \sum_{r \in \mathcal{R}} p(r|s,a)r + \gamma \sum_{s' \in \mathcal{S}} p(s'|s,a)v(s') \right) \\ &= \max_{\pi(s) \in \Pi(s)} \sum_{a \in \mathcal{A}} \pi(a|s) q(s, a), \end{align*}

对应的矩阵形式:

v=maxπΠ(rπ+γPπv)v = \max_{\pi \in \Pi}(r_\pi + \gamma P_\pi v)

注意到:

aAπ(as)q(s,a)aAπ(as)maxaAq(s,a)=maxaAq(s,a),π(as)={1,a=a,0,aa.\sum_{a \in \mathcal{A}} \pi(a|s) q(s, a) \leq \sum_{a \in \mathcal{A}} \pi(a|s) \max_{a \in \mathcal{A}} q(s, a) = \max_{a \in \mathcal{A}} q(s, a), \\ \pi(a|s) = \begin{cases} 1, & a = a^*, \\ 0, & a \neq a^*. \end{cases} \\

其中,a=argmaxaq(s,a)a^* = \arg \max_{a} q(s, a)

可以证明,对于任意策略,计算其动作价值后,通过上述方式选择最大价值的动作更新策略,一定可以优化策略。因此,对于最优策略而言,选择最大价值的动作更新策略后,策略保持不变。此时,贝尔曼最优公式实际上就是最优策略满足的贝尔曼公式。

基于此,我们介绍第一种求解最优策略的方法 —— 策略迭代法。首先初始化任意智能体策略,计算对应的动作价值,通过上述式子更新策略。在经过无穷次迭代后,理论上得到的策略就是最优策略。

如有兴趣,读者可自行查阅相关证明资料。

接下来,我们还要继续分析贝尔曼最优公式,榨干它的剩余价值,得到另一种求解方法 —— 价值迭代法

首先定义 f(v)=maxπΠ(rπ+γPπv)f(v) = \max_{\pi \in \Pi}(r_\pi + \gamma P_\pi v) 函数表示基于 vv 计算 qq,选择最大价值的动作更新策略。基于此,可以将求解贝尔曼最优公式改写成求解下列方程:

v=f(v)v = f(v)

求解该方程涉及到压缩映射原理,可以证明,f(v)f(v) 函数满足压缩映射原理的条件。因此,求解上述方程可以转变成一个迭代过程。该过程是:任意初始化状态价值 v0v_0,计算 vt+1=f(vt)v_{t+1} = f(v_t)。当 tt \to \infty 后,vtvv_t \to v^*,有 v=f(v)v^* = f(v^*)。此时可以证明 vv^* 就是最优策略的状态价值,基于该价值,选择最大价值的动作更新得到的策略就是最优策略。这就是价值迭代法求解最优策略的方法。

由于这部分原理内容相对比较复杂,所以有必要进行一些补充:

观察 f(v)f(v) 表达式,在此处,π\pivv 是独立的变量,不再具有任何强化学习的约束,仅是一个数学上的表达。价值迭代和策略迭代的不同之处在于,策略迭代的任意中间过程得到的策略和价值都是一一对应的,在强化学习环境中是有语义的。但价值迭代不同,中间过程的 π\pivv 都只是一个值,没有任何实际关联。换句话说,价值迭代的过程中,vv 可能并不对应任意一个策略,即没有实际含义。但是根据数学推论,当迭代无穷次以后,我们得到 π\pi^*vv^*,满足 v=f(v)v^* = f(v^*),即满足了贝尔曼公式,此时才具有了语义,vv^* 就是 π\pi^* 的状态价值。并且,可以证明,由此得到的策略就是最优策略。

本小节的介绍思路可以概括如下:首先,阐述了贝尔曼最优公式的定义,其右侧表达式可视为一种基于贪婪策略的优化操作。可以证明,执行这一操作后,策略的状态价值不会降低,从而引出了策略迭代法(其有效性证明在此略去)。对于最优策略而言,经过该操作后,策略的价值保持不变,即满足 $ v = f (v) $。因此,求解最优策略的问题转化为求解该方程。接着,通过压缩映射原理,推导出了价值迭代方法,进而得出 $ v^* = f (v^*) $,满足贝尔曼公式。这里还有最后一个问题,最优策略满足 $ v = f (v) $ 是否意味着所有满足该方程的策略都是最优策略。事实是,在数学上是可以证明这一点,但本节中未详细展开。


# 价值迭代和策略迭代

上一节梳理了两种策略优化的方法,分别是价值迭代和策略迭代,这一节将更详细地对这两种方法进行总结,并提出另一种方法,介于价值迭代和策略迭代之间。

# 价值迭代

价值迭代的算法流程如下:

  1. 首先任意初始化一个价值函数,一般选择全 0;
  2. 基于当前价值函数 vkv_k,根据 πk+1=argmaxπ(rπ+γPπvk)\pi_{k+1} = \arg \max_{\pi} (r_{\pi} + \gamma P_{\pi} v_k) 得到下一次迭代的策略 πk+1\pi_{k+1}。这一步,称为策略更新
  3. 根据贝尔曼最优公式迭代得到下一价值函数 vk+1=rπk+1+γPπk+1vkv_{k+1} = r_{\pi_{k+1}} + \gamma P_{\pi_{k+1}} v_k,这一步称为价值更新
  4. 重复第二步和第三步直至策略变化或价值变化几乎收敛为止。

具体而言,策略更新这一步,基于当前轮次的价值函数,依据下列公式求解每个状态对应的各个动作价值:

πk+1(s)=argmaxπaπ(as)(rp(rs,a)r+γsp(ss,a)vk(s))qk(s,a),sS\pi_{k+1}(s) = \arg\max_{\pi} \sum_{a} \pi(a|s) \underbrace{\left( \sum_{r} p(r|s,a)r + \gamma \sum_{s'} p(s'|s,a)v_k(s') \right)}_{q_k(s,a)}, \quad s \in \mathcal{S}

根据最大价值的动作更新策略得到 πk+1\pi_{k+1}

πk+1(as)={1,a=ak(s)0,aak(s)\pi_{k+1}(a|s) = \begin{cases} 1, & a = a^*_k(s) \\ 0, & a \neq a^*_k(s) \end{cases}

价值更新则根据贝尔曼最优公式计算所有状态的下一轮次的状态价值:

vk+1(s)=aπk+1(as)(rp(rs,a)r+γsp(ss,a)vk(s))qk(s,a)=maxaqk(s,a),sSv_{k+1}(s) = \sum_{a} \pi_{k+1}(a|s) \underbrace{\left( \sum_{r} p(r|s,a)r + \gamma \sum_{s'} p(s'|s,a)v_k(s') \right)}_{q_k(s,a)} = \max_{a}{q_k(s,a)}, \quad s \in \mathcal{S}

总结下来,价值迭代的流程如下:

vk(s)qk(s,a)贪婪策略 πk+1(s)vk+1(s)=maxaqk(s,a)v_k(s) \rightarrow q_k(s, a) \rightarrow \text{贪婪策略 } \pi_{k+1}(s) \rightarrow v_{k+1}(s) = \max_a q_k(s, a)

# 策略迭代

策略迭代的算法流程如下:

  1. 首先初始化任意的策略。

  2. 根据当前策略,计算贝尔曼公式,求解策略的价值函数。根据第三节提到的算法,求解策略价值函数可以通过多轮迭代的方式:

    vπk(j+1)=rπk+γPπkvπk(j),j=0,1,2,v_{\pi_k}^{(j+1)} = r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}^{(j)}, \quad j = 0, 1, 2, \ldots

    因此,策略迭代算法的每一轮还有迭代,用于估计策略价值。这一步称为策略评估

  3. 基于当前策略的价值函数,根据 πk+1=argmaxπ(rπ+γPπvk)\pi_{k+1} = \arg \max_{\pi} (r_{\pi} + \gamma P_{\pi} v_k) 得到下一次迭代的策略 πk+1\pi_{k+1}。这一步称为策略改进,与价值迭代的策略更新是一样的流程。

  4. 重复第二步和第三步,直至策略变化或价值变化几乎收敛为止。

策略迭代的每一次更新策略都能使新策略的价值函数更大,并且经过无穷次迭代后,得到的策略就是最优策略。

上述结论的证明请自行查阅资料了解。

# 截断策略迭代

对比策略迭代和价值迭代的算法流程,可以发现二者之间存在一些联系。

π0PEvπ0PIπ1PEvπ1PIπ2PEvπ2PIv0PUπ1VUv1PUπ2VUv2PU\begin{aligned} \pi_0 \xrightarrow{PE} v_{\pi_0} &\xrightarrow{PI} \pi_1 \xrightarrow{PE} v_{\pi_1} \xrightarrow{PI} \pi_2 \xrightarrow{PE} v_{\pi_2} \xrightarrow{PI} \cdots \\ v_0 &\xrightarrow{PU} \pi_1' \xrightarrow{VU} v_1 \xrightarrow{PU} \pi_2' \xrightarrow{VU} v_2 \xrightarrow{PU} \cdots \end{aligned}

将策略更新和策略改进、价值更新和策略评估一一对齐,可以发现,除了策略迭代算法在最开始需要初始化一个随机策略意外,这两种算法的唯一区别仅在于价值函数的计算上。

对于策略迭代的策略评估,我们通过下面式子循环计算得到:

vπk(j+1)=rπk+γPπkvπk(j),j=0,1,2,v_{\pi_k}^{(j+1)} = r_{\pi_k} + \gamma P_{\pi_k} v_{\pi_k}^{(j)}, \quad j = 0, 1, 2, \ldots

而对于价值迭代的价值更新,我们通过下面式子计算得到:

vk+1=rπk+γPπkvkv_{k+1} = r_{\pi_k} + \gamma P_{\pi_k} v_{k}

对应上述流程中,二者的不同实际上是从 vπ1v_{\pi_1}v1v_1 的计算开始的。不难发现,v1v_1 的计算实际是计算 vπ1v_{\pi_1} 的迭代过程中的第一轮循环。更新价值时,策略迭代是在求解贝尔曼公式,而值迭代则是直接一步带入。从这个视角来看,我们就将策略迭代和价值迭代联系起来了,它们分别对应两种极端:价值迭代算法只迭代一次,策略迭代算法迭代无穷多次。而介于二者之间的算法,就是本节要介绍的截断策略迭代算法

三者的关系通过下面公式即可清晰表示:

vπ1(0)=v0value iterationv1vπ1(1)=rπ1+γPπ1vπ1(0)vπ1(2)=rπ1+γPπ1vπ1(1)truncated policy iterationvˉ1vπ1(j)=rπ1+γPπ1vπ1(j1)policy iterationvπ1vπ1()=rπ1+γPπ1vπ1()\begin{align*} \quad & v_{\pi_1}^{(0)} = v_0 \\ \text{value iteration} \leftarrow v_1 \longleftarrow \quad & v_{\pi_1}^{(1)} = r_{\pi_1} + \gamma P_{\pi_1} v_{\pi_1}^{(0)} \\ & v_{\pi_1}^{(2)} = r_{\pi_1} + \gamma P_{\pi_1} v_{\pi_1}^{(1)} \\ & \vdots \\ \text{truncated policy iteration} \leftarrow \bar{v}_1 \longleftarrow \quad & v_{\pi_1}^{(j)} = r_{\pi_1} + \gamma P_{\pi_1} v_{\pi_1}^{(j-1)} \\ & \vdots \\ \text{policy iteration} \leftarrow v_{\pi_1} \longleftarrow \quad & v_{\pi_1}^{(\infty)} = r_{\pi_1} + \gamma P_{\pi_1} v_{\pi_1}^{(\infty)} \end{align*}

截断策略迭代和策略迭代的不同就在于,策略评估时进通过有限次迭代计算价值函数,然后就进行策略改进。


# 蒙特卡洛方法

到目前为止,我们似乎已经解决了强化学习的核心问题:如何让智能体在环境中学习到最优策略?但是,目前所有学习的方法都基于一个重要前提 —— 环境已知

环境,也称模型,包含两个重要因素,分别是状态转移概率 p(ss,a)p(s^\prime | s, a) 以及奖励概率 p(rs,a)p(r|s,a)。本文前面介绍的求解最优策略的方法都是有模型的(model-base),即已经知道了环境的两个组成部分。然而,在实际场景中,绝大多数情况下,我们不可能提前了解环境,我们对环境的感知来自于智能体与环境的交互经验。换句话说,我们是在经验中学习。所以,本文的剩余内容,则聚焦于另一类强化学习方法 —— 无模型(mdoel-free)的强化学习算法。

在策略迭代中,有一步策略评估需要根据贝尔曼公式计算价值函数。然而当模型不可知时,我们无法计算状态价值。由于状态价值和动作价值的定义是从当前状态开始或执行此动作的回报期望,因此可以基于概率统计的方式,让智能体与环境进行多轮交互,得到多条轨迹(回合)的回报,然后计算平均值估计回报期望,作为状态价值或动作价值。这种方法就是最简单的基于蒙特卡洛的强化学习算法

在蒙特卡洛方法中,动作价值基于下面公式进行估计:

qπk(s,a)=E[GtSt=s,At=a]1ni=1ngπk(i)(s,a)q_{\pi_k}(s, a) = \mathbb{E}[G_t | S_t = s, A_t = a] \approx \frac{1}{n} \sum_{i=1}^{n} g_{\pi_k}^{(i)}(s, a)

其中 nn 是智能体与环境交互的回合数量,gπk(i)(s,a)g_{\pi_k}^{(i)}(s, a) 是第 ii 回合的回报奖励。

最后,根据估计的动作价值,基于蒙特卡洛的强化学习算法选择最大价值动作改进策略。

不难发现,上述方法需要进行大量的采样来估计价值,在实际应用中效率非常低下。接下来,我们逐步介绍如何优化蒙特卡洛方法,提高它的计算效率。

首先,上述方法在每次迭代需要计算某个动作价值时,会从对应的状态和动作出发执行多次,得到多个回合的回报。然而,这种采样方法得到的每个回合数据仅被用于一次计算,效率非常低下。通过下面的计算方式,我们可以更高效地利用每一回合的数据,估计对应的动作价值。

s1a2s2a4s1a2s2a3s5a1[original episode]s2a4s1a2s2a3s5a1[subepisode starting from (s2,a4)]s1a2s2a3s5a1[subepisode starting from (s1,a2)]s2a3s5a1[subepisode starting from (s2,a3)]s5a1[subepisode starting from (s5,a1)]\begin{align*} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_4} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1} \ldots \quad &\text{[original episode]} \\ s_2 \xrightarrow{a_4} s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1} \ldots \quad &\text{[subepisode starting from $(s_2, a_4)$]} \\ s_1 \xrightarrow{a_2} s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1} \ldots \quad &\text{[subepisode starting from $(s_1, a_2)$]} \\ s_2 \xrightarrow{a_3} s_5 \xrightarrow{a_1} \ldots \quad &\text{[subepisode starting from $(s_2, a_3)$]} \\ s_5 \xrightarrow{a_1} \ldots \quad &\text{[subepisode starting from $(s_5, a_1)$]} \end{align*}

改进后的算法在数据利用上更加高效,但还是存在一个问题,因为需要保证所有状态 - 动作对均能采样得到,需要从每个状态 - 动作对出发采样数据。这是因为在某些策略下,有些状态可能根本访问不到,有些动作根本不会执行,此时必须以此为起点采样数据。

进而引出新的改进算法 ϵgreedy\epsilon-greedy 蒙特卡洛方法。该算法基于策略迭代方法,在策略改进时使用下述式子更新策略:

π(as)={1ϵA(s)(A(s)1),a=aϵA(s),aa\pi(a|s) = \begin{cases} 1 - \dfrac{\epsilon}{|\mathcal{A}(s)|}(|\mathcal{A}(s)| - 1), & a = a^* \\ \dfrac{\epsilon}{|\mathcal{A}(s)|}, & a \ne a^* \end{cases}

这保证每次更新得到的策略依然具有随机性,随机程度由 ϵ[0,1]\epsilon \in [0,1] 超参数设置。通过这种方式更新得到的策略,可以保证智能体在任意状态下都可能执行所有动作(探索性策略),即从任意状态 - 动作对出发,只要进行足够长的交互,就可以访问到所有状态 - 动作对,也可以计算所有动作价值。这样,在策略评估阶段,只需要进行一回合交互就可以更新策略,大大提高了蒙特卡洛算法的计算效率。

需要补充的是,策略迭代算法在实际执行时可以不等待动作价值计算完成再更新策略,可以只进行几步估计就进行更新。虽然动作价值的估计很粗糙,但从长远角度来看,这种做法依然可以逼近最优策略。

ϵ-greedy 蒙特卡洛算法伪代码

在实际应用中,ϵ\epsilon 的设置对智能体学习到的策略有直接影响,一般来说 ϵ\epsilon 的值不宜过大,在 0.1 左右即可,视情况而定。也可以在策略迭代开始时设置一个较大的 ϵ\epsilon,随后在迭代过程中逐渐减小。


# 时序差分法

本节介绍另一个免模型的强化学习方法 —— 时序差分法(temporal-difference learning)。在此之前,需要先了解一些数学背景,方便更好地理解该算法。

# Robbins-Monro 算法

RM 算法用于求解这样一个等式的根:

g(w)=0g(w) = 0

其中 gg 的表达式未知,并在一般情况下,我们认为它是一个单调递增函数(机器学习中常常把优化的目标函数视为凸函数,而凸函数的导数具有单调性)。

当给定 ww 时,我们得到一个带有噪声的观察结果,其中 η\eta 是观察的误差:g~(w,η)=g(w)+η\tilde{g}(w, \eta) = g(w) + \eta

可视化表示成下面的形式:

![RM 算法求解示例](https://jongsh.oss-cn-beijing.aliyuncs.com/blog/content/202505/202505132152478.png?x-oss-process=image/format,webp"/>

RM 算法解决此求根问题的做法是构造下面的迭代过程:

wk+1=wkakg~(wk,ηk),k=1,2,3,w_{k+1} = w_k - a_k \tilde{g}(w_k, \eta_k), \quad k = 1, 2, 3, \ldots

其中 wkw_k 是对根的第 kk 次估计,aka_k 是一个正系数,随着 kk 增大而逐渐减小,最常见的设置是 ak=1ka_k = \frac{1}{k}。数学上,当 ggaka_k 满足一定条件时,RM 算法被证明可以逐渐收敛到上述等式的解。具体的数学证明和推论这里略去。

比如,对于随机变量 XX,我们希望估计其期望 E(X)\mathbb E(X),使用 RM 算法求解等同于求解表达式 g(w)=wE(X)=0g(w) = w - \mathbb E(X) = 0 的根。每次从中采样 xx 作为观测,有:

g~(w,η)=wx=(wE(X))+(E(X)x)=g(w)+η\tilde g(w, \eta) = w - x = (w - \mathbb E(X)) + (\mathbb E(X) - x) = g(w) + \eta

ak=1ka_k = \frac{1}{k},可以通过下列表达式迭代循环求解得到期望 E(X)\mathbb E(X)

wk+1=wkαkg~(wk,ηk)=wk1k(wkxk)=(k1)wk+xkkw0=0\begin{align*} w_{k+1} &= w_k - \alpha_k \tilde{g}(w_k, \eta_k)\\ &= w_k - \frac{1}{k} (w_k - x_k)\\ &= \frac{(k-1)w_k+x_k}{k}\\ w_0 &= 0 \end{align*}

# 随机梯度下降

将 RM 算法用于求解下列优化问题,即可得到随机梯度下降算法(SGD):

minwJ(w)=E[f(w,X)]\min_{w} J(w) = \mathbb{E}[f(w, X)]

其中 ww 是可调节的参数,XX 表示输入的数据,ff 在给定参数和数据下输出计算结果。在机器学习中,这种表达方式非常常见:ff 可以表示具体任务的损失函数,XX 是任务相关数据集,ww 是神经网络参数。

一般情况下,我们认为 ff 是凸函数,至少在某些局部具有该性质,因此,求解该优化问题等同于求解下面等式的根:

wJ(wk)=E[wf(wk,X)]=0\nabla_w J(w_k) = \mathbb{E}[\nabla_w f(w_k, X)] = 0

应用 RM 算法,等价于如下迭代过程:

wk+1=wkαkwJ(wk)=wkαkE[wf(wk,X)].w_{k+1} = w_k - \alpha_k \nabla_w J(w_k) = w_k - \alpha_k \mathbb{E}[\nabla_w f(w_k, X)].

实际应用中,XX 的数量非常大,每次迭代仅能会用到其中部分样本,即带有噪声的观测结果。此时上述迭代过程修改为下面表示:

wk+1=wkαkni=1nwf(wk,xi)w_{k+1} = w_k - \frac{\alpha_k}{n} \sum_{i=1}^{n} \nabla_w f(w_k, x_i)

这就是随机梯度下降算法的流程。

# 时序差分算法

简单了解 RM 和 SGD 数学原理后,我们正式进入本节的核心部分。

时序差分算法的核心是将 RM 迭代过程应用到状态价值的估计上。回顾状态价值的定义:

v(s)=E(R+γv(S)s)v(s) = \mathbb E(R + \gamma v(S')|s)

不难想到,将上述期望求解转换成 RM 问题范式,即可得到下列估计方法:

vt+1(st)=vt(st)αt(st)[vt(st)(rt+1+γvt(st+1))]vt+1(s)=vt(s),for all sst\begin{align*} v_{t+1}(s_t) &= v_t(s_t) - \alpha_t(s_t) \Big[ v_t(s_t) - \big( r_{t+1} + \gamma v_t(s_{t+1}) \big) \Big] \\ v_{t+1}(s) &= v_t(s), \quad \text{for all } s \neq s_t \end{align*}

其中 (s0,r1,s1,...,st,rt+1,st+1,...)(s_0, r_1, s_1,...,s_t,r_{t+1}, s_{t+1},...) 是智能体在对应策略下与环境交互的经验。基于上述算法,利用每次交互的结果逐步更新价值的估计,就是时序差分算法的流程。

# Sarsa

将时序差分方法直接应用于动作价值的估计,就得到一个新的算法:Sarsa。

假设 s0,a0,r1,s1,a1,...s_0, a_0, r_{1}, s_{1}, a_1, ... 是智能体与环境交互的数据,根据动作价值的定义:

q(s,a)=E(R+γq(S,A)s,a)q(s,a) = \mathbb E(R + \gamma q(S', A')|s,a)

很容易根据 RM 算法得到 Sarsa 算法的策略评估方法:

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)(rt+1+γqt(st+1,at+1))]qt+1(s,a)=qt(s,a),for all (s,a)(st,at)\begin{align*} q_{t+1}(s_t, a_t) &= q_t(s_t, a_t) - \alpha_t(s_t, a_t) \Big[ q_t(s_t, a_t) - \big( r_{t+1} + \gamma q_t(s_{t+1}, a_{t+1}) \big) \Big] \\ q_{t+1}(s, a) &= q_t(s, a), \quad \text{for all } (s, a) \neq (s_t, a_t) \end{align*}

Sarsa 名字的由来正是每次更新价值函数时都需要采用经验 st,at,rt+1,st+1,at+1s_t, a_t, r_{t+1}, s_{t+1}, a_{t+1}

# n-step Sarsa

下表是时序差分法与蒙特卡洛方法的对比:

TD-learning MC
TD-learning 是增量的,可以在接收到经验样本后立即更新状态 / 动作值 MC 是非增量的,须等待回合结束后才计算回报期望
由于增量性,可以处理持续性任务,即可能没有终止状态 MC 只能处理有限步骤的任务
TD-learning 具有自举性,状态 / 动作值的更新依赖于该值的先前估计 MC 不需要自举,直接估计状态 / 动作值
TD-learning 的估计方差更低,偏差更大,因为它涉及的随机变量较少。例如,估计一个动作值 qπ(st,at)q_\pi(s_t, a_t),Sarsa 只需要三个随机变量的样本:Rt+1,St+1,At+1R_{t+1}, S_{t+1}, A_{t+1} MC 的估计方差较高,偏差更小。因为它涉及更多的随机变量。例如,估计 qπ(st,at)q_\pi(s_t, a_t) 需要采样 $ R_t+1} + \gamma R_{t+2} + \gamma(2 R_{t+3) + \ldots $

从另一个视角来看,TD-learning 和蒙特卡洛方法是两种极端情况。以估计动作价值为例,Sarsa 仅采样一次交互的数据,而蒙特卡洛方法则需要完整地采样一个回合的数据。介于两者之间的,采样 n 次交互经验的算法,就是 n-step Sarsa 算法。

SarsaGt(1)=Rt+1+γqπ(St+1,At+1),Gt(2)=Rt+1+γRt+2+γ2qπ(St+2,At+2),n-step SarsaGt(n)=Rt+1+γRt+2++γnqπ(St+n,At+n),MCGt()=Rt+1+γRt+2+γ2Rt+3+γ3Rt+4\begin{align*} \text{Sarsa} \longleftarrow \quad & G_t^{(1)} = R_{t+1} + \gamma q_{\pi}(S_{t+1}, A_{t+1}), \\ & G_t^{(2)} = R_{t+1} + \gamma R_{t+2} + \gamma^2 q_{\pi}(S_{t+2}, A_{t+2}), \\ & \vdots \\ n\text{-step Sarsa} \longleftarrow \quad & G_t^{(n)} = R_{t+1} + \gamma R_{t+2} + \cdots + \gamma^n q_{\pi}(S_{t+n}, A_{t+n}), \\ & \vdots \\ \text{MC} \longleftarrow \quad & G_t^{(\infty)} = R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \gamma^3 R_{t+4} \ldots \end{align*}

n=1n=1 时:

qπ(s,a)=E[Gt(1)s,a]=E[Rt+1+γqπ(St+1,At+1)s,a]qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)(rt+1+γqt(st+1,at+1))]q_{\pi}(s, a) = \mathbb{E}[G_t^{(1)} \mid s, a] = \mathbb{E}[R_{t+1} + \gamma q_{\pi}(S_{t+1}, A_{t+1}) \mid s, a]\\ q_{t+1}(s_t, a_t) = q_t(s_t, a_t) - \alpha_t(s_t, a_t) \Big[ q_t(s_t, a_t) - \big( r_{t+1} + \gamma q_t(s_{t+1}, a_{t+1}) \big) \Big]

n=n=\infty 时:

qπ(s,a)=E[Gt()s,a]=E[Rt+1+γRt+2+γ2Rt+3+s,a]qt+1=rt+1+γrt+2+γ2rt+3+q_{\pi}(s, a) = \mathbb{E}[G_t^{(\infty)} \mid s, a] = \mathbb{E}[R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \ldots \mid s, a]\\ q_{t+1} = r_{t+1} + \gamma r_{t+2} + \gamma^2 r_{t+3} + \ldots

更一般的情况:

qπ(s,a)=E[Gt()s,a]=E[Rt+1+γRt+2+γ2Rt+3+γnqπ(St+n,At+n)s,a]qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)(rt+1+γrt+2+γnqt(st+n,at+n))]q_{\pi}(s, a) = \mathbb{E}[G_t^{(\infty)} \mid s, a] = \mathbb{E}[R_{t+1} + \gamma R_{t+2} + \gamma^2 R_{t+3} + \gamma^nq_\pi(S_{t+n},A_{t+n}) \mid s, a]\\ q_{t+1}(s_t, a_t) = q_t(s_t, a_t) - \alpha_t(s_t, a_t) \Big[ q_t(s_t, a_t) - \big( r_{t+1} + \gamma r_{t+2} + \gamma^n q_t(s_{t+n}, a_{t+n}) \big) \Big]

分别对应 Sarsa、MC、n-step Sarsa 算法。

# Q-learning

从对策略的状态价值的估计到动作价值的估计,我们了解了许多 TD-learning 的变体。它们仅在与策略评估的计算方法上有所区别。

这里我们介绍另一种强化学习算法 ——Q-learning,直接估计最优策略的动作价值,而非给定策略的动作价值。具体的计算公式如下:

qt+1(st,at)=qt(st,at)αt(st,at)[qt(st,at)(rt+1+γmaxaA(st+1)qt(st+1,a))]qt+1(s,a)=qt(s,a),for all (s,a)(st,at)\begin{align*} q_{t+1}(s_t, a_t) &= q_t(s_t, a_t) - \alpha_t(s_t, a_t) \left[ q_t(s_t, a_t) - \left( r_{t+1} + \gamma \max_{a \in \mathcal{A}(s_{t+1})} q_t(s_{t+1}, a) \right) \right] \\ q_{t+1}(s, a) &= q_t(s, a), \quad \text{for all } (s, a) \neq (s_t, a_t) \end{align*}

这里 qtq_t 是对最优策略的动作价值的第 tt 次估计。

根据 RM 算法原理可知,Q-learning 实际上是求解如下期望:

q(s,a)=E[Rt+1+γmaxaq(St+1,a)St=s,At=a]q(s, a) = \mathbb{E} \left[ R_{t+1} + \gamma \max_a q(S_{t+1}, a) \bigg| S_t = s, A_t = a \right]

这其实是在求解贝尔曼最优公式

以下是一个简单的推导证明:

  1. 将上面式子改写:

    q(s,a)=rp(rs,a)r+γsp(ss,a)maxaA(s)q(s,a)q(s, a) = \sum_{r} p(r|s, a)r + \gamma \sum_{s'} p(s'|s, a) \max_{a \in \mathcal{A}(s')} q(s', a)

  2. 左右同时取最大值:

    maxaA(s)q(s,a)=maxaA(s)[rp(rs,a)r+γsp(ss,a)maxaA(s)q(s,a)]\max_{a \in \mathcal{A}(s)} q(s, a) = \max_{a \in \mathcal{A}(s)} \left[ \sum_{r} p(r|s, a)r + \gamma \sum_{s'} p(s'|s, a) \max_{a \in \mathcal{A}(s')} q(s', a) \right]

  3. 根据贝尔曼最优公式定义得出:

    v(s)=maxaA(s)[rp(rs,a)r+γsp(ss,a)v(s)]=maxπaA(s)π(as)[rp(rs,a)r+γsp(ss,a)v(s)]\begin{align*} v(s) &= \max_{a \in \mathcal{A}(s)} \left[ \sum_{r} p(r|s, a)r + \gamma \sum_{s'} p(s'|s, a)v(s') \right] \\ &= \max_{\pi} \sum_{a \in \mathcal{A}(s)} \pi(a|s) \left[ \sum_{r} p(r|s, a)r + \gamma \sum_{s'} p(s'|s, a)v(s') \right] \end{align*}

由于 Q-learning 是在估计最优的动作价值,但是采集智能体交互数据的策略显然不是最优策略(否则不需要学习了),这就引出了 on-policy learning 和 off-policy learning 的区别:

  • on-policy learning:采集交互数据的策略和正在迭代优化的策略是同一个。
  • off-policy learning:采集交互数据的策略和正在迭代优化的策略不是同一个。

Sarsa 属于 on-policy,在估计动作价值时需要基于当前策略采样下一动作 s,a,r,s,as, a, r, s', \bold{a'},与执行策略相关。

Q-learning 属于 off-policy,其更新动作价值时所需的经验与策略无关,只需要以对应的状态动作对出发,采集奖励和下一状态即可,这些数据仅和环境相关,和策略无关。

另一个类似的概念是在线学习(online learning)和离线学习(offline learning)。在线学习指的是智能体在与环境交互的同时更新其价值和策略。离线学习指智能体使用预先收集的经验数据来更新其价值和策略,而无需与环境进行交互。如果一个算法是 on-policy 的,那么它可以以在线方式实现,但不能使用其他策略预先收集的数据。如果一个算法是 off-policy 的,那么它可以以在线或离线方式实现。

下面是 Q-learning 在线学习和离线学习对应的伪代码:

Q-learning 在线学习版本

Q-learning 离线学习版本


# 值函数估计

本节继续介绍时序差分法,但和以往不同的是,我们使用函数来表示价值。此前,无论是状态价值还是动作价值,我们都是使用表格来记录。这种方式的弊端很明显,只能处理有限的状态或动作,对于很多具有连续空间的环境则无能为力。

之所以可以使用函数表示价值,是基于一个事实或者假设:很多情况下,相近的状态或动作具有相近的价值,甚至是存在一定规律的。如果可以用函数来表示这种规律和关联关系,我们就可以用有限的参数处理无穷的价值。

这种利用函数估计价值的强化学习方法,称为值函数估计法

# 状态价值的时序差分法

首先来看如何将值函数估计应用于状态价值的时序差分法中。

v^(S,w)\hat{v}(S, w) 表示基于参数 ww 估计状态价值的函数,此时目标是找到最合适的参数 ww 以最小化下列函数:

J(w)=E[(vπ(S)v^(S,w))2]J(w) = \mathbb{E}[(v_{\pi}(S) - \hat{v}(S, w))^2]

应用随机梯度下降算法,求解过程如下:

wk+1=wkαkwJ(wk)=wk+2αkE[(vπ(S)v^(S,wk))wv^(S,wk)]wk+2αk(vπ(st)v^(st,wk))wv^(st,wk)\begin{align*} w_{k+1} &= w_k - \alpha_k \nabla_w J(w_k) \\ &= w_k + 2\alpha_k \mathbb{E}[(v_{\pi}(S) - \hat{v}(S, w_k)) \nabla_w \hat{v}(S, w_k)] \\ & \approx w_k + 2\alpha_k (v_{\pi}(s_t) - \hat{v}(s_t, w_k)) \nabla_w \hat{v}(s_t, w_k) \end{align*}

上述式子用到 vπ(S)v_{\pi}(S) 作为真实标签,可惜的是,实际应用中我们并不知道策略的状态价值。因此,可以采用两种方法来近似表示 vπv_{\pi}

  • 蒙特卡洛采样,用采样结果的期望表示状态价值。

  • 使用 TD-learning 的方式估计,此时上面的算法表示为:

    wk+1=wk+αk[rt+1+γv^(st+1,wk)v^(st,wk)]wv^(st,wk)w_{k+1} = w_k + \alpha_k \left[ r_{t+1} + \gamma \hat{v}(s_{t+1}, w_k) - \hat{v}(s_t, w_k) \right] \nabla_w \hat{v}(s_t, w_k)

# 动作价值的时序差分法

同理,可以将值函数估计应用于动作价值的时序差分法中。

对于 Sarsa 算法,用 q^(s,a,w)\hat q(s, a, w) 函数来估计 qπ(s,a)q_{\pi}(s,a),可以得到如下算法表示:

wt+1=wt+αt[rt+1+γq^(st+1,at+1,wt)q^(st,at,wt)]wq^(st,at,wt)w_{t+1} = w_t + \alpha_t \left[ r_{t+1} + \gamma \hat{q}(s_{t+1}, a_{t+1}, w_t) - \hat{q}(s_t, a_t, w_t) \right] \nabla_w \hat{q}(s_t, a_t, w_t)

该表达式与状态价值的时序差分法相似,除了使用函数估计价值以外,算法的迭代过程和原始时序差分法无异。

对于 Q-learning,同样可以得到值函数估计的算法:

wt+1=wt+αt[rt+1+γmaxaA(st+1)q^(st+1,a,wt)q^(st,at,wt)]wq^(st,at,wt)w_{t+1} = w_t + \alpha_t \left[ r_{t+1} + \gamma \max_{a \in \mathcal{A}(s_{t+1})} \hat{q}(s_{t+1}, a, w_t) - \hat{q}(s_t, a_t, w_t) \right] \nabla_w \hat{q}(s_t, a_t, w_t)

# Deep Q-learning

将深度神经网络作为拟合动作价值的函数,应用于 Q-learning 算法,即可得到 Deep Q-learning 算法(或称为 Deep Q-network,DQN)。DQN 是最早的一种比较成功的深度强化学习算法

在数学上,DQN 等价于最小化下列目标函数,即最小化贝尔曼最优误差:

J=E[(R+γmaxaA(S)q^(S,a,w)q^(S,A,w))2]J = \mathbb{E} \left[ \left( R + \gamma \max_{a \in \mathcal{A}(S')} \hat{q}(S', a, w) - \hat{q}(S, A, w) \right)^2 \right]

该优化问题可以通过随机梯度下降算法解决,但是由于上述式子中存在两处 ww 参数,梯度计算过程稍显复杂,所以 DQN 引入两个网络:主网络表示 q^(s,a,w)\hat q(s,a,w)目标网络表示 q^(s,a,wT)\hat q(s,a,w_T),是主网络的一个快照,在梯度下降更新参数保持不变。在这种情况下,目标函数变为:

J=E[(R+γmaxaA(S)q^(S,a,wT)q^(S,A,w))2]J = \mathbb{E} \left[ \left( R + \gamma \max_{a \in \mathcal{A}(S')} \hat{q}(S', a, w_T) - \hat{q}(S, A, w) \right)^2 \right]

计算梯度时,wTw_T 保持固定,此时有:

wJ=2E[(R+γmaxaA(S)q^(S,a,wT)q^(S,A,w))wq^(S,A,w)]\nabla_w J = -2\mathbb{E} \left[ \left( R + \gamma \max_{a \in \mathcal{A}(S')} \hat{q}(S', a, w_T) - \hat{q}(S, A, w) \right) \nabla_w \hat{q}(S, A, w) \right]

总结 DQN 算法流程:首先以相同参数初始化主网络和目标网络,在每次迭代过程中,从经验回放池中随机采取小批次样本 {(s,a,r,s)}\{(s,a,r,s')\},计算 q^(s,a,w)\hat q(s,a,w)r+γmaxaA(S)q^(s,a,wT)r+\gamma \max_{a \in \mathcal{A}(S')}\hat q(s',a, w_T),然后基于目标函数,应用梯度下降算法优化主网络参数。经过几次迭代后,将目标网络的参数设置与主网络相同,然后继续迭代过程。

上述过程提到了经验回放池,这里简要做个介绍。因为 Q-learning 属于 off-policy learning,所需要的交互数据与当前优化策略无关,所以可以将收集到的经验样本存储在一个称为回放缓冲区的数据集中,每次迭代时从中随机抽取一个小批次数据。其中,样本的抽取称为经验回放,需满足均匀分布。


# 策略梯度法

前面的章节介绍了如何使用函数表示策略的状态价值 / 动作价值,这一节,我们学习如何使用函数表达策略。

此前,策略的表示,是通过表格记录的,即存储智能体在每个状态下执行指定动作的概率。而函数则是使用 π(as,θ)\pi(a|s,\theta) 来表示策略,其中 θ\theta 是函数的参数。用函数表示策略后,需要通过优化某个目标来寻找最优策略,其中一种方法是策略梯度法

策略梯度法与前文提及的所有优化方法都不同,它们均属于 value-base 的方法,以估计价值为核心来优化策略。而策略梯度法属于 policy-base 的方法,直接建立一个函数表示策略,通过优化某个目标求得最优的策略

那么,策略梯度法的优化目标是什么呢?

第一种目标是平均状态价值,即状态价值的加权平均,表示为:

vˉπ=sSd(s)vπ(s)\bar{v}_\pi = \sum_{s \in \mathcal{S}} d(s) v_\pi(s)

其中 d(s)d(s) 可以理解为状态的权重。如何选择 d(s)d(s) 又可以分成两种情况:

  • 第一种情况是 d(s)d(s) 与策略无关,比如可以设置所有的状态权重都相等,或者只将一个状态的权重设为 1,其他状态均为 0(智能体只从固定状态出发)。此时梯度计算非常方便。

  • 第二种情况 d(s)d(s) 与策略相关,表示在策略 π\pi 下,状态 ss 的出现概率,重新表示为 dπ(s)d_{\pi}(s)。根据此定义,可以写出下列等式:

    dπPπ=dπd_\pi P_\pi = d_\pi

    其中 PπP_{\pi} 是状态转移矩阵。

第二种目标是平均一步奖励(average one-step reward)或简称为平均奖励(average reward)。其定义如下:

rˉπ=sSdπ(s)rπ(s)=ESdπ[rπ(S)]\begin{align*} \bar{r}_\pi & = \sum_{s \in \mathcal{S}} d_\pi(s) r_\pi(s) \\ & = \mathbb{E}_{S \sim d_\pi} [r_\pi(S)] \end{align*}

其中 rπ(s)r_{\pi}(s) 表示为执行动作的即时奖励期望:

rπ(s)=aAπ(as,θ)r(s,a)=EAπ(s,θ)[r(s,A)s]r(s,a)=E[Rs,a]=rrp(rs,a)r_\pi(s) = \sum_{a \in \mathcal{A}} \pi(a | s, \theta) r(s, a) = \mathbb{E}_{A \sim \pi(s, \theta)} [r(s, A) | s]\\ r(s,a) = \mathbb E\left[R|s,a\right] = \sum_rrp(r|s,a)

下表列出了两类优化目标以及对应的一些等价表达式。

两类优化目标及相关等价表示

通过最大化上述目标,可以优化策略函数,这就是策略梯度法的核心思想。

在数学上,可以证明:

θrˉπ=(1γ)θvˉπsSdπ(s)aAθπ(as,θ)qπ(s,a)=ESdπ,Aπ(S,θ)[θlnπ(AS,θ)qπ(S,A)],\begin{align*} \nabla_\theta \bar{r}_\pi &= (1 - \gamma) \nabla_\theta \bar{v}_\pi \approx \sum_{s \in \mathcal{S}} d_\pi(s) \sum_{a \in \mathcal{A}} \nabla_\theta \pi(a | s, \theta) q_\pi(s, a) \\ &= \mathbb{E}_{S \sim d_{\pi}, A \sim \pi(S, \theta)} \left[ \nabla_\theta \ln \pi(A | S, \theta) q_\pi(S, A) \right], \end{align*}

其中,γ\gamma 是折扣因子,SdπS \sim d_\piAπ(S,θ)A \sim \pi(S, \theta)

关于策略梯度法中目标函数的梯度推导,此处就略过了。

使用梯度上升法优化目标函数,即:

θt+1=θt+αθJ(θt)=θt+αE[θlnπ(AS,θt)qπ(S,A)]\begin{align*} \theta_{t+1} &= \theta_t + \alpha \nabla_\theta J(\theta_t) \\ &= \theta_t + \alpha \mathbb{E} \left[ \nabla_\theta \ln \pi(A | S, \theta_t) q_\pi(S, A) \right] \end{align*}

其中期望梯度可以使用小批次数据的梯度替代,而 qπ(S,A)q_{\pi}(S,A) 可以使用蒙特卡洛采样估计得到,这就是 REINFORCE 算法或蒙特卡洛策略梯度法,其伪代码如下所示。

REINFORCE 算法伪代码


# Actor-Critic

本节介绍 Actor-Critic 方法。这里,Actor 指的是策略更新,Critic 指的是价值更新。

# 最简单的 Actor-Critic 算法

回顾策略梯度法的优化公式:

θt+1=θt+αθJ(θt)=θt+αE[θlnπ(AS,θt)qπ(S,A)]θt+αθlnπ(atst,θt)qπ(st,at)\begin{align*} \theta_{t+1} &= \theta_t + \alpha \nabla_\theta J(\theta_t) \\ &= \theta_t + \alpha \mathbb{E} \left[ \nabla_\theta \ln \pi(A | S, \theta_t) q_\pi(S, A) \right]\\ &\approx \theta_t + \alpha \nabla_\theta \ln \pi(a_t | s_t, \theta_t) q_\pi(s_t, a_t) \end{align*}

上述式子一方面是 policy-base 算法,直接优化策略函数参数。另一方面,上述式子中出现了 qπ(st,at)q_{\pi}(s_t, a_t),需要一个 value-base 算法进行估计。到目前为止,估计策略的状态 / 动作价值的方法有两种,一个是蒙特卡洛采样,另一个是时序差分学习。前者正是上一节 REINFORCE 算法的做法,后者则是本章要介绍的 Actor-Critic 算法。

最简单的 Actor-Critic 算法使用 Sarsa 方法进行估计,以 q(s,a,w)q(s,a,w) 函数表示,其中 ww 是函数参数。该算法也被称为 Q Actor-Critic(QAC),其伪代码如下图所示。

QAC 算法伪代码

# Advantage Actor-Critic

接下来学习另一个 Actor-Crtic 方法,通过引入一个与动作无关的基线(baseline)来减小策略梯度的方差,有助于提高算法的稳定性和效率。该方法称为 Advantage Actor-Critic(A2C)算法。

A2C 的数学原理如下:

ESη,Aπ[θlnπ(AS,θt)qπ(S,A)]=ESη,Aπ[θlnπ(AS,θt)(qπ(S,A)b(S))]\mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_{\theta} \ln \pi(A|S,\theta_t) q_{\pi}(S,A) \right] = \mathbb{E}_{S \sim \eta, A \sim \pi} \left[ \nabla_{\theta} \ln \pi(A|S,\theta_t) (q_{\pi}(S,A) - b(S)) \right]

证明从略。

基于上述原理,在策略梯度法优化目标函数时,可以减去一个只与状态有关的基线,使得梯度的期望保持不变,但方差可以减小。减小方差在实际应用中意义重大,因为策略梯度法优化目标函数时无法同时计算所有动作、所有状态的梯度值,往往只能在小批量的样本中作更新,如果采样的梯度方差小,那么可以提高算法稳定性,加快训练效率。

那么,能满足上述要求的最佳基线是什么呢,这里不加解释地直接给出结论:

b(s)=EAπ[θlnπ(As,θt)2qπ(s,A)]EAπ[θlnπ(As,θt)2],sSb^*(s) = \frac{\mathbb{E}_{A \sim \pi} \left[ \| \nabla_{\theta} \ln \pi(A|s,\theta_t) \|^2 q_{\pi}(s,A) \right]}{\mathbb{E}_{A \sim \pi} \left[ \| \nabla_{\theta} \ln \pi(A|s,\theta_t) \|^2 \right]}, \quad s \in \mathcal{S}

上述式子是理论最优,但形式复杂,无法直接使用,一般会使用一个次优的基线,如下所示:

b(s)=EAπ[qπ(s,A)]=vπ(s),sSb^{\dagger}(s) = \mathbb{E}_{A \sim \pi} [q_{\pi}(s, A)] = v_{\pi}(s), \quad s \in \mathcal{S}

这个次优的基线,刚好就是策略的状态价值

基于上述讨论,A2C 算法的优化方程如下,其中动作价值减去了状态价值基线来稳定训练过程:

θt+1=θt+αE[θlnπ(AS,θt)[qπ(S,A)vπ(S)]]θt+αθlnπ(atst,θt)[qt(st,at)vt(st)]=θt+αθlnπ(atst,θt)δt(st,at),\begin{align*} \theta_{t+1} &= \theta_t + \alpha \mathbb{E}\left[ \nabla_{\theta} \ln \pi(A|S,\theta_t) [q_{\pi}(S,A) - v_{\pi}(S)] \right] \\ &\approx \theta_t + \alpha \nabla_{\theta} \ln \pi(a_t|s_t,\theta_t) [q_t(s_t, a_t) - v_t(s_t)] \\ &= \theta_t + \alpha \nabla_{\theta} \ln \pi(a_t|s_t,\theta_t) \delta_t(s_t, a_t), \end{align*}

其中 qt(st,at)q_t(s_t,a_t)vt(st)v_t(s_t) 是对 qπ(st,at)q_{\pi}(s_t,a_t)vπ(st)v_{\pi}(s_t) 的估计。如果该估计由蒙特卡洛方法采样而来,就称为带基线的 REINFORCE 算法;如果是通过时序差分法估计得到,那么就是 A2C 算法。下图是 A2C 算法的伪代码:

A2C 算法伪代码

其中 qt(st,at)vt(st)q_t(s_t, a_t) - v_t(s_t)rt+1+γvt(st+1)vt(st)r_{t+1} + \gamma v_t(s_{t+1}) - v_t(s_t) 近似估计,只需要使用一个函数表示状态价值即可。

# Off-policy Actor-Critic

REINFORCE、QAC、A2C 算法都是 on-policy 算法,计算目标函数的梯度时需要根据当前正在优化的策略采样动作。自然而然地会想到,是否可以重复使用已经采样得到的经验,来提高样本的利用效率呢?这里就需要用到重要性采样技术。

# 重要性采样

考虑随机变量 XXX \in \mathcal{X}p0(X)p_0(X) 是一个随机分布,我们的目标是估计 EXp0[X]\mathbb E_{X\sim p_0}[X]

现在我们采样一组随机样本 {xi}i=1n\{x_i\}_{i=1}^n,如果采样自分布 p0(X)p_0(X),那么基于该组样本计算平均值就得到了对期望的估计。如果采样的分布来自另一个随机分布 p1(X)p_1(X),事实上同样可以利用这组随机样本来估计期望,估计的方法如下:

EXp0[X]=xXp0(x)x=xXp1(x)p0(x)p1(x)x=EXp1[f(x)p0(x)/p1(x)]=EXp1[f(X)]=1ni=1nf(xi)=1ni=1np0(xi)p1(xi)importance weightxi\begin{align*} \mathbb{E}_{X \sim p_0}[X] &= \sum_{x \in \mathcal{X}} p_0(x) x = \sum_{x \in \mathcal{X}} p_1(x) \frac{p_0(x)}{p_1(x)} x \\ &= \mathbb{E}_{X \sim p_1} \left[ \underbrace{f(x)}_{p_0(x)/p_1(x)} \right] = \mathbb{E}_{X \sim p_1}[f(X)] \\ &= \frac{1}{n} \sum_{i=1}^{n} f(x_i) = \frac{1}{n} \sum_{i=1}^{n} \underbrace{\frac{p_0(x_i)}{p_1(x_i)}}_{\text{importance weight}} x_i \end{align*}

其中 p0(xi)/p1(xi)p_0(x_i)/p_1(x_i) 被称为重要性权重,用以修正两个分布的差异。

这里有个疑问,上述计算过程中需要知道到 p0p_0p1p_1,但如果已知 p0p_0 何必需要如此大费周章地计算期望呢,直接按照期望公式计算不好吗?这里就涉及到采样成本和采样效率的考虑了。

设想,当 p0p_0 表达式很复杂或者 XX 取值非常多时,直接采样可能比较困难,或者需要进行多次采样操作。而使用重要性采样方法,可以选择简单的分布 p1p_1,一方面采样简单,另一方面可以减少所需要的样本数。其次,使用重要性采样方法,可以重复利用同一个分布的随机样本来估计其他分布的期望,计算效率更高,在实践中更容易实现。

# off-policy 策略梯度法

现在的目标是,基于行为策略 β\beta 生成的样本优化下面的目标函数:

J(θ)=sSdβ(s)vπ(s)=ESdβ[vπ(S)]J(\theta) = \sum_{s \in \mathcal{S}} d_{\beta}(s) v_{\pi}(s) = \mathbb{E}_{S \sim d_{\beta}}[v_{\pi}(S)]

对应的梯度如下:

θJ(θ)=ESρ,Aβ[π(AS,θ)β(AS)importance weightθlnπ(AS,θ)qπ(S,A)]\nabla_{\theta} J(\theta) = \mathbb{E}_{S \sim \rho, A \sim \beta} \left[ \underbrace{\frac{\pi(A|S,\theta)}{\beta(A|S)}}_{\text{importance weight}} \nabla_{\theta} \ln \pi(A|S,\theta) q_{\pi}(S,A) \right]

其中 ρ(s)\rho(s) 表示 β\beta 策略下其他所有状态 ss' 的概率乘上策略 π\pi 的状态转移折扣概率之和:

ρ(s)=sSdβ(s)Prπ(ss)Prπ(ss)=k=0γk[Pπk]ss=[(IγPπ)1]ss\rho(s) = \sum_{s' \in \mathcal{S}} d_{\beta}(s') \Pr_{\pi}(s|s') \\ \Pr_{\pi}(s|s') = \sum_{k=0}^{\infty} \gamma^{k} [P_{\pi}^{k}]_{s's} = [(I - \gamma P_{\pi})^{-1}]_{s's}

在 off-policy Actor-Critic 算法中,将上述梯度应用到随机梯度上升法中,同时引入 vπ(s)v_{\pi}(s) 基线减少方差,可以得到:

θt+1=θt+αθπ(atst,θt)β(atst)θlnπ(atst,θt)(qt(st,at)vt(st))\theta_{t+1} = \theta_t + \alpha_{\theta} \frac{\pi(a_t|s_t,\theta_t)}{\beta(a_t|s_t)} \nabla_{\theta} \ln \pi(a_t|s_t,\theta_t) \left( q_t(s_t, a_t) - v_t(s_t) \right)

与 on-policy 算法类似,用 rt+1+γvt(st+1)vt(st)r_{t+1} + \gamma v_t(s_{t+1}) - v_t(s_t) 近似估计 qt(st,at)vt(st)q_t(s_t, a_t) - v_t(s_t),最终算法伪代码如下所示:

off-policy AC 算法伪代码

# Deterministic Actor Critic

到目前为止,策略梯度法中使用的策略都是随机策略,因为表示策略的函数给每个状态 - 动作的概率都设置大于 0(梯度中有 ln\ln 函数)。但是当动作空间连续(比如角度)时,这时就需要用到确定性策略。

所谓确定性策略,即在给定状态下存在一个动作的执行概率为 1,其它为 0。为了与前面的符号有所区别,这里用 a=μ(s,θ)a = \mu(s, \theta) 来表示确定性策略,可以简要记作 μ(s)\mu(s),它表示从状态空间向动作空间的映射,这与之前状态 - 动作概率函数的表示不同。

现在需要知道确定性策略的的优化目标是什么。类似于策略梯度法提到的,这里有两种指标:

  • 平均状态价值:用 d0(s)d_0(s) 表示状态的分布,可以是指定的分布或执行策略的分布,对应的目标函数为:

    J(θ)=E[vμ(s)]=sSd0(s)vμ(s)J(\theta) = \mathbb{E}[v_{\mu}(s)] = \sum_{s \in \mathcal{S}} d_0(s) v_{\mu}(s)

  • 平均一步奖励:用 rμ(s)=E[Rs,a=μ(s)]=rrp(rs,a=μ(s))r_{\mu}(s) = \mathbb{E}[R|s, a = \mu(s)] = \sum_{r} r p(r|s, a = \mu(s)) 表示策略 μ\mu 在状态 ss 下的直接奖励期望,对应的目标函数为:

    J(θ)=rˉμ=sSdμ(s)rμ(s)=ESdμ[rμ(S)]\begin{align*} J(\theta) = \bar{r}_{\mu} &= \sum_{s \in \mathcal{S}} d_{\mu}(s) r_{\mu}(s) \\ &= \mathbb{E}_{S \sim d_{\mu}} [r_{\mu}(S)] \end{align*}

上述两种指标的梯度均具有与下面相似的形式,证明过程略去:

θJ(θ)=sSη(s)θμ(s)(aqμ(s,a))a=μ(s)=ESη[θμ(S)(aqμ(S,a))a=μ(S)]\begin{align*} \nabla_{\theta} J(\theta) &= \sum_{s \in \mathcal{S}} \eta(s) \nabla_{\theta} \mu(s) \left( \nabla_a q_{\mu}(s,a) \right)|_{a=\mu(s)} \\ &= \mathbb{E}_{S \sim \eta} \left[ \nabla_{\theta} \mu(S) \left( \nabla_a q_{\mu}(S,a) \right)|_{a=\mu(S)} \right] \end{align*}

其中,平均状态价值的 η(s)\eta(s)sSd0(s)Prμ(ss)\sum_{s' \in \mathcal{S}} d_0(s') \Pr_{\mu}(s|s') 与上一小节的 off-policy 策略梯度法类似;平均一步奖励的 η(s)\eta(s) 是策略 μ\mu 对应的状态平稳分布。

综上,应用随机梯度上升法优化目标函数,对应公式是:

θt+1=θt+αθESη[θμ(S)(aqμ(S,a))a=μ(S)]θt+αθθμ(st)(aqμ(st,a))a=μ(st)\begin{align*} \theta_{t+1} &= \theta_t + \alpha_{\theta} \mathbb{E}_{S \sim \eta} \left[ \nabla_{\theta} \mu(S) \left( \nabla_a q_{\mu}(S,a) \right)|_{a=\mu(S)} \right] \\ & \approx \theta_t + \alpha_{\theta} \nabla_{\theta} \mu(s_t) \left( \nabla_a q_{\mu}(s_t, a) \right)|_{a=\mu(s_t)} \end{align*}

该算法是 off-policy,因为没有涉及到 AA 的采样,而是直接由策略 μ\mu 计算得到(确定性策略),这就是为什么上述指标中使用的 d0(s)d_0(s) 不强调是策略相关的。

对于上述梯度中的 qμ(st,a)q_{\mu}(s_t, a),同样使用 q(s,a,w)q(s,a,w) 值函数进行估计。

最后 DPG 的伪代码总结如下:

DPG 算法伪代码


# 参考资料

【强化学习的数学原理】课程:从零开始到透彻理解 哔哩哔哩