RL 学习笔记 #6 时序差分学习算法
本文最后更新于:2024年12月19日 晚上
前面我们介绍了首个无模型的强化学习算法 —— 蒙特卡洛学习,这是一种非增量(Non-Incremental)的方法,尽管它通过多次采样逐步逼近价值函数,但更新时需要完整的采样回合。本节将介绍一种重要的增量式(Incremental)无模型强化学习方法——时序差分学习(Temporal Difference Learning),其结合了蒙特卡洛方法和动态规划的优点:
- 类似动态规划:TD 学习不需要完整的回报序列,只需利用当前状态和下一状态的信息。
- 类似蒙特卡洛方法:TD 学习能够通过与环境交互的数据进行更新,而不需要已知的环境模型。
这里我们首先用上一节介绍的 RM 算法引入,考虑如下的估计问题: \[ \theta=\mathbb{E}[R+\gamma v(X)] \] 其中,\(R, X\) 为随机变量,\(\gamma\) 为常数,\(v(\cdot)\) 为一个未知函数。假设我们获取了采样序列 \(\{x\}\) 和 \(\{r\}\),则有: \[ \begin{aligned} g(\theta) & =\theta-\mathbb{E}[R+\gamma v(X)] \\ \tilde{g}(\theta, \eta) & =\theta-[r+\gamma v(x)] \\ & =(\theta-\mathbb{E}[R+\gamma v(X)])+(\mathbb{E}[R+\gamma v(X)]-[r+\gamma v(x)]) \\ & \doteq g(\theta)+\eta \end{aligned} \] 于是,我们将估计问题转化为方程 \(g(\theta)=0\) 的根的求解,最后 RM 算法可以表示为: \[ \theta_{n+1}=\theta_n-\alpha_n \tilde{g}\left(\theta_n, \eta_n\right)=\theta_n-\alpha_n\left[\theta_n-\left(r_n+\gamma v\left(x_n\right)\right)\right] \] 上述式子其实已经蕴含了 TD Learning 的经典形式,接下来我们先介绍用于估计状态值的 TD 算法。
状态价值 TD Learning
给定策略 \(\pi\),我们希望能估计状态价值 \(v_\pi(s)\),完成策略评估(PE)。增量更新的特点在于动态调整其估计值 \(v_t(s)\),最终逐步接近真实值 \(v_\pi(s)\)。
由于无模型,我们仅依赖策略 \(\pi\) 产生的经验数据 \(\{(s_t, r_{t+1}, s_{t+1})\}\)。其更新公式如下: \[ \left\{\begin{aligned} v_{t+1}\left(s_t\right) &=v_t\left(s_t\right)-\alpha_t\left(s_t\right)\left[v_t\left(s_t\right)-\left[r_{t+1}+\gamma v_t\left(s_{t+1}\right)\right]\right], \\ v_{t+1}(s) &=v_t(s), \quad \forall s \neq s_t \end{aligned}\right. \] 其中:
- 在 \(t\) 时刻,我们对当前状态 \(s_t\) 对应的 \(v_t(s_t)\) 进行了修正,而其他状态对应的状态值则保持原样;
- 修正项中,\(\alpha_t\left(s_t\right)\) 表示学习率,控制更新步长;
- 第一个大括号表示 TD Error \(\delta_t\),是估计值 \(v_t(s_t)\) 与目标值的差距;
- 第二个大括号表示 TD Target \(\bar{v}_t\),我们希望 \(v_t(s_t)\) 能朝着这个目标值去修改。
为什么能控制修改方向呢?我们先对更新公式简单变形,两边都减去 \(\bar{v}_t\): \[ v_{t+1}\left(s_t\right)-\bar{v}_t=v_t\left(s_t\right)-\bar{v}_t-\alpha_t\left(s_t\right)\left[v_t\left(s_t\right)-\bar{v}_t\right] \] 合并得到: \[ v_{t+1}\left(s_t\right)-\bar{v}_t=\left[1-\alpha_t\left(s_t\right)\right]\left[v_t\left(s_t\right)-\bar{v}_t\right] \] 各项取绝对值: \[ \left|v_{t+1}\left(s_t\right)-\bar{v}_t\right|=\left|1-\alpha_t\left(s_t\right)\right|\left|v_t\left(s_t\right)-\bar{v}_t\right| \] 考虑到 \(\alpha_t\left(s_t\right)\) 是一个小的正数,我们有: \[ 0<1-\alpha_t\left(s_t\right)<1 \]
进而得到:
\[ \left|v_{t+1}\left(s_t\right)-\bar{v}_t\right| \leq\left|v_t\left(s_t\right)-\bar{v}_t\right| \] 显然,在一次更新后估计值 \(v_t(s_t)\) 与目标值的差距变小了!现在另一个问题是,为什么我们需要将 TD Target 定义为这种形式呢?考虑: \[ \delta_t=v\left(s_t\right)-\left[r_{t+1}+\gamma v\left(s_{t+1}\right)\right] \] 这个式子可以认为是两个相邻时间步的差,也就是时序差分算法名字的由来。它反映的是 \(v_t\) 和 \(v_\pi\) 的误差,当 \(\delta_t=0\) 时,这个式子就收敛到状态值的递归定义。
因此,为了减小误差、改进估计的准确度,每当一个新的单步经验数据 \((s_t, r_{t+1}, s_{t+1})\) 产生时,我们都可以用这个公式进行增量更新。
RM 算法求解贝尔曼公式
TD Learning 算法在数学上究竟在干什么呢?实际上其目标是求解无模型时策略 \(\pi\) 的贝尔曼公式。这里我们将从理论上更深入探讨 RM 算法如何用于这一目标。首先引入贝尔曼公式:
\[ v_\pi(s)=\mathbb{E}[R+\gamma G \mid S=s], \quad s \in \mathcal{S} \]
其中 \(G\) 为累计奖励回报,由于:
\[ \mathbb{E}[G \mid S=s]=\sum_a \pi(a \mid s) \sum_{s^{\prime}} p\left(s^{\prime} \mid s, a\right) v_\pi\left(s^{\prime}\right)=\mathbb{E}\left[v_\pi\left(S^{\prime}\right) \mid S=s\right] \]
其中 \(S^{\prime}\) 是下一个状态,因此我们可以改写定义得到:
\[ v_\pi(s)=\mathbb{E}\left[R+\gamma v_\pi\left(S^{\prime}\right) \mid S=s\right], \quad s \in \mathcal{S} . \]
接下来我们继续用 RM 算法来求解上式表示的估计问题,首先定义: \[ g(v(s))=v(s)-\mathbb{E}\left[R+\gamma v_\pi\left(S^{\prime}\right) \mid s\right] \]
问题转化为求解 \(g(v(s))=0\)。由于环境的概率模型未知,我们通过采样数据 \({(s, r, s')}\),定义一个噪声版 \(g\):
\[ \begin{aligned} \tilde{g}(v(s)) & =v(s)-\left[r+\gamma v_\pi\left(s^{\prime}\right)\right] \\ & =\underbrace{\left(v(s)-\mathbb{E}\left[R+\gamma v_\pi\left(S^{\prime}\right) \mid s\right]\right)}_{g(v(s))}+\underbrace{\left(\mathbb{E}\left[R+\gamma v_\pi\left(S^{\prime}\right) \mid s\right]-\left[r+\gamma v_\pi\left(s^{\prime}\right)\right]\right)}_\eta . \end{aligned} \] 套用 RM 算法,更新公式为: \[ v_{t+1}(s) = v_t(s) - \alpha_t \tilde{g}(v_t(s)) = v_t(s) - \alpha_t \left( v_t(s)-\left[r_k +\gamma v_\pi\left(s^{\prime}_k\right)\right]\right),\quad k=1,2,3 \] 此公式与我们之前的 TD 更新形式非常相似,但请注意,这里是需要采样一系列 \(\{(s, r_k, s'_k)\}\) 进行迭代更新的。换句话说,我们得从 \(s\) 出发计算多次来估计 \(v_\pi(s)\)。这就有两点关键的实际问题需要解决:
- 数据采样的形式:如何用一个经验轨迹更新多个状态的估计值?
- 估计目标的替代:实际中 \(v_\pi(s')\) 无法直接获取。
TD Learning 的解决方案如下:
- 采样形式的改进:改用轨迹数据,在序列 \(\{(s_t, r_{t+1}, s_{t+1})\}\) 中,仅当访问某状态 \(s\) 时更新其估计值,而未访问到的状态保持不变。这样,一条轨迹可以同时用于多个状态的更新。
- 估计目标的替代:用当前的估计值 \(v_t(s')\) 替代真实的 \(v_\pi(s')\),虽然这会引入偏差,但随着更新的累积,估计值会逐步收敛到真实值。
通过以上调整,RM 算法可以高效求解无模型时的贝尔曼公式。
收敛性分析
通过 RM 算法框架,可以严格证明 TD 算法的收敛性。其核心定理为,若满足以下学习率条件:
- \(\sum_{t=1}^\infty \alpha_t(s) = \infty\),注意这里要对每个状态都成立,即每个状态都需要被访问无数次——实际中只需要较多次即可;
- \(\sum_{t=1}^\infty \alpha_t^2 (s) < \infty\),即学习率逐渐减小——实际中学习率通常设为一个小的常数(如 \(0.01\)),防止最后经验失去作用,虽然严格来说不满足条件,但实践效果良好。
则 \(v_t(s)\) 收敛到真实值 \(v_\pi(s)\),得到最终的策略评估(PE)。
TD Learning 与 MC Learning 的对比
我们已经了解了时序差分学习和蒙特卡洛学习两种无模型算法的基本性质,以下是两者的详细对比:
特性 | TD/Sarsa Learning | MC Learning |
---|---|---|
更新时机 | 在线(Online)逐状态更新 | 离线(Offline)Episode 结束才更新 |
任务类型 | Continuing 无终止任务、Episode 任务 | 仅 Episode 任务 |
更新方式 | Bootstrapping 从猜测出发修正 | 直接用采样结果估计 |
估计方差 | 较小,因为单步采样变量少 | 较大,整个 Episode 不确定因素多 |
估计偏差 | 有偏,来自于初始猜测,但会收敛 | 无偏,直接求期望 |
动作价值 TD Learning
基础的 TD Learning 仍存在一些局限性:
- 无法直接估计动作价值函数 \(q(s,a)\),因为 \(r\) 仍具有不确定性;
- 进而无法直接找到最优策略 \(\pi^*\),通常我们会贪心选取动作价值最高者。
如果能将 TD Learning 从状态值函数扩展到动作价值函数,就能在策略评估(PE)后进行策略改进(PI),从而找到最优策略。本小节将介绍的 SARSA 是一种估计动作价值的时序差分算法,其名称来源于更新公式中的五元组 \((S_t, A_t, R_{t+1}, S_{t+1}, A_{t+1})\)。
SARSA 算法
由于无模型,我们仅依赖策略 \(\pi\) 产生的经验数据 \(\{(s_t, a_t, r_{t+1}, s_{t+1}, a_{t+1})\}\)。其更新公式如下: \[ \left\{\begin{aligned} q_{t+1}\left(s_t, a_t\right) &=q_t\left(s_t, a_t\right)-\alpha_t\left(s_t, a_t\right)\left[q_t\left(s_t, a_t\right)-\left[r_{t+1}+\gamma q_t\left(s_{t+1}, a_{t+1}\right)\right]\right], \\ q_{t+1}(s, a) &=q_t(s, a), \quad \forall(s, a) \neq\left(s_t, a_t\right), \end{aligned}\right. \] 其中:
- 在 \(t\) 时刻,我们对当前状态 \(s_t\) 和动作 \(a_t\) 对应的 \(q_t(s_t, a_t)\) 进行了修正,而其他状态对应的状态值则保持原样;
- 算法的整体形式和前面介绍的状态值 TD Learning 是完全一样的,包含 TD Error 和 TD Target。
同理,SARSA 在数学上也是求解了一个贝尔曼公式: \[ q_\pi(s,a)=\mathbb{E}\left[R+\gamma q_\pi\left(S^{\prime}, A^{\prime}\right) \mid S=s, A=a\right], \quad \forall s, a . \] 其收敛性条件和上一小节所述的也完全一样,这里略去证明过程。我们直接来讨论 SARSA 的重要优化:如何与策略改进结合起来?其算法步骤可以概括如下:
- 初始化:初始化动作价值函数 \(q(s, a)\)(通常为零或随机值),初始化初始状态 \(s\) 和动作 \(a\);
- 执行策略 \(\pi\):在环境中执行动作 \(a\),观察到即时奖励 \(r\) 和下一状态 \(s^{\prime}\);
- 策略评估:根据当前策略选择下一动作 \(a^{\prime}\),再根据经验数据更新动作价值函数;
- 策略改进:更新策略,通常选择 \(\varepsilon\)-贪心策略来平衡探索和利用;
- 重复:继续采样,直到到达终止状态或者策略收敛至 \(\pi^*\)。
Expected SARSA 算法
SARSA 的更新公式基于采样的 \(q_t\left(s_{t+1}, a_{t+1}\right)\),而 Expected SARSA 则改用期望更新: \[ \left\{ \begin{aligned} 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 \mathbb{E}\left[q_t \left(s_{t+1}, A\right) \right] \right) \right], \\ q_{t+1}(s, a) &= q_t(s, a), \quad \forall (s, a) \neq (s_t, a_t), \end{aligned} \right. \]
其中,\(\mathbb{E}\left[q_t(s_{t+1}, A) \right]\) 是下一状态 \(s_{t+1}\) 下,根据策略 \(\pi\) 所有可能动作的加权期望值,展开即为: \[ \mathbb{E}\left[q_t(s_{t+1}, A) \right]=\sum_a \pi_t(a\mid s_{t+1})q_t (s_{t+1}, a) \doteq v_t(s_{t+1}) \]
Expected SARSA 的关键是,其 TD Target 由随机采样的一个动作价值转变为了 \(s_{t+1}\) 的状态值。相比 SARSA,这里进行期望估计的计算量更大,但是也减少了对单一随机动作的依赖,从而降低了方差,适用于某些需要更稳定更新的任务。
N-Step SARSA 算法
N-Step SARSA 是 SARSA 的延伸,通过引入多个步骤的累计回报来改进更新,从而平衡偏差和方差。可以认为这是 SARSA 和蒙特卡洛方法的平衡,其更新公式如下: \[ \left\{ \begin{aligned} 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) - G_t^{(N)} \right], \\ q_{t+1}(s, a) &= q_t(s, a), \quad \forall (s, a) \neq (s_t, a_t), \end{aligned} \right. \]
其中,TD Target \(G_t^{(N)}\) 为 \(N\) 步的累计回报,定义为:
\[ G_t^{(N)} = \sum_{k=0}^{N-1} \gamma^k r_{t+k+1} + \gamma^N q(s_{t+N}, a_{t+N}). \]
在 \(N\) 步过程中:
- 前 \(N\) 步的奖励 \(r_{t+k+1}\) 被折扣为 \(\gamma^k r_{t+k+1}\);
- 最后一步的估计值 \(q(s_{t+N}, a_{t+N})\) 则被用于最终的回报估计。
N-Step SARSA 的优势在于,它能够利用多步经验数据 \(\{(s_t, a_t, r_{t+1}, s_{t+1}, a_{t+1}, \cdots, r_{t+N}, s_{t+N}, a_{t+N})\}\),从而提高估计的准确性。在实际中,\(N\) 的选择会影响算法的性能:
- 当 \(N = 1\) 时,N-Step SARSA 退化为标准的单步 SARSA;
- 当 \(N \to \infty\) 时,N-Step SARSA 逐渐接近蒙特卡洛方法。
通过调整 \(N\),可以在偏差和方差之间找到合适的平衡。
最优动作价值 TD Learning
SARSA 通过估计动作价值解决了策略改进(PI)的问题,但还有一种思路,就是直接学习最优动作价值函数 \(q^*(s, a)\) 来推导出最优策略 \(\pi^*\)。
这需要对动作价值函数进行无策略依赖的迭代更新。Q-Learning 就是解决这一问题的经典算法。
Q-Learning 算法
Q-Learning 不依赖于当前的行为策略 \(\pi\),而是通过选择最大动作价值来进行更新,从而逐步逼近最优策略。
其更新公式如下:
\[ \left\{ \begin{aligned} 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 A} q_t(s_{t+1}, a') \right) \right], \\ q_{t+1}(s, a) &= q_t(s, a), \quad \forall (s, a) \neq (s_t, a_t). \end{aligned} \right. \]
其中,\(\max_{a'\in A} q_t(s_{t+1}, a')\) 表示在下一状态 \(s_{t+1}\) 下,所有可能动作 \(a'\) 中的最大动作价值。这个选择是 Q-Learning 与 SARSA 的关键区别之一,Q-Learning 总是选择最大值,而不依赖于当前策略。
在数学上,Q-Learning 求解了如下贝尔曼最优公式(不同于之前的所有方法): \[ q(s, a)=\mathbb{E}\left[R_{t+1}+\gamma \max _a q\left(S_{t+1}, a\right) \mid S_t=s, A_t=a\right], \quad \forall s, a . \]
Q-Learning 算法的核心是通过对每一个状态-动作对的更新,逐渐逼近最优动作价值函数 \(q^*(s, a)\)。最终通过贪心策略 \(\pi^*(s) = \arg \max_a q^*(s, a)\),得到最优策略。
至此大家可能已经迫不及待想要查看 Q-Learning 的具体步骤了,但此时我们还需要引入一个重要概念。
Off-Policy vs. On-Policy
我们在之前的学习中已经提到过两种策略:
- 行为策略(Behavior Policy):用于与环境交互生成经验数据。
- 目标策略(Target Policy):我们希望最终达到的策略,也就是我们要不断更新直到收敛到最优策略。
根据策略之间的关系,可以将强化学习算法分为 On-Policy 和 Off-Policy 两大类。
- On-Policy:在学习过程中,使用的行为策略与目标策略是相同的。也就是说,行为策略直接与目标策略同步,所有的经验数据都是根据当前的目标策略生成的。
- Off-Policy:在学习过程中,使用的行为策略和目标策略不需要相同。也就是说,算法可以通过一个探索性较强的行为策略和环境交互得到大量的经验,再独立地去改进另一个目标策略。并且积累的经验数据也可以不断回放(Replay)。
在本课程学习过的内容中,SARSA 和 MC Learning 属于经典的 On-Policy 算法,而 Q-Learning 则属于 Off-Policy 算法:
SARSA 的更新公式中,动作价值的更新是直接基于当前的行为策略 \(\pi\) 进行的: \[ 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 q_t(s_{t+1}, a_{t+1}) \right) \right], \] 其使用的经验数据 \(\{(s_t, a_t, r_{t+1}, s_{t+1}, a_{t+1})\}\) 中,\(s_t\) 和 \(a_t\) 属于条件,\(r_{t+1}\) 和 \(s_{t+1}\) 由环境决定也与策略无关,但是 \(a_{t+1}\) 则完全依赖策略 \(\pi_t(s_{t+1})\)。
MC Learning 的更新公式中,轨迹的采样也是直接基于当前的行为策略 \(\pi\) 进行的: \[ q_\pi(s,a) = \mathbb{E}_\pi\left[G_t \mid S_t = s, A_t = a\right] \approx \frac{1}{N} \sum_{i=1}^N g^{(i)}(s, a) \]
Q-Learning 的更新公式中,\(\max q_t(s_{t+1}, a')\) 代表的是对目标策略的估计,与当前的采样所用的行为策略完全无关: \[ 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 A} q_t(s_{t+1}, a') \right) \right], \] 其使用的经验数据 \(\{(s_t, a_t, r_{t+1}, s_{t+1}\}\) 中,都与策略无关。此时行为策略可以是任意的(例如 \(\varepsilon\)-greedy 策略),甚至越灵活越好。
Q-Learning 算法步骤
既然 Q-Learning 的行为策略可以是任意的,那么我们也可以强行让行为策略和目标策略一致,就会得到一个 On-Policy 版本的步骤(与 SARSA 几乎一致):
- 初始化:初始化动作价值函数 \(q(s, a)\),初始化初始状态 \(s\) 和动作 \(a\);
- 执行策略 \(\pi\):在环境中执行动作 \(a\),观察到即时奖励 \(r\) 和下一状态 \(s^{\prime}\);
- 策略评估:无需选择下一动作,直接用 \(\max q(s^{\prime}, a)\) 更新动作价值函数;
- 策略改进:更新策略,通常选择 \(\varepsilon\)-贪心策略来平衡探索和利用;
- 重复:继续采样,直到到动作价值收敛后,求出最优策略 \(\pi^*\)。
反之,如果行为策略独立,则 Off-Policy 版本的步骤如下:
- 初始化:初始化动作价值函数 \(q(s, a)\),初始化初始状态 \(s\) 和动作 \(a\);
- 执行策略 \(\pi_b\):根据行为策略随机采样一组经验数据 \(\{s_0,a_0,r_1,s_1,a_1,r_2,\cdots\}\);
- 策略评估:对于经验数据中的每个时刻,直接用 \(\max q(s^{\prime}, a)\) 更新动作价值函数;
- 策略改进 \(\pi_t\):更新策略,直接用贪心策略更新,因为此时目标策略不用于采样,无需探索性;
- 重复:继续采样,直到到动作价值收敛后,求出最优策略 \(\pi^*\)。
TD Learning 的统一视角
本节中介绍的算法都可以用一个公式概括: \[ q_{t+1}\left(s_t, a_t\right)=q_t\left(s_t, a_t\right)-\alpha_t\left(s_t, a_t\right)\left[q_t\left(s_t, a_t\right)-\bar{q}_t\right], \] 其中 \(\bar{q}_t\) 表示 TD Target,根据取值的不同有如下变种:
算法 | \(\bar{q}_t\) 形式 |
---|---|
SARSA | \(\bar{q}_t=r_{t+1}+\gamma q_t\left(s_{t+1}, a_{t+1}\right)\) |
N-Step SARSA | \(\bar{q}_t=r_{t+1}+\gamma r_{t+2}+\cdots+\gamma^n q_t\left(s_{t+n}, a_{t+n}\right)\) |
Expected SARSA | \(\bar{q}_t=r_{t+1}+\gamma \sum_a \pi_t\left(a \mid s_{t+1}\right) q_t\left(s_{t+1}, a\right)\) |
Q-Learning | \(\bar{q}_t=r_{t+1}+\gamma \max _a q_t\left(s_{t+1}, a\right)\) |
MC Learning | \(\bar{q}_t=r_{t+1}+\gamma r_{t+2}+\cdots\) |
同理,他们所解决的数学问题也可以统一表达:
算法 | 数学问题 |
---|---|
SARSA | \(\mathrm{BE}: q_\pi(s, a)=\mathbb{E}\left[R_{t+1}+\gamma q_\pi\left(S_{t+1}, A_{t+1}\right) \mid S_t=s, A_t=a\right]\) |
N-Step SARSA | \(\mathrm{BE}: q_\pi(s, a)=\mathbb{E}\left[R_{t+1}+\gamma R_{t+2}+\cdots+\gamma^n q_\pi\left(s_{t+n}, a_{t+n}\right) \mid S_t=s, A_t=a\right]\) |
Expected SARSA | \(\mathrm{BE}: q_\pi(s, a)=\mathbb{E}\left[R_{t+1}+\gamma \mathbb{E}_{A_{t+1}}\left[q_\pi\left(S_{t+1}, A_{t+1}\right)\right] \mid S_t=s, A_t=a\right]\) |
Q-Learning | \(\textcolor{red}{\mathrm{BOE}}: q(s, a)=\mathbb{E}\left[R_{t+1}+\max _a q\left(S_{t+1}, a\right) \mid S_t=s, A_t=a\right]\) |
MC Learning | \(\mathrm{BE}: q_\pi(s, a)=\mathbb{E}\left[R_{t+1}+\gamma R_{t+2}+\ldots \mid S_t=s, A_t=a\right]\) |