固定层数推理的浪费:每个问题都被当成难题
在线问答服务里,请求难度差异极大。一个问“今天天气怎么样”的简单问题,和一个需要多步推理的复杂问题,在固定 12 层 BERT 的模型里都要走完所有层。模型对每个输入都执行相同数量的前向计算,简单样本在浅层就已经能被正确分类,后续层计算只是重复劳动。这种“一刀切”的做法在推理延迟和算力消耗上都不经济。
自适应计算时间(Adaptive Computation Time,ACT)与早期退出(Early Exit)正是为打破这种固定深度而提出的机制。它们的核心思想是:让模型根据输入难度动态决定推理深度,简单样本提前退出,复杂样本走完全部层。本文以在线问答服务为贯穿场景,讨论这些机制如何实现、训练、部署,以及它们在延迟、吞吐与精度之间的权衡。
从 ACT 到早期退出:动态深度的两种实现
ACT:让循环网络自己决定计算步数
ACT 最初由 Alex Graves 在 2016 年提出,用于循环神经网络(RNN)。它让网络在接收输入和产生输出之间,学习执行多少步计算。ACT 的核心是引入一个“计算步数”的隐变量,网络每一步都会输出一个“停止概率”,当累积概率超过某个阈值时,网络停止计算并输出结果。这个机制是确定性的、可微分的,不向梯度添加噪声,因此可以直接用反向传播训练。
在 Graves 的实验中,ACT 在四个合成任务(二进制向量奇偶性、二进制逻辑运算、整数加法、实数排序)上显著提升了性能,并成功根据问题复杂度调整计算步数。在 Hutter 奖维基百科数据集的字符级语言建模中,ACT 没有带来大幅性能提升,但揭示了数据结构的洞察:模型将更多计算分配给更难预测的转换,比如单词间的空格和句子结尾。这表明 ACT 或类似的自适应计算方法,可以作为一种通用的序列数据分段边界推断方法。
早期退出:在预训练模型每层后挂分类器
将 ACT 的思想应用到 BERT 这类预训练模型上,可以把每一层看作一个计算步。BERT-base 有 12 层,对每个样本都执行 12 层前向计算。早期退出(Early Exit)在每一层后添加一个内部分类器,模型每执行一层,就用当前层的表示进行分类,根据分类结果决定是否退出。如果分类器足够自信,就提前输出;否则继续下一层。
DeeBERT 是这一思路的代表作,它采用预测概率分布的熵作为置信度指标:若熵小于某个阈值,说明模型对预测足够自信,可以退出。FastBERT 则使用更复杂的基于注意力的分类器,并增加自蒸馏目标,使中间层输出与最后一层分类器一致。这些方法都旨在让模型根据样本难度动态调整计算量。
早期退出的核心组件:层间分类器与退出决策
层间分类器:从线性到注意力
层间分类器是早期退出的关键组件。最简单的设计是线性分类器,直接对当前层的隐藏表示做线性变换,输出类别概率。DeeBERT 采用这种设计,训练成本低,但浅层表示可能不足以支撑复杂分类。FastBERT 采用基于注意力的分类器,能更好地利用表示信息,但计算开销更大。
分类器输出的质量直接影响退出决策。如果分类器在浅层就给出错误的高置信度预测,模型会过早退出,导致精度下降。因此,分类器的训练至关重要。
退出决策:阈值、一致性与概率
退出决策是早期退出的核心。DeeBERT 使用熵阈值,当熵低于阈值时退出。但熵阈值存在一个缺点:模型可能对错误预测过度自信。RightTool 使用预测类别的概率值作为置信度,并进行了事后校准,以避免过度自信问题。
PABEE(Patience-based Early Exit)提出了一种更鲁棒的决策方式:当连续若干层的内部分类器给出相同预测时,才触发退出。这种“耐心”机制避免了单层分类器的偶然波动。PABEE 在 ALBERT 模型上实验,表明该方法能提高准确率和鲁棒性,防止模型“过度思考”,并比现有早期退出方法取得更好的精度-速度权衡。
ELBERT 则采用置信度窗口:当连续多层分类器在某个类别上给出单调递增的概率时触发退出。这些方法都试图让退出决策更稳定、更符合样本难度。
训练策略:让中间分类器学会预测
早期退出模型的训练通常分阶段进行。DeeBERT 采用两阶段训练:第一阶段正常微调整个模型,包括最后一层分类器;第二阶段固定中间层参数和最终分类器,仅用交叉熵损失训练中间分类器。这样可以让中间分类器学习从浅层表示预测正确标签。
FastBERT 在训练中间分类器时增加了自蒸馏目标,使中间层输出与最后一层分类器输出保持一致,从而提升中间分类器的准确性。LeeBERT 则让中间分类器进行互蒸馏,并对不同层分类器的损失赋予可学习的权重,以提升退出决策质量。
分层损失(layer-wise loss)是另一种常见策略,即在每一层都计算分类损失并反向传播,使每一层的表示都朝着可分类的方向优化。这有助于浅层表示携带更多任务相关信息,提高早期退出的准确性。
贯穿场景:在线问答服务的部署与权衡
假设我们有一个在线问答服务,用户提交问题,系统返回答案。模型是一个 12 层 BERT,固定深度推理时,每个请求都走完 12 层。高峰期大量请求涌入,GPU 算力紧张,延迟上升。引入早期退出后,简单问题(如“什么是机器学习”)可能在第 3 层就退出,复杂问题(如“如何用贝叶斯推断解释过拟合”)则走完 12 层。
延迟与吞吐的权衡
早期退出直接减少平均推理层数,从而降低延迟。对于简单样本占比高的场景,平均层数可能从 12 降到 5~6,延迟显著降低。吞吐量也随之提升,因为单位时间内可以处理更多请求。但精度可能受影响:如果阈值设置过低,简单样本可能过早退出,导致错误答案;如果阈值过高,复杂样本也会走完全部层,加速效果减弱。
与批处理的兼容性
在线服务通常使用批处理(batching)来提高 GPU 利用率。早期退出与批处理存在冲突:不同样本在不同层退出,导致批次内样本的计算深度不一致。传统批处理要求所有样本同步执行每一层,早期退出会破坏这种同步。
一种解决方案是“动态批处理”:将同一时刻处于同一层的样本组成批次,逐层推进。这需要调度器跟踪每个样本的当前层,并在每层结束后重新分组。这会增加调度开销,但能保持 GPU 利用率。另一种方案是“桶化”:将样本按预估难度分组,同组样本使用相同的退出策略,但这会损失自适应性。
与 KV Cache 的兼容性
对于生成式模型(如 GPT),KV Cache 用于缓存注意力计算的键值对,避免重复计算。早期退出与 KV Cache 的交互需要谨慎处理。如果模型在中间层退出,KV Cache 只包含前几层的信息,后续层不再计算,因此缓存不完整。对于分类任务,这通常不是问题,因为分类器直接使用隐藏表示。但对于生成任务,如果每一层都生成 token,早期退出可能导致生成质量下降。
在生成式模型中,早期退出通常应用于每个 token 的生成深度,而不是整个序列。例如,简单 token 可能用较少的层生成,复杂 token 用更多层。但 KV Cache 需要为每个 token 存储所有层的键值,如果某些层被跳过,缓存管理会复杂化。工程上,通常只在编码器(如 BERT)上应用早期退出,生成式模型则采用其他动态深度方法。
常见失败模式与改进方向
退出决策不鲁棒
CascadeBERT 指出,在高加速比下(大部分样本在浅层退出),早期退出面临两个瓶颈:一是退出决策不鲁棒,即样本难度与中间分类器的置信度不匹配;二是浅层表示信息不充分。作者设计了 Difficulty Inversion Score 来衡量退出决策与样本难度顺序的匹配程度,发现 DeeBERT 的中间分类器在其选择退出的样本上仍难以给出好的退出决策。
浅层表示信息不足
BERT 的浅层表示可能不足以支撑复杂分类。CascadeBERT 提出级联不同大小的预训练模型(如 2 层 BERT 和 12 层 BERT),因为小模型也是从头预训练,其表示具备较完整的语义信息。Global Past-Future 则利用模仿学习,一方面利用所有浅层表示,另一方面预测深层表示作为辅助信息。
样本难度与置信度相关性低
RightTool 分析了样本长度与难度的相关性,发现相关性很低;模型预测置信度与难度的相关性也不高,相关系数约 0.3。这表明基于置信度的启发式退出策略仍有提升空间。
对比表格:早期退出方法 vs 固定深度推理
| 维度 | 固定深度推理 | 早期退出(DeeBERT 等) |
|---|---|---|
| 推理深度 | 所有样本固定走完全部层 | 根据样本难度动态决定,简单样本提前退出 |
| 平均延迟 | 高,与层数成正比 | 低,简单样本延迟显著降低 |
| 吞吐量 | 低,所有请求消耗相同算力 | 高,单位时间处理更多请求 |
| 精度 | 基准精度 | 可能下降,取决于阈值和分类器质量 |
| 实现复杂度 | 简单,无需额外组件 | 需要添加层间分类器,训练分阶段 |
| 批处理兼容性 | 天然兼容,同步执行 | 需要动态批处理或桶化,增加调度开销 |
| 适用场景 | 对精度要求极高,或样本难度分布均匀 | 简单样本占比高,对延迟敏感的场景 |
流程图:在线问答服务的早期退出流程
flowchart TD
A[用户请求] --> B[输入嵌入]
B --> C[第1层 Transformer]
C --> D[内部分类器1]
D --> E{置信度是否达阈值?}
E -- 是 --> F[输出答案]
E -- 否 --> G[第2层 Transformer]
G --> H[内部分类器2]
H --> I{置信度是否达阈值?}
I -- 是 --> F
I -- 否 --> J[... 继续后续层 ...]
J --> K[最后一层分类器]
K --> F
该流程图展示了在线问答服务中,每个请求从输入到输出的过程。关键转折点在于每个内部分类器的置信度判断:如果置信度达到阈值,则提前输出;否则继续下一层。最终,如果所有层都走完,则使用最后一层分类器输出。
可观测指标与部署边界
在生产环境部署早期退出模型时,需要监控以下信号:
- 平均退出层数:反映整体计算量,应随阈值调整而变化。
- 退出层数分布:观察是否大部分样本在浅层退出,是否存在异常分布。
- 精度变化:对比固定深度模型的精度,监控是否因过早退出而下降。
- 延迟和吞吐:P99 延迟、平均延迟、每秒请求数。
- 批处理效率:动态批处理的分组开销,GPU 利用率。
部署边界:早期退出适用于分类、回归等任务,对于生成任务需要谨慎。当样本难度分布均匀或复杂样本占比高时,加速效果有限。此外,阈值需要根据业务需求调整,可能需要在精度和延迟之间做取舍。
未解决的问题
早期退出仍面临一些未解决的问题。如何更准确地评估样本难度,使退出决策与难度匹配,仍是开放挑战。RightTool 发现置信度与难度相关性低,说明启发式方法有局限。如何设计更好的退出决策,如基于集成投票或学习到的退出模块,是研究方向。另外,早期退出与 KV Cache、动态批处理等系统级优化的结合,还需要更多工程实践。
早期退出提供了一种按需计算的方式,但它的有效性依赖于样本难度的分布和分类器的质量。在在线问答服务中,如果简单问题占比高,早期退出能显著降低延迟和提升吞吐;但如果问题普遍复杂,则收益有限。理解这些边界,才能在实际系统中做出正确的权衡。