强化学习(4):时序差分方法——一步更新与自举思想

从蒙特卡洛到时序差分
上一篇已经讨论过,蒙特卡洛方法(Monte Carlo Method)给出了一个非常自然的思路:既然状态价值函数 $V_\pi(s)$ 和动作价值函数 $Q_\pi(s,a)$ 本质上都是回报(Return) $G_t$ 的条件期望,那么在环境模型未知时,就可以通过反复采样得到实际回报,再用样本均值去估计这些价值。这个思路的重要意义在于,它摆脱了动态规划(Dynamic Programming)对环境模型的依赖,使价值估计第一次真正建立在与环境的交互经验之上。
但蒙特卡洛方法虽然不再要求已知模型,却仍然有一个很明显的限制:它必须等到一整段回合结束之后,才能得到某个时刻对应的完整回报 $G_t$,进而完成一次价值更新。
这一点并不是实现上的小问题,而是由回报本身的定义决定的。对任意时刻 $t$ 来说,
$$ G_t = r_t + \gamma r_{t+1} + \gamma^2 r_{t+2} + \cdots $$它依赖的是从当前开始直到后续结束的一整段奖励序列。因此,只要后面的奖励还没有发生,$G_t$ 就还不能被完整计算出来。也就是说,在经典蒙特卡洛方法中,价值更新天然带有一种“事后进行”的特点:要先把一段经验完整走完,才能回过头来估计其中各个状态或状态—动作对的价值。
这会带来两个直接后果。
第一,更新不够及时。如果一个回合很长,那么即使智能体在一开始就已经经历了某个重要状态,它也必须等到整个回合结束后,才能利用这次经验更新该状态的价值估计。这意味着信息的利用存在明显延迟。
第二,样本波动通常较大。因为蒙特卡洛方法直接使用完整回报作为估计目标,而完整回报会累积后续整段轨迹中的随机性,所以不同回合之间,即使从同一个状态出发,最终得到的 $G_t$ 也可能差异很大。这会使基于样本均值的估计具有较高方差(Variance)。
到了这里,一个很自然的问题就出现了:
既然完整回报必须等到回合结束后才能得到,那么能不能不用等待完整回报,而是在每走一步之后,就立刻根据当前获得的信息对价值做出更新?
如果这个想法能够成立,那么价值学习就会从“基于完整后果的回顾式更新”,转向“基于局部信息的在线更新”。这正是时序差分(Temporal Difference, TD)方法出现的背景。
从逻辑上看,时序差分方法并不是对蒙特卡洛方法的否定,而是在它的基础上进一步向前推进。蒙特卡洛方法已经告诉我们:在模型未知时,可以用采样经验去估计价值。时序差分方法则继续追问:在同样不依赖环境模型的前提下,是否可以更早地利用经验,而不是等到回合结束之后才开始学习?
这一转变的关键,在于不再坚持把更新目标完全建立在实际完整回报 $G_t$ 上,而是尝试用“当前一步已经观察到的奖励”加上“对后续价值的当前估计”来替代完整回报。也就是说,未来那一部分虽然还没有真正全部发生,但可以先用现有的价值估计去近似它。
这就引出了时序差分方法最核心的思想:自举(Bootstrap)。所谓自举,就是在更新一个价值估计时,允许使用另一个当前已有的价值估计作为目标的一部分,而不必等到最终真实回报完全展开之后再更新。
因此,如果说蒙特卡洛方法的核心特征是“使用实际完整回报”,那么时序差分方法的核心特征就是“使用一步样本奖励与后续价值估计进行更新”。前者依赖完整轨迹,后者则允许在交互过程中边采样、边学习。
这也是为什么在蒙特卡洛方法之后,最自然的话题就是时序差分方法。因为到这里为止,问题已经不再是“能否在模型未知时学习价值”,而是进一步变成了:
在模型未知时,怎样更及时、更连续地进行价值更新。
增量更新与随机近似
在进入时序差分(Temporal Difference, TD)方法之前,还需要先补上一块方法上的基础:为什么强化学习中的很多更新公式,都会写成一种看起来非常相似的形式,即
$$ \text{新估计}=\text{旧估计}+\text{步长}\times\text{某种误差} $$这种形式并不是时序差分方法特有的写法,而是许多基于样本的估计方法共有的结构。理解这一点,有助于后面更自然地接受 TD(0)、Sarsa 以及 Q-learning 的更新方式。
先从最简单的情形开始。假设我们想估计某个随机变量 $X$ 的期望 $\mathbb{E}[X]$。如果已经观察到 $n$ 个样本
$$ x_1,x_2,\dots,x_n $$那么最直接的估计就是样本均值:
$$ \bar{x}_n=\frac{1}{n}\sum_{i=1}^n x_i $$这是最常见的期望估计方法。但如果把它写成递推形式,就会发现它可以改写为
$$ \bar{x}_{n+1}=\bar{x}_n+\frac{1}{n+1}(x_{n+1}-\bar{x}_n) $$这个式子很重要。它说明:新的估计值,等于旧的估计值,加上一个“新样本与旧估计之间偏差”的修正项。这里的
$$ x_{n+1}-\bar{x}_n $$可以理解为当前样本相对于已有估计所提供的误差信息,而前面的系数
$$ \frac{1}{n+1} $$则决定了这次修正的幅度。
这样一来,样本均值就不再只是一个“把所有样本重新求和再平均”的静态公式,而变成了一个可以逐步更新的**增量式(Incremental)**估计过程。每来一个新样本,就只需要在旧估计的基础上做一次修正,而不必保存全部历史数据并重新计算平均值。
这个形式再往前走一步,就会得到更一般的写法:
$$ V \leftarrow V + \alpha ( \text{目标} - V ) $$这里的 $\alpha$ 是步长(Step Size)或学习率(Learning Rate),$V$ 表示当前估计,而括号中的“目标减去当前估计”则表示当前误差。和前面的样本均值更新相比,区别只是把原本固定为 $\frac{1}{n+1}$ 的系数,推广成了一个可以自行设定的步长参数 $\alpha$。
为什么要这样推广?原因在于强化学习中的数据往往不是一个静态数据集,而是随着交互不断到来的经验序列。此时,使用固定的递减系数虽然在某些情况下有助于收敛,但并不总是最合适。引入显式步长 $\alpha$ 之后,更新规则会更灵活:
- 当 $\alpha$ 较大时,新样本对估计的影响更强,更新更快;
- 当 $\alpha$ 较小时,估计变化更平缓,稳定性通常更好。
因此,很多强化学习算法都会采用这种统一的更新思路:先构造一个基于当前样本的目标,再用当前估计朝这个目标移动一小步。
从这个角度看,所谓基于样本的学习,本质上就是不断重复下面两件事:
第一,根据当前交互经验构造一个目标值;
第二,用这个目标值去修正现有估计。
这类方法常常可以放在**随机近似(Stochastic Approximation)**这一更一般的框架下理解。这里不必展开其完整理论,只需要抓住最核心的一点:当真实期望无法直接计算时,可以不断利用随机样本给出带噪声的局部修正,并通过持续迭代让估计逐步逼近目标值。
把这个思路放回强化学习,会得到非常自然的对应关系。
如果要估计状态价值函数 $V_\pi(s)$,那么我们手头通常并不知道它的真实值,只能根据交互经验不断修正当前估计。于是就会得到类似下面的更新形式:
$$ V_\pi(s) \leftarrow V_\pi(s) + \alpha \big(\text{某个基于经验的目标} - V_\pi(s)\big) $$这里真正关键的问题,就不再是“为什么要用增量更新”,而变成了:
这个基于经验的目标到底该取什么?
在蒙特卡洛方法中,这个目标是完整回报 $G_t$,因此更新可以写成
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\big(G_t - V_\pi(s_t)\big) $$而时序差分方法与它的本质区别,就体现在这里:它不再把完整回报 $G_t$ 作为目标,而是用“当前一步奖励 + 下一状态的估计价值”来代替。
也就是说,增量更新这一层框架,蒙特卡洛方法和时序差分方法其实是共享的;真正变化的是目标的构造方式。
因此,到目前为止,逻辑已经推进到下面这一步:
- 蒙特卡洛方法告诉我们,可以用样本回报去更新价值;
- 增量更新告诉我们,这种学习通常可以写成“旧估计 + 步长 × 误差”的形式;
- 接下来就该进一步回答:如果不再等待完整回报,而是只利用一步经验,那么这个误差应该怎样定义,更新公式又会变成什么样。
这正是下一节要进入的内容,也就是最基本的时序差分方法:TD(0)。
TD(0):一步时序差分更新
有了前一节的增量更新框架,现在就可以正式进入最基本的时序差分方法。
我们先考虑最简单的任务:给定一个策略 $\pi$,估计它对应的状态价值函数 $V_\pi(s)$。 这仍然是一个策略评估(Policy Evaluation)问题,只是这一次我们不再使用动态规划中的模型期望更新,也不再像蒙特卡洛方法那样等待完整回合结束后再利用 $G_t$,而是希望在每一步交互之后就立刻更新当前状态的价值估计。
设在时刻 $t$,智能体处于状态 $s_t$,按照策略 $\pi$ 采取动作后,环境返回奖励 $r_t$,并转移到下一状态 $s_{t+1}$。如果按照蒙特卡洛方法的思路,当前状态 $s_t$ 的更新目标应当是完整回报
$$ G_t=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots $$但这个量要等到后续奖励逐步出现之后才能完整知道,因此不能立即用于在线更新。
时序差分方法的想法是:既然完整回报暂时还不知道,那么就先用已经观察到的一步奖励 $r_t$,再加上对后续部分的当前估计来近似它。于是,可以把 $G_t$ 近似为
$$ r_t+\gamma V_\pi(s_{t+1}) $$这里的含义很直接:
- $r_t$ 是当前这一步已经真实观察到的奖励;
- $\gamma V_\pi(s_{t+1})$ 则用来近似从下一状态开始的未来长期收益。
这样一来,对状态 $s_t$ 的更新就不必等待整条轨迹结束,而可以在观察到一步转移之后立刻进行。对应的更新公式写成
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\Big[r_t+\gamma V_\pi(s_{t+1})-V_\pi(s_t)\Big] $$这就是最基本的 TD(0) 更新公式。
这里的“0”表示它使用的是**一步(one-step)**目标,并且没有继续向后展开更多步。也就是说,它只看当前一步奖励,再加上下一状态的现有价值估计,而不是像多步方法那样继续累加后续多个奖励。
这里需要特别说明一下,为什么在时刻 $t$ 的更新中,会出现下一状态 $s_{t+1}$ 的价值 $V_\pi(s_{t+1})$。
如果当前时刻处于状态 $s_t$,那么在做出动作并与环境交互之前,智能体当然并不知道下一状态究竟是什么,因此也不可能提前知道对应的 $V_\pi(s_{t+1})$。TD(0) 的更新并不是在“还没发生转移之前”进行的,而是在这一步交互完成之后进行的。也就是说,智能体先经历一次实际转移:
$$ > s_t \rightarrow s_{t+1} > $$并观察到奖励 $r_t$,此时下一状态 $s_{t+1}$ 已经是一个实际得到的结果,而不再是未知量。既然 $s_{t+1}$ 已经被观察到,那么就可以直接查当前维护的价值表,或者读取当前价值函数估计器,得到它此刻对应的估计值 $V_\pi(s_{t+1})$。
因此,TD(0) 中出现的 $V_\pi(s_{t+1})$,并不是下一状态的真实价值,而是在当前时刻已经拥有的、对下一状态价值的估计。时序差分方法正是利用这个已有估计,去近似“从下一时刻开始的未来长期回报”。这也是它被称为自举(Bootstrap)方法的原因:它在更新当前状态时,借用了对后继状态价值的现有估计,而不是等待真实完整回报全部展开之后再更新。
为了使这个式子更清楚,通常把括号中的量单独记为时序差分误差(Temporal Difference Error):
$$ \delta_t=r_t+\gamma V_\pi(s_{t+1})-V_\pi(s_t) $$于是 TD(0) 的更新式就可以简化为
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha \delta_t $$这个记号非常重要,后面在 Sarsa、Q-learning 以及更一般的演员—评论家(Actor-Critic)方法中都会反复出现。
从形式上看,$\delta_t$ 表示的是:
当前一步观察到的目标值,与当前价值估计之间的差。
如果 $\delta_t>0$,说明这一步实际观察到的结果比原先对 $s_t$ 的估计更好,那么 $V_\pi(s_t)$ 就应该上调;如果 $\delta_t<0$,说明原先的估计偏高,那么就应该下调。
因此,TD(0) 的学习过程可以理解为:智能体每经历一步状态转移,就立刻利用这一小段新信息,对当前状态的价值估计做一次局部修正。随着经验不断积累,价值信息会逐步在状态之间传播开来。
这里可以顺便和前面的蒙特卡洛方法做一个直接对比。
对于状态价值估计,蒙特卡洛更新写作
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\big(G_t-V_\pi(s_t)\big) $$而 TD(0) 更新写作
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\Big[r_t+\gamma V_\pi(s_{t+1})-V_\pi(s_t)\Big] $$二者的区别不在增量更新框架本身,而在目标的构造方式:
- 蒙特卡洛方法使用实际完整回报 $G_t$;
- TD(0) 使用一步奖励加后续价值估计 $r_t+\gamma V_\pi(s_{t+1})$。
也正因为如此,TD(0) 同时具有两个鲜明特征。
第一,它是**无模型(Model-free)**的。
更新时不需要知道状态转移概率 $P(s' \mid s,a)$,也不需要知道奖励函数的显式表达,只需要观察到实际的一步转移样本 $(s_t,r_t,s_{t+1})$ 即可。
第二,它是**自举(Bootstrap)**的。
更新当前状态价值时,直接使用了下一状态当前的价值估计 $V_\pi(s_{t+1})$,而不是等待真实完整回报全部展开。
这两个特征合在一起,使 TD(0) 成为强化学习中非常关键的一类方法:它既摆脱了动态规划对环境模型的依赖,又克服了蒙特卡洛必须等回合结束才能更新的问题。
不过,这种做法也意味着一个新的代价。因为 TD(0) 使用的是“估计值去更新估计值”,所以目标本身并不是真实完整回报,而是带有近似性质的。这意味着它通常会引入一定偏差(Bias),但与此同时,它也往往比蒙特卡洛方法具有更低的方差(Variance),并且能够更及时地更新。这也是后面分析 TD 方法时一个非常重要的角度。
TD(0) 与蒙特卡洛的区别
到这里,TD(0) 的基本更新形式已经明确了。接下来还需要进一步说明一个问题:既然蒙特卡洛方法(Monte Carlo Method)和时序差分方法都可以在未知环境模型的前提下估计价值函数,那么它们之间的根本区别到底是什么。
表面上看,两者都在做同一件事:给定策略 $\pi$,通过与环境交互得到经验,再逐步估计状态价值函数 $V_\pi(s)$。但如果从更新目标的角度来看,它们实际上对应两种不同的价值学习方式。
对于蒙特卡洛方法,状态 $s_t$ 的更新依赖的是实际完整回报:
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\big(G_t-V_\pi(s_t)\big) $$其中
$$ G_t=r_t+\gamma r_{t+1}+\gamma^2 r_{t+2}+\cdots $$因此,蒙特卡洛方法使用的是真实后果已经全部展开之后的结果。只要从时刻 $t$ 开始直到回合结束的奖励序列已经全部观察到,就可以直接计算 $G_t$,并把它作为更新目标。
而在 TD(0) 中,对应的更新写成
$$ V_\pi(s_t)\leftarrow V_\pi(s_t)+\alpha\Big[r_t+\gamma V_\pi(s_{t+1})-V_\pi(s_t)\Big] $$它并不等待完整回报,而是在观察到一步转移后,就用
$$ r_t+\gamma V_\pi(s_{t+1}) $$作为目标来更新当前状态价值。因此,TD(0) 使用的不是“最终真实结果”,而是“当前一步奖励加上对未来的现有估计”。
如果把两者并列起来看,它们最核心的区别可以概括为下面一点:
- 蒙特卡洛方法使用实际完整回报作为目标;
- TD(0) 使用一步样本奖励与后继状态价值估计作为目标。
这个差别直接带来了一系列性质上的不同。
首先,蒙特卡洛方法必须等到一个回合结束后才能更新,因为在回合结束之前,$G_t$ 还没有完整确定。而 TD(0) 则可以在每一步转移发生后立刻更新,因此它更适合在线(Online)学习场景。只要观察到
$$ (s_t,r_t,s_{t+1}) $$这一步经验,就已经足以完成一次价值修正。
💡这里的在线(Online)与离线(Offline),是指学习更新发生在数据到达的什么阶段。在线学习表示样本一到就立刻更新;离线学习则更强调先收集一批经验,再利用这些已经固定的数据进行训练。TD(0) 只依赖一步转移样本,因此天然支持在线更新;而蒙特卡洛方法通常要等完整回合结束后才能计算回报,所以更接近先收集、后更新的方式。
其次,蒙特卡洛方法的更新目标是实际回报,所以从目标本身来看,它不依赖当前价值函数的估计值。这意味着它不会因为“估计值本身不准”而直接把误差继续传递到目标里。但与此同时,完整回报中包含了后续整段轨迹的随机性,因此不同样本之间的波动通常较大,方差往往更高。
相比之下,TD(0) 的目标中包含了 $V_\pi(s_{t+1})$,也就是说,它在更新当前状态时借用了对下一状态价值的已有估计。因此,TD(0) 的目标通常比完整回报更稳定,方差往往更低;但由于这个目标本身不是最终真实回报,而是一个近似值,所以它又会引入一定偏差。
因此,从统计性质上看,两者形成了一个很典型的对比:
- 蒙特卡洛方法通常偏差较小、方差较大;
- TD(0) 通常偏差较大、方差较小。
这里的“偏差较大”并不是说 TD 方法就一定更差,而是说它在更新目标里引入了估计近似;而“方差较小”则意味着它往往能更稳定、更及时地从局部经验中学习。强化学习中很多方法设计,实际上都可以看成是在偏差(Bias)与方差(Variance)之间做权衡,TD 方法正是其中非常典型的一类。
还有一点也很重要。蒙特卡洛方法天然依赖完整回合,因此更适合分幕式(Episodic)任务;而 TD(0) 由于只依赖一步转移样本,因此不仅适用于分幕式任务,也更容易推广到持续性(Continuing)任务。因为在持续性任务中,交互过程可能没有明确终点,此时“等待完整回报”本身就不容易定义,而“一步更新”则依然可以正常进行。
到这里,可以把 TD(0) 的意义更清楚地概括出来:
它并不是简单地把蒙特卡洛方法换了一个公式,而是在价值估计方式上做了一个关键转变:不再依赖完整后果,而是允许用局部观察与当前估计共同构造更新目标。
也正因为这个转变,TD 方法才真正打开了后面一整类强化学习算法的大门。因为一旦“一步更新 + 自举”这个思想成立,就不只可以用来估计状态价值函数 $V_\pi(s)$,还可以进一步推广到动作价值函数 $Q_\pi(s,a)$,并在此基础上进入控制问题。
Sarsa:基于动作价值的同策略控制
前面讨论的 TD(0),解决的是一个策略评估(Policy Evaluation)问题:在给定策略 $\pi$ 的前提下,如何在线估计状态价值函数 $V_\pi(s)$。但强化学习更核心的目标并不只是“评估一个已经给定的策略”,而是进一步通过学习得到更优策略。要做到这一点,仅仅估计状态价值往往还不够,因为控制问题真正关心的是:在某个状态下,应该选择哪个动作。
这就自然引出了动作价值函数
$$ Q_\pi(s,a) $$它表示:在状态 $s$ 下先执行动作 $a$,之后继续按照策略 $\pi$ 行动时,未来回报 $G_t$ 的期望。与状态价值函数相比,动作价值函数更适合直接服务于控制,因为它能够在同一状态下比较不同动作的长期效果。
如果沿着前面 TD(0) 的思路继续往前走,一个很自然的问题就是:
既然状态价值可以通过一步时序差分方式在线更新,那么动作价值能不能也用类似方式更新?
答案是可以的,而最经典的第一个算法就是 Sarsa。
先看它依赖的一步交互结构。
在时刻 $t$,智能体处于状态 $s_t$,按当前策略选择动作 $a_t$,环境返回奖励 $r_t$,并转移到下一状态 $s_{t+1}$。然后,智能体又按照同一个策略,在下一状态 $s_{t+1}$ 下选择下一个动作 $a_{t+1}$。
于是,一次用于更新的经验片段可以写成
$$ (s_t,a_t,r_t,s_{t+1},a_{t+1}) $$Sarsa 这个名称正是由这五个量的首字母组成的:
- State
- Action
- Reward
- next State
- next Action
它的命名本身就反映了算法最核心的更新结构。
现在来看更新目标应该怎样构造。
如果直接按照动作价值函数的定义,
$$ Q_\pi(s_t,a_t)=\mathbb{E}_\pi[G_t\mid S_t=s_t,A_t=a_t] $$那么最理想的更新目标仍然是完整回报 $G_t$。但和前面一样,这会要求等到后续轨迹充分展开之后才能计算。为了实现在线学习,Sarsa 采用与 TD(0) 相同的基本思想:不等待完整回报,而是用“一步奖励 + 下一状态—动作对的当前估计价值”来近似它。
于是,对 $(s_t,a_t)$ 的一步目标可以写成
$$ r_t+\gamma Q_\pi(s_{t+1},a_{t+1}) $$对应的更新公式就是
$$ Q_\pi(s_t,a_t)\leftarrow Q_\pi(s_t,a_t)+\alpha\Big[r_t+\gamma Q_\pi(s_{t+1},a_{t+1})-Q_\pi(s_t,a_t)\Big] $$这就是 Sarsa 的基本更新形式。
如果像前面定义 TD(0) 的时序差分误差一样,这里也把括号中的量记作 $\delta_t$,那么可以写成
$$ \delta_t=r_t+\gamma Q_\pi(s_{t+1},a_{t+1})-Q_\pi(s_t,a_t) $$于是更新式可简化为
$$ Q_\pi(s_t,a_t)\leftarrow Q_\pi(s_t,a_t)+\alpha \delta_t $$从形式上看,Sarsa 与 TD(0) 非常相似:
- TD(0) 更新的是状态价值 $V_\pi(s_t)$;
- Sarsa 更新的是动作价值 $Q_\pi(s_t,a_t)$。
两者共同的核心仍然是一步时序差分更新,也都具有两个关键特征:
第一,它们都是**无模型(Model-free)**的。
更新时不需要知道状态转移概率和奖励函数的显式表达,只需要从实际交互中获得一步样本即可。
第二,它们都是**自举(Bootstrap)**的。
更新当前估计时,都使用了后继状态或后继状态—动作对的当前估计值,而不是等待完整真实回报。
但 Sarsa 相比 TD(0) 多了一层意义:它不再只是评估状态,而是开始直接学习“在状态下执行动作”的长期价值。因此,一旦 $Q_\pi(s,a)$ 被学出来,就可以据此改进策略。
最直接的方式是:在每个状态下,更倾向于选择当前 $Q$ 值较大的动作。例如,可以采用 $\epsilon$-贪婪($\epsilon$-greedy)策略:以较大概率选择当前估计价值最高的动作,以较小概率随机探索其他动作。这样一来,策略一边产生数据,动作价值一边被更新,而策略本身也会随着 $Q$ 值估计不断调整。
从这个角度看,Sarsa 已经不再是单纯的预测算法,而是一个真正进入控制问题的时序差分方法。
这里还需要强调 Sarsa 的一个关键性质:它学习的是当前实际执行策略对应的动作价值。
因为更新目标中的
使用的是“下一状态下按照当前策略实际选出来的动作 $a_{t+1}$”,所以它评估和更新的始终是这个行为策略本身。也就是说,它在什么策略下采样,就在什么策略下更新。
这类方法被称为**同策略(On-policy)**方法。
这一点很重要。它意味着 Sarsa 学到的,不是“理论上总选最优动作时的价值”,而是“当前这个实际执行策略自身的价值”。如果当前策略中仍然包含探索,例如使用 $\epsilon$-贪婪策略,那么 Sarsa 学到的就是这个带探索行为的策略对应的动作价值函数,而不是纯贪心策略的动作价值函数。
因此,Sarsa 的学习目标和行为方式是一致的:
它既按照某个策略与环境交互,又用这些交互样本去评估并改进这个同一个策略。
到这里,Sarsa 的逻辑已经比较清楚了:
- 从 TD(0) 的状态价值更新,推广到动作价值更新;
- 用一步奖励加后继动作价值估计,替代完整回报;
- 在学习动作价值的同时,用当前策略继续采样;
- 因而得到一个同策略控制算法。
接下来最自然的问题就是:
如果我们不想学习“当前实际执行策略”的价值,而是希望直接朝最优动作价值 $Q_\*(s,a)$ 逼近,那么更新目标应当怎样修改?
这就会引出下一个更经典的算法:Q-learning。
Q-learning:朝最优动作价值逼近
Sarsa 已经把时序差分(Temporal Difference, TD)思想推广到了控制问题。它通过更新动作价值函数
$$ Q_\pi(s,a) $$并配合诸如 $\epsilon$-贪婪($\epsilon$-greedy)这样的策略改进方式,能够在与环境交互的过程中逐步提升策略表现。
但前一节已经指出,Sarsa 学习的是当前实际执行策略对应的动作价值。也就是说,如果行为策略中仍然包含探索,那么它更新的目标里也会把这种探索行为考虑进去。因此,Sarsa 所逼近的是某个具体行为策略的价值,而不是直接朝最优动作价值函数
$$ Q_*(s,a) $$推进。
这就会引出一个更进一步的问题:
能不能在保持交互中探索行为的同时,更新时直接朝最优动作价值逼近?
这正是 Q-learning 的基本思想。
先从动作价值的最优性关系出发。
对于最优动作价值函数 $Q_*(s,a)$,它满足下面的贝尔曼最优关系:
这个式子的含义是:如果当前在状态 $s$ 下执行动作 $a$,那么它的最优长期价值,等于当前奖励加上下一状态中“最优动作”的折扣价值期望。
和前面 Sarsa 的一步目标相比,这里最关键的变化在于:
在下一状态 $s_{t+1}$ 处,不再使用“当前策略实际选出的动作 $a_{t+1}$”,而是直接选择当前估计中价值最大的动作。也就是说,把
替换成
$$ \max_{a'}Q(s_{t+1},a') $$于是,Q-learning 的一步更新目标写成
$$ r_t+\gamma \max_{a'}Q(s_{t+1},a') $$对应的更新公式为
$$ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha\Big[r_t+\gamma \max_{a'}Q(s_{t+1},a')-Q(s_t,a_t)\Big] $$如果同样把括号中的量记作时序差分误差 $\delta_t$,那么可以写成
$$ \delta_t=r_t+\gamma \max_{a'}Q(s_{t+1},a')-Q(s_t,a_t) $$于是更新式仍然具有统一的增量形式:
$$ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha \delta_t $$从形式上看,Q-learning 与 Sarsa 非常接近,两者都更新动作价值,也都属于无模型、自举的一步 TD 方法。真正的区别只在更新目标:
Sarsa 使用
$$ r_t+\gamma Q(s_{t+1},a_{t+1}) $$其中 $a_{t+1}$ 是按当前策略实际选出的动作;
Q-learning 使用
$$ r_t+\gamma \max_{a'}Q(s_{t+1},a') $$直接采用下一状态下当前估计的最大动作价值。
这一处差别,决定了两者在学习目标上的根本不同。
对于 Sarsa,更新目标反映的是“如果之后仍然按当前策略继续行动,会得到怎样的长期回报”。因此它评估的是当前行为策略本身。
而对于 Q-learning,更新目标反映的是“如果下一步开始总是选择当前估计里最好的动作,会得到怎样的长期回报”。因此它不再是在评估当前行为策略,而是在尝试直接逼近最优动作价值函数 $Q_*(s,a)$)。
也正因为如此,Q-learning 被称为一种**离策略(Off-policy)**方法。
这里的“离策略”,意思是:
- 用来与环境实际交互、产生样本的,是一个行为策略(Behavior Policy);
- 用来定义更新目标、希望最终逼近的,则是另一个目标策略(Target Policy)。
在最常见的情况下,行为策略仍然可以使用 $\epsilon$-贪婪方式进行探索,以保证状态—动作空间得到足够访问;但在更新时,并不使用这个带探索的实际行为,而是直接假设下一步采取贪心动作。因此,行为策略可以保持探索,目标策略则朝贪心最优方向推进。
这正是 Q-learning 最吸引人的地方:它允许“行为上继续探索,更新上直接追求最优”。
这里可以更具体地理解一下它和 Sarsa 的差别。
假设当前在状态 $s_t$ 下执行动作 $a_t$ 后,到达下一状态 $s_{t+1}$。此时下一状态下有多个可选动作,当前估计中它们的 $Q$ 值并不相同。
如果使用 Sarsa,那么更新目标要取决于“下一步真实选了哪个动作”。如果行为策略还带有探索,那么即使当前有一个动作价值最高,算法也可能因为探索而选到另一个较差动作;而这个较差动作的价值也会进入更新目标。因此,Sarsa 反映的是“带探索行为的真实后续表现”。
如果使用 Q-learning,那么不管下一步行为策略实际选了什么动作,更新时都只看
$$ \max_{a'}Q(s_{t+1},a') $$也就是说,它始终假设下一步会选择当前估计中最优的动作。于是,它学习到的是“朝最优动作方向前进时的价值”。
因此,可以把两者的区别概括得更直接一些:
- Sarsa 更关心“当前策略实际上会怎样表现”;
- Q-learning 更关心“如果总按最优动作走,价值应该是多少”。
这也导致两者在某些任务中的表现风格不同。
如果环境中存在风险较高的区域,那么 Sarsa 因为把探索行为本身也纳入价值更新,往往会学到一个相对更保守的策略。因为它考虑的是“带探索时真实可能发生的后果”。 而 Q-learning 由于更新时始终朝着最大动作价值推进,通常会更激进一些,更倾向于直接逼近理论上的最优路径。
当然,这里说的“更保守”与“更激进”只是帮助理解行为差异的结果,不是算法定义本身。真正本质的差别仍然只有一点:是否用实际选出的下一动作参与更新。
到这里,时序差分控制方法的两条最基本路线就已经出现了:
- 一条是 Sarsa,它是同策略方法,学习当前行为策略的动作价值;
- 一条是 Q-learning,它是离策略方法,直接朝最优动作价值逼近。
从结构上看,它们都建立在前面已经讲清楚的统一框架之上:
- 使用增量式更新;
- 构造一步时序差分目标;
- 用时序差分误差 $\delta_t$ 修正当前估计;
- 通过不断交互,让价值函数逐步收敛。
因此,Sarsa 和 Q-learning 并不是彼此孤立的两个公式,而是时序差分思想在控制问题上的两种典型展开。
这里还需要特别说明一个容易产生疑问的地方。Q-learning 的更新目标中使用了
$$ \max_{a'}Q(s_{t+1},a') $$也就是说,在下一状态 $s_{t+1}$ 下,更新时总是取当前估计中价值最大的动作。于是一个自然的问题就是:如果更新时始终使用最大 $Q$ 值,那么实际交互中的探索还有什么意义?
关键在于,Q-learning 每一步真正被更新的,并不是“下一状态中最大值对应的所有动作”,而是当前这一次实际执行过的状态—动作对 $(s_t,a_t)$。也就是说,在一次样本
$$ (s_t,a_t,r_t,s_{t+1}) $$到来之后,被修正的是
$$ Q(s_t,a_t) $$而右侧的
$$ \max_{a'}Q(s_{t+1},a') $$只是作为更新目标的一部分,用来近似“从下一状态开始如果采取最优动作时的未来收益”。
因此,探索的意义首先在于:它让原本不一定会被选到的动作,也有机会被实际执行,从而使这些动作对应的 $Q$ 值得到更新。 如果完全不探索,那么某些当前看起来不优的动作可能长期得不到尝试,它们的 $Q$ 值也就无法被修正,算法就可能停留在一个基于早期不充分经验形成的局部判断上。只有通过探索,不同动作的长期效果才有机会被逐步暴露出来。
进一步说,探索虽然不直接改变“取最大值”这一更新规则,却会间接影响这个最大值本身。因为
$$ \max_{a'}Q(s_{t+1},a') $$所比较的各个动作价值,都是通过历史采样一步步学出来的。探索会让更多状态—动作对被访问,从而使这些 $Q$ 值估计不断被修正;而随着各个动作价值估计逐渐变得更准确,更新目标中的这个“最大值”也才更可能真正接近最优动作价值,而不是仅仅反映当前有限经验下的暂时判断。
所以,Q-learning 可以概括为一句话:用带探索的行为收集数据,用贪心的目标更新价值。 探索的作用,不是改变更新目标中的最大化形式,而是保证参与这个最大化比较的各个 $Q$ 值,能够通过足够多的实际经验逐步变得可靠。
On-policy 与 Off-policy
到这里,Sarsa 和 Q-learning 的更新公式都已经给出,但如果只停留在公式层面,二者之间最关键的差别仍然不够清楚。前面虽然已经分别提到过同策略(On-policy)与离策略(Off-policy),但这里还需要单独收束一下,因为这组概念在后续强化学习中会反复出现。
先从最基本的问题出发。一个强化学习算法在训练时,通常同时涉及两件事:
第一,智能体要按照某种策略与环境交互,从而产生经验样本;
第二,智能体要根据这些样本去更新价值函数或策略本身。
于是,一个自然的问题就是:“用来采样的策略”和“用来更新目标的策略”是否是同一个?
如果是同一个,那么这类方法就称为**同策略(On-policy)方法。
如果不是同一个,那么这类方法就称为离策略(Off-policy)**方法。
这个定义本身并不复杂,但容易在具体算法里混淆,所以最好直接结合 Sarsa 和 Q-learning 来看。
对于 Sarsa,更新式为
$$ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha\Big[r_t+\gamma Q(s_{t+1},a_{t+1})-Q(s_t,a_t)\Big] $$这里的关键是:更新目标中的 $a_{t+1}$,正是智能体在下一状态 $s_{t+1}$ 下按照当前实际行为策略选出来的动作。也就是说:
- 智能体怎么行动;
- 更新时就按这种行动方式去评估未来。
如果行为策略是 $\epsilon$-贪婪的,那么 Sarsa 在更新时也把这个 $\epsilon$-贪婪策略未来可能带来的后果算进去。因此,采样所用策略与更新所对应的策略是同一个,所以 Sarsa 是同策略方法。
对于 Q-learning,更新式为
$$ Q(s_t,a_t)\leftarrow Q(s_t,a_t)+\alpha\Big[r_t+\gamma \max_{a'}Q(s_{t+1},a')-Q(s_t,a_t)\Big] $$这里的关键变化在于:更新目标并不关心下一步实际选了哪个动作,而是直接取
$$ \max_{a'}Q(s_{t+1},a') $$这意味着:
- 交互时,智能体仍然可以按照一个带探索的行为策略行动,例如 $\epsilon$-贪婪;
- 但更新时,算法假设下一步会选择当前估计里价值最大的动作。
也就是说,采样所用策略和更新所追求的目标策略已经分开了。前者是行为策略(Behavior Policy),后者则更接近贪心目标策略(Target Policy)。因此,Q-learning 是离策略方法。
如果把这层关系总结成更直接的形式,可以写成:
- On-policy:用某个策略采样,也学习这个策略本身;
- Off-policy:用一个策略采样,但学习的是另一个策略。
这组概念之所以重要,不只是为了给算法分类,而是因为它直接影响算法的学习特点。
对于同策略方法,学习目标和行为过程是一致的,因此通常更容易直接反映“当前实际策略的真实表现”。如果当前策略本身带有探索,那么这种探索行为的风险和收益也会被一并纳入学习。Sarsa 就属于这种情况。
对于离策略方法,算法则允许“行为上保持探索,目标上朝更优策略推进”。这样做的好处是更灵活,因为可以一边通过探索收集更丰富的数据,一边不必把探索行为本身完全纳入目标定义。Q-learning 就是这一思路的典型代表。
小结
本文从蒙特卡洛方法(Monte Carlo Method)的局限出发,讨论了时序差分(Temporal Difference, TD)方法为什么会出现,以及它如何把价值学习推进到“边交互、边更新”的形式。
首先,蒙特卡洛方法虽然已经摆脱了动态规划(Dynamic Programming)对环境模型的依赖,但它仍然必须等到完整回合结束之后,才能利用实际回报 $G_t$ 更新价值。这使得它在长回合任务中更新不够及时,而且由于完整回报累积了后续整段轨迹中的随机性,样本波动通常也较大。
随后,引入了增量更新与随机近似的基本形式。无论是蒙特卡洛方法还是时序差分方法,本质上都可以写成
$$ \text{估计值} \leftarrow \text{估计值} + \alpha \times \text{误差} $$真正的区别并不在更新框架本身,而在于“目标值”是怎样构造的。蒙特卡洛方法使用完整回报作为目标,而时序差分方法则尝试用更局部的信息构造更新目标。
在此基础上,先讨论了最基本的 TD(0)。它用
$$ r_t+\gamma V_\pi(s_{t+1}) $$去近似完整回报,并通过时序差分误差
$$ \delta_t=r_t+\gamma V_\pi(s_{t+1})-V_\pi(s_t) $$对当前状态价值做一步修正。这样一来,价值更新就不再依赖完整回合,而可以在每一步转移发生后立即进行。这里也说明了一个关键点:更新式中的 $V_\pi(s_{t+1})$,并不是提前知道的真实价值,而是在观察到下一状态之后,从当前维护的价值估计中读取出来的结果。这正体现了时序差分方法的自举(Bootstrap)特征。
接着,将这一思想推广到控制问题,分别引入了 Sarsa 和 Q-learning。Sarsa 使用
$$ r_t+\gamma Q(s_{t+1},a_{t+1}) $$作为更新目标,因此学习的是当前实际执行策略对应的动作价值函数,是一个同策略(On-policy)方法。Q-learning 则使用
$$ r_t+\gamma \max_{a'}Q(s_{t+1},a') $$作为目标,直接朝最优动作价值函数 $Q_*(s,a)$ 逼近,因此属于离策略(Off-policy)方法。
在讨论 Q-learning 时,还特别说明了探索(Exploration)的意义。虽然更新目标中使用了下一状态下当前估计的最大 $Q$ 值,但每次真正被更新的,仍然是当前实际执行过的状态—动作对 $(s_t,a_t)$)。因此,探索的作用并不在于改变“取最大值”这一规则,而在于让更多动作有机会被实际尝试,从而使各个动作对应的 $Q$ 值逐步得到修正。也正因为如此,Q-learning 才能够形成一种典型结构:用带探索的行为收集数据,用贪心的目标更新价值。
最后,通过同策略与离策略的对比,可以把本文的几种方法统一起来理解:
- TD(0) 解决的是状态价值的在线评估问题;
- Sarsa 解决的是动作价值的同策略控制问题;
- Q-learning 解决的是动作价值的离策略最优控制问题。
从逻辑上看,这一篇完成的是这样一条推进路径:
- 从完整回报更新,转向一步更新;
- 从状态价值评估,转向动作价值控制;
- 从评估当前策略,转向直接逼近最优动作价值。
因此,时序差分方法的意义并不只是得到几个新的更新公式,而是在强化学习中真正建立起了一种更及时、更连续的学习方式:不再等待未来全部展开,而是在每一步经验到来时,就立刻利用已有信息修正当前估计。