掩码不是模型:审计注意力、状态空间与混合序列模型中的前缀不变性 The Mask Is Not the Model: Auditing Prefix Invariance in Attention, State-Space, and Hybrid Sequence Models
两次前向传播即可定位自回归模型的因果泄露层,并在Zamba2与Nemotron-H中发现真实缺陷
前置知识
前缀不变性(Prefix Invariance)
自回归模型必须满足的结构约束:对任意输入序列 $x$,把位置 $t$ 之后的 token 换成任何内容,位置 $t$ 及之前的所有层表示 $h^\ell(x)[t]$ 都必须完全不变。这是教师强制训练、困惑度评估、KV 缓存复用、投机解码等一切实践隐含依赖的因果性定义。
本文的全部方法就是把这一性质变成可执行的测试,理解它的精确定义才能理解审计为何只需要两次前向传播。
因果注意力掩码
Decoder-only Transformer 的自注意力通过上三角负无穷掩码禁止每个位置关注未来 token,这是因果性在注意力算子上的显式实现。传统工程实践把'检查掩码是否正确设置'当作模型因果正确性的事实审计标准。
论文标题'掩码不是模型'正是在反驳这一默认做法:因果性是整个计算图的性质,泄露可以经由扫描、聚合或归一化发生,而掩码属性完全正确——实验中掩码检查对 96 个注入故障的检出率为 0/96。
状态空间模型与分块扫描(chunked scan)
Mamba-2 类模型用线性递归替代注意力,为并行计算把序列切成定长块(chunk),通过跨块递归传递状态:$decay\_chunk[b,h,i,j]$ 是下三角矩阵($j \le i$,$i$ 为输出块、$j$ 为输入块),跨块递归必须沿输入块轴 $j$ 归约。transformers 库中每个混合架构都有独立的扫描实现。
本文发现的真实缺陷正是 Zamba2 与 Nemotron-H 的分块扫描沿错误的输出块轴 $i$ 归约,导致跨块边界处的因果泄露,是全篇最有分量的实证结果。
蜕变测试(Metamorphic Testing)
一种不需要标注答案的软件测试哲学:不验证单个输出的对错,而是验证输入按某种关系变换后,输出必须保持的对应关系(蜕变关系)。DeepXplore、DeepTest 等框架曾用它暴露深度学习系统缺陷。
本文把自回归因果性识别为一个天然的蜕变关系——前缀表示对严格未来的扰动保持不变——oracle 内在于模型定义本身,无需任何训练数据或标签,这决定了该方法可以零成本例行化。
阳性对照(Positive Control)
实验科学中的仪器活性检查:向被测系统注入一个已知应触发响应的故障,确认检测器确实能报出来。本文的协议是把 8 种故障模式注入到第 1、$\lfloor L/2 \rfloor$、$L-2$ 层共 24 次,要求全部被精确定位,才允许对同一检查点报告 CLEAN 判定。
论文最重要的方法学教训:3 个 Falcon-H1 检查点返回全零 delta 却连注入的 $\varepsilon=1.0$ 强故障都测不到(模型加载后对输入完全无响应),没有阳性对照就会发表 3 个假干净判定。
研究动机
自回归语言模型的一切用途——教师强制训练、困惑度评估、增量解码、KV 缓存复用、投机解码——都隐含假设位置 $t$ 的输出只依赖位置 $\le t$ 的输入,但模型发布时只例行报告参数量、上下文长度、训练 token 数和基准分数,从不提供因果正确性的证据。传统做法把检查注意力掩码当作事实审计,而现代架构在同一堆栈中混用局部注意力、稀疏注意力、线性递归、状态空间扫描、卷积等异构混合器,显式掩码只覆盖少数层,甚至完全缺席(如 mamba-130m-hf、rwkv-6-world-1b6 全栈无掩码可查)。更危险的是泄露是一种静默失败:未来信息渗入会让下一词预测任务变容易,训练损失和验证困惑度不升反降、基准分数更好看,直到自由生成或部署时才暴露,而那时架构对比和性能结论可能已被污染。作者在内部开发混合模型堆栈时连续遭遇三个不同的因果故障(双重输出偏移、自定义注意力把因果邻域写成对称邻域、差分注意力在时序聚合之后才做映射相减),每个都违反同一性质,却都靠大量手工调试才发现,且常规训练遥测毫无异常。
本文的目标是本文要把'模型是否满足因果约束'从一个需要逐架构推理的难题,变成一个可以例行运行的廉价检查。具体目标有四层:其一,形式化前缀不变性这一性质,并给出仅需两次前向传播、无训练、无梯度、无标签、无加速器的审计方法,不仅回答是否泄露,还要定位第一个出问题的层;其二,论证掩码检查在原理上不完备——因果性是整个计算图的性质而非任何单一算子的属性;其三,从自身的两次审计失败中提炼出两条强制性规范——干净判定必须在同一加载检查点上通过阳性对照、审计序列长度必须超过模型的 chunk/窗口/核参数;其四,倡议架构发布附带因果正确性证书(逐层最大前缀 delta、阈值、精度、序列长度与内部参数的关系、阳性对照结果),让它与参数量一样成为例行报告项。
与已有工作不同的是,与本文最接近的已有实践各有缺口:logits 扰动检查能检出泄露但完全无法定位(96 个故障 0/96 定位);洗牌后缀困惑度对最常见的一类 off-by-one 泄露结构性失明;缓存一致性检查会在正确模型上误报;梯度定位法能力相当但需要反向传播且要求路径上所有算子可微。本文的独特切入有三点。第一,把蜕变测试思想用到自回归定义内在的不变关系上,oracle 不依赖任何任务标签,且输出侧测试对混合器类型完全无感知——同一份代码对掩码注意力、无掩码状态空间扫描、线性递归和卷积混合都给出判定。第二,逐层 hook 把'是否泄露'升级为'哪一层泄露',这才是工程上可行动的交付物。第三,方法与实战闭环:先对 transformers 5.7.0 的分块扫描代码做静态普查做盲预测,再用动态审计验证,最终在两个已发布的 1B–8B 模型中发现并修复真实因果缺陷,这是以往纯方法论文没有做到的。
核心方法
方法的直觉极其朴素:只把输入的最后一个 token 换掉,前面所有位置的表示在任何一层都必须一个比特都不变;只要有一层变了就是泄露,第一个超出阈值的层就是病灶。技术路线:构造两条仅末位不同的随机 token 序列,禁用缓存各做一次前向,在全部 $L$ 层挂 forward hook 捕获输出,对每层计算 $\Delta_\ell = \max |h_1^\ell[0:T-1] - h_2^\ell[0:T-1]|$,$\Delta_\ell > \tau$ 的最小层号即泄露层。四个设计选择各有理由:逐层 hook 而非最终 logits——logits 已混合所有层只能回答‘是否’,定位到层才是交付物;比较时排除末位——那是合法的扰动本身;禁用缓存——避免两次前向走不同代码路径;确定性单精度评估——正确实现下 $\Delta_\ell$ 不是‘很小’而是精确为零,任何 $\tau \in [10^{-6}, 10^{-3}]$ 都给出相同判定。整个方法一页纸写完,135M 模型在 CPU 上单次审计仅需 0.1–0.5 秒。
核心论点是:因果性是图级性质,只能通过计算图整体的输入输出行为来检验,而不能靠检查某个算子的属性。静态掩码检查对 96 个注入故障的检出率为 0/96,原因是结构性的——全部 8 类故障都注入在层的输出上,掩码属性始终正确设置;在 mamba-130m-hf 上这个检查甚至没有检查对象。本文把蜕变测试的关系选为'前缀表示对严格未来扰动的不变性',oracle 内在于自回归模型的定义,这使其区别于所有依赖外部参考的任务型测试。第二个关键想法是把精确零当作可用的杠杆:因为干净 delta 在任何架构上都位级精确为零(四个公开检查点 torch.equal 全部通过),阈值 $\tau$ 可以压到 $10^{-14}$ 而不产生假阳性,灵敏度提升三到四个数量级;这正是与缓存一致性检查(B6)的本质区别——后者在干净模型上有 $1.850 \times 10^{-4}$ 的底噪,必须按模型按精度重新校准阈值。第三个关键想法是定位即交付:注入实验表明梯度法虽然定位能力相同,但需要反向传播、完整激活图和全路径可微,而本文两次 no-grad 前向即可,对量化权重和自定义核等不可微路径免疫。
方法步骤详情
流程:输入模型 $f$、层数 $L$、长度 $T$、阈值 $\tau$;采样随机序列 $x_1$,复制并把末位换成不同 token 得 $x_2$;每层挂 forward hook 捕获输出 $h^\ell \in \mathbb{R}^{T \times d}$;禁用缓存分别执行 $h_1 = f(x_1)$ 与 $h_2 = f(x_2)$;每层计算 $\Delta_\ell = \max_{t \tau\}$,返回 (LEAK, $\ell^*$) 或 (CLEAN)。配套两条规范:阳性对照门——把 8 种故障模式注入第 1、$\lfloor L/2 \rfloor$、$L-2$ 层共 24 次($\varepsilon = 1.0$),仅当 24/24 精确定位才允许报告 CLEAN;长度规则——$T$ 必须超过模型的 chunk、窗口和核参数,否则扫描退化为单块、滑窗退化为全注意力,整类缺陷不可观测。
技术新颖性
与六种现有做法的系统对比精确划出新颖性边界。B1 logits 扰动 96/96 检出但 0/96 定位;B2 静态掩码检查 0/96 检出;B3 洗牌后缀困惑度 71/96 检出,且对半径-1 的局部泄露结构性失明——所有失误案例的损失差精确为 0.000e+00 而非偏小,任何阈值都救不回来,因为它洗牌的位置永远碰不到半径-1 泄露能触及的区域;B4 未来 token 重采样检出全部但不定位;B5 梯度法 96/96 检出且 96/96 定位,与本文完全打平——作者坦率定位其为‘定位能力相同、成本更高’的有效替代:需要反向传播和完整激活图,要求路径上每个算子可微且有梯度实现(排除量化权重与多个自定义核),且零梯度不能证明无依赖(饱和非线性可传信息而梯度为零);B6 缓存一致性在干净模型上误报 $1.850 \times 10^{-4}$。因此本文的增量不在检测而在三处:层定位、两次 no-grad 前向的成本、对不可微路径的适用性。再叠加静态代码普查做出可证伪盲预测、动态审计证实、补丁使 delta 精确归零的方法学闭环,这在模型审计文献中是新的。
实验结果
注入实验:8 检查点 × 8 故障模式 × 3 深度 = 192 次,192/192 精确定位,五个架构族。基线对比:本文检出与定位均 96/96;logits 扰动(B1)96/96 检出、0/96 定位;掩码检查(B2)0/96;洗牌后缀(B3)71/96;缓存一致性(B6)误报 $1.850 \times 10^{-4}$。负控制:四个干净检查点零差异。真实缺陷:静态普查 5.7.0 版分块扫描代码,发现 zamba2 与 nemotron_h 的跨块递归归约轴写反(三行逐字节相同);动态证实 Zamba2-1.2B 在 chunk=256 起漏($\max|\Delta| = 1.124 \times 10^{-2}$),Nemotron-H-8B 在 chunk=128($T=192$ 时 $7.4 \times 10^{-1}$),两行补丁使 delta 精确归零,随机权重亦复现。判别器:$\varepsilon$ 扫描下仅 Zamba2 爬升(斜率 $0.63 \pm 0.07$),据此拒绝平坦候选。自有 Aether-7B:49 层干净,16/16 阳性对照定位。
局限与改进
作者列出 12 条局限并按影响排序。最重三条:两个泄露模型共享逐字节相同的代码,是有谱系的存在性证明而非生态基率;检测能力不超越已有 logits 检查,贡献仅在定位;梯度法 B5 定位能力完全持平。其余:普查约 20 个检查点、非随机抽样,规模不提供保护(8B 泄漏而 9B 干净);Hymba、Phi-4-mini-flash、StripedHyena 等需要 GPU-only 编译核的模型在 CPU 上无法审计,而自定义核恰是更可能有 bug 的地方;部分‘一致实现干净’的判定因层返回签名不接受注入(如 Falcon-H1)只能算临时结论;LFM2-1.2B 定位下限异常无机制解释——$\varepsilon=1.0$ 的 24 次注入全部精确定位,但 $\varepsilon \le 10^{-1}$ 的扫描点一致报告下游第 11 层而非第 8 层;初始普查单长度、单种子、单批大小,一个未考察维度就藏了真实缺陷;只覆盖静态结构故障。我的补充:方法要求白盒加载权重并逐层挂钩子,对仅提供 API 的闭源模型不可用;精确零依赖确定性算术,非确定性 CUDA 核可能破坏该前提。
独立分析的弱点
第一,白盒依赖:审计需加载检查点、逐层注册 hook,在 Hugging Face 生态内容易,但对仅暴露 API 的闭源模型完全不可用;改进方向是基于输出的黑盒近似定位,用前缀扰动的输出差异统计特征推断泄露深度。第二,精确零前提是确定性算术:论文全部结果在 CPU 下取得,生产环境常用 fused 核、原子加法和并发归约,干净 delta 可能变成非零底噪,阈值鲁棒性论证随之失效;改进方向是在非确定性后端上改用多次重复加统计阈值。第三,注入框架不通用:Falcon-H1 等架构的层返回签名不接受故障注入,阳性对照无法运行,干净判定只能标为临时;改进方向是为每类架构写注入适配器或改在嵌入层等通用位点注入。第四,只审计了 PyTorch 参考路径,mamba_ssm/causal_conv1d 等 fused 核路径完全未测——而生产推理恰恰走 fused 路径;改进方向是对核实现做等价差分审计,或在 CI 中同时跑两条路径。第五,静态普查靠人工读代码,无法规模化;改进方向是开发 AST 级因果性 lint,自动比对社区实现与参考实现的归约轴、掩码方向等模式。
未来方向
作者明确提出两个方向:一是把‘因果正确性证书’确立为发布规范——附带逐层最大前缀 delta、阈值、精度、序列长度相对 chunk/窗口/核参数的关系、以及同一检查点上的阳性对照结果,让因果审计像参数量一样例行化;二是为每类架构构建注入适配器,使阳性对照门覆盖目前无法注入的检查点,把临时干净判定升级为门控判定。基于本文成果可自然延伸:把审计做成 transformers 或 HF Hub 的 CI 步骤,架构改动自动触发两次前向检查;把静态代码普查自动化为因果性分析工具,纳入新模型合并审查;扩展到作者未测的维度——训练模式随机性、特定批形状、分布式与分片执行路径,既然序列长度一个维度就藏了一个缺陷,其余维度同样值得排查;审计 fused kernel 实现,弥合参考路径有缺陷而生产路径未测的割裂;为数据依赖型泄露设计搜索策略,可能需要模糊测试式探索;在数百上千个检查点上大规模运行审计以估计因果缺陷的真实基率,把存在性证明推进为比率陈述;并把方法推广到语音、视觉、时间序列等其他自回归领域。
复现评估
论文复现友好度非常高:方法一页纸写尽、伪代码完整,不依赖专有组件;所有实验数字(含失败案例与被拒绝的候选发现)完整公开。审计对象全是公开检查点:SmolLM2-135M、Qwen3-0.6B、pythia-1.4b、mamba-130m-hf、rwkv-6-world-1b6 等八个,以及缺陷模型 Zamba2-1.2B 和 Nemotron-H-8B。算力门槛极低:普查和注入套件在 64 线程 CPU、251GB 内存上完成,测试不需要加速器,仅 7B–8B 审计因权重内存需要单卡。两个缺陷已上游报告(transformers issue #47475、PR #47476),论文给出完整两行修复,可直接验证补丁归零。注意点:重现缺陷必须在没有 mamba_ssm、causal_conv1d 的环境(如纯 CPU)运行参考 PyTorch 路径;加载自定义架构需 trust_remote_code=True,Falcon-H1 加载失败需按论文的 from_config 方案绕过。论文提到的两个审计脚本未明说是否开源。总体难度:核心审计一个下午可复现,完整基线对比约数天。
论文图表