【RL笔记】为什么行为克隆会失败?从分布偏移公式看误差累积
首先,我们需要定义误差的边界。假设我们训练好的策略网络πθ\pi_\thetaπθ在单步决策上的表现还不错,它的单步误差率被限制在ϵ\epsilonϵπθa≠π⋆s∣s≤ϵπθaπ⋆s∣s≤ϵ这意味着在任意时刻,智能体模仿专家动作出错的概率不超过ϵ\epsilonϵ(例如 1%),而做对的概率至少是1−ϵ1-\epsilon1−ϵ(例如 99%)。注意:幻灯片中划掉了一行for all s,

在强化学习和模仿学习(Imitation Learning)中,最简单的方法莫过于行为克隆(Behavioral Cloning, BC)。也就是把专家的示范数据(State-Action Pairs)当作监督学习的训练集,训练一个策略网络 πθ\pi_\thetaπθ 去拟合专家 π⋆\pi^\starπ⋆。
虽然这种方法在简单任务上有效,但在长序列任务中往往表现糟糕。经典的解释是“分布偏移(Distribution Shift)”。
本文基于 UC Berkeley CS285 课程的一张经典幻灯片,详细拆解其背后的数学原理,特别是那个揭示了误差如何随时间指数级扩散的核心公式。
1. 基本假设与定义
首先,我们需要定义误差的边界。
假设我们训练好的策略网络 πθ\pi_\thetaπθ 在单步决策上的表现还不错,它的单步误差率被限制在 ϵ\epsilonϵ 以内:
πθ(a≠π⋆(s)∣s)≤ϵ\pi_\theta(\mathbf{a} \neq \pi^\star(\mathbf{s})|\mathbf{s}) \le \epsilonπθ(a=π⋆(s)∣s)≤ϵ
这意味着在任意时刻,智能体模仿专家动作出错的概率不超过 ϵ\epsilonϵ(例如 1%),而做对的概率至少是 1−ϵ1-\epsilon1−ϵ(例如 99%)。
注意:幻灯片中划掉了一行
for all s,修正为for s ~ p_train。这很严谨:我们不需要保证模型在全宇宙所有状态下都表现好,只需要它在**专家见过的状态分布(训练集分布)**下表现好即可。
2. 核心公式:状态分布的演变
随着时间 ttt 的推移,我们的策略 πθ\pi_\thetaπθ 所处的状态分布 pθ(st)p_\theta(\mathbf{s}_t)pθ(st) 会发生什么变化?幻灯片给出了这个著名的分解公式:
pθ(st)=(1−ϵ)tptrain(st)⏟第一部分:完美模仿+(1−(1−ϵ)t)pmistake(st)⏟第二部分:步入歧途p_\theta(\mathbf{s}_t) = \underbrace{(1 - \epsilon)^t p_{\text{train}}(\mathbf{s}_t)}_{\text{第一部分:完美模仿}} + \underbrace{(1 - (1 - \epsilon)^t) p_{\text{mistake}}(\mathbf{s}_t)}_{\text{第二部分:步入歧途}}pθ(st)=第一部分:完美模仿 (1−ϵ)tptrain(st)+第二部分:步入歧途 (1−(1−ϵ)t)pmistake(st)
这个公式本质上是一个全概率公式(Law of Total Probability)的应用,或者是加权平均。它将 ttt 时刻的状态分布拆解为两种互斥情况的叠加。
第一部分:如果一直没犯错
(1−ϵ)tptrain(st)(1 - \epsilon)^t p_{\text{train}}(\mathbf{s}_t)(1−ϵ)tptrain(st)
-
(1−ϵ)t(1 - \epsilon)^t(1−ϵ)t 是权重(概率标量):
代表从第 0 步到第 ttt 步,连续 ttt 次决策全部正确的概率。- 第 1 步对的概率是 (1−ϵ)(1-\epsilon)(1−ϵ)
- 第 2 步也对的概率是 (1−ϵ)2(1-\epsilon)^2(1−ϵ)2
- …
- 第 ttt 步全对的概率就是 (1−ϵ)t(1-\epsilon)^t(1−ϵ)t。
-
ptrain(st)p_{\text{train}}(\mathbf{s}_t)ptrain(st) 是条件分布:
这部分回答了“如果我一直没犯错,我会处于什么状态?”
显然,如果你每一步都完美复刻了专家的动作,那么你的轨迹就和专家完全一致。因此,在这个前提下,你所处的状态分布就是专家的训练分布 ptrainp_{\text{train}}ptrain。
第二部分:如果至少犯了一次错
(1−(1−ϵ)t)pmistake(st)(1 - (1 - \epsilon)^t) p_{\text{mistake}}(\mathbf{s}_t)(1−(1−ϵ)t)pmistake(st)
-
(1−(1−ϵ)t)(1 - (1 - \epsilon)^t)(1−(1−ϵ)t) 是权重:
这是第一部分的补集,代表“在过去 ttt 步中,至少犯了一次错”的概率。 -
pmistake(st)p_{\text{mistake}}(\mathbf{s}_t)pmistake(st) 是条件分布:
一旦犯错,智能体就进入了一个未知的状态分布 pmistakep_{\text{mistake}}pmistake。这通常是专家从未到达过的区域(Out-of-Distribution, OOD)。
3. 致命的后果:指数级衰减
这个公式揭示了行为克隆的阿喀琉斯之踵:
-
正确的概率指数级下降:
观察第一项的系数 (1−ϵ)t(1 - \epsilon)^t(1−ϵ)t。即使 ϵ\epsilonϵ 很小(例如 0.01),只要 ttt 很大(长序列任务),这个值也会迅速趋近于 0。- 例如:ϵ=0.01,t=100⇒0.99100≈0.36\epsilon=0.01, t=100 \Rightarrow 0.99^{100} \approx 0.36ϵ=0.01,t=100⇒0.99100≈0.36。
- 这意味着到了第 100 步,即使你单步准确率高达 99%,你仍有 64% 的概率已经偏离了正确轨道。
-
未知的深渊 (pmistakep_{\text{mistake}}pmistake):
随着 ttt 增加,公式的重心完全转移到了第二项 pmistakep_{\text{mistake}}pmistake。- 这是一个恶性循环:模型进入了 pmistakep_{\text{mistake}}pmistake(专家没去过的地方,比如车开到了路肩)。
- 因为是监督学习,训练集中没有关于“如何从路肩回到路中间”的数据。
- 模型在未知状态下只能瞎猜,导致更大的错误,离 ptrainp_{\text{train}}ptrain 越来越远。
4. 总结
这个公式不仅仅是一个数学推导,它直观地量化了**Covariate Shift(协变量偏移)**问题。
它告诉我们:在序列决策问题中,微小的单步误差 ϵ\epsilonϵ 不会线性叠加,而是会通过状态分布的偏移,导致误差概率随时间指数级上升。
这就是为什么在这个公式之后,通常会推导出行为克隆的误差上界是 O(ϵT2)O(\epsilon T^2)O(ϵT2) 而不是 O(ϵT)O(\epsilon T)O(ϵT),也是为什么我们需要 DAgger 或强化学习(RL)来解决这个问题的原因——我们需要教模型在 pmistakep_{\text{mistake}}pmistake 中如何生存,而不仅仅是在 ptrainp_{\text{train}}ptrain 中背诵答案。
更多推荐


所有评论(0)