TextSeal2:推测解码下保住检测率的无失真水印

ppylox
·11/2/2026·0 阅读

一句话结论

推测解码会把水印信号洗掉——被拒绝的草稿 token 会被重采样成不带水印的 token。TextSeal2 让这些替换 token 继续带同一把密钥的水印,同时保持接受率不变、输出分布不变。论文见 TextSeal2。

方法要点

先交代前代的问题。TextSeal 在 Gumbel-max 采样里用抛硬币的方式把每个 token 路由到两把密钥中的一把,以此恢复输出多样性。检测端不知道硬币落在哪一面,只能把两把密钥的分数平均,信号被摊薄。

TextSeal2 换了做法:不再二选一,而是把两把或更多密钥合并成一把虚拟密钥,再用 AutoMark 的高斯 copula 把这把虚拟密钥与新鲜噪声耦合起来。采样仍然是一次带噪声的取最大值,但密钥空间被折叠了,检测端不需要猜用的是哪把密钥,也就没有平均带来的稀释。按作者的说法,任意数量的密钥——包括公开共享的密钥——都能以这种方式合并而不稀释检测。

推测解码下的处理是第二个设计点。草稿模型先给出若干 token,目标模型验证。TextSeal2 的验证不是重新采样,而是在草稿那几轮竞赛的剩余量上再跑一次指数竞赛。指数分布无记忆,这次竞赛在统计上等价于块验证,因此最终输出严格服从目标模型——这是“无失真”三个字的来源,也是它敢说不改变接受率的原因。

伪代码示意(非原文公式):

# 采样端:合并密钥,用高斯 copula 耦合新鲜噪声
def watermarked_sample(logits, keys, rng):
    virtual_key = merge_keys(keys)          # 两把或更多 -> 一把虚拟密钥
    u = gaussian_copula(virtual_key, rng)   # AutoMark 的高斯 copula
    noise = inverse_cdf(u)
    return argmax(logits + noise)           # 仍是 Gumbel-max 形式

# 推测解码验证端:在草稿竞赛的剩余量上再跑一次指数竞赛
def verify_draft(draft_race, target_logits, keys, rng):
    leftovers = draft_race.leftovers        # 草稿竞赛的剩余量
    extra = exponential_race(leftovers, merge_keys(keys), rng)
    return extra.accept_or_resample()       # 无记忆性 => 等价块验证

两个设计合起来的效果是:水印信号不靠后处理 logits 换取,采样路径不变;推测解码的加速也不用关掉。

关键数字

论文在三个 LLM 上评估。摘要给出的检测结果如下,假阳性率固定为 10^-3:

场景 指标 对比基线 结果
等输出多样性,100 token 回答 检测出的回答比例 TextSeal 多 8 到 22 个百分点
等输出多样性,100 token 回答 检测出的回答比例 textGrain 相当,且不需要 post-logits 优化
推测解码,200 token 回答,相同接受率 检测出的回答比例 TextSeal 多 18 个百分点
推测解码,200 token 回答,相同接受率 检测出的回答比例 textGrain 多 22 个百分点

两点值得注意。第一,100 token 档的对比前提是“等输出多样性”,也就是说它不是靠牺牲多样性换检测率。第二,200 token 档的对比前提是“相同接受率”,也就是推测解码的加速没有被水印拖慢。作者另外声明输出多样性与无水印模型一致,且没有可测量的推理延迟增加——但摘要没给延迟的具体数值。

局限与前提

  • 评估规模有限。摘要只说在三个 LLM 上评估,没有覆盖更多模型家族、语言或更长的文本。
  • 推测解码路径有实现成本。验证要在草稿竞赛的剩余量上多跑一次指数竞赛,这要求水印实现能拿到草稿阶段的竞赛状态;换一套推测解码实现,接线方式要重做。
  • “无可测延迟”是定性表述。摘要没有给吞吐或单 token 延迟数字,生产环境能否接受需要自己压测。
  • 密钥管理仍需自行设计。作者说公开共享密钥合并不稀释检测,但没说多租户、密钥轮换该怎么做。
  • 摘要未覆盖鲁棒性。改写、翻译、截断等常见攻击下的检测率,摘要里没有结果。
  • “无失真”是分布层面的声明。摘要没给与无水印基线的具体分布距离指标。

能不能用

论文 comments 里给了代码链接(摘要页标注 Code),但摘要未提及是否发布模型权重——水印方案本身不引入新权重,检测端只需要密钥和分词器。本地复现需要:一个支持推测解码的推理栈、目标模型与草稿模型、一套密钥分发机制,以及检测端的打分脚本。最小验证路径是先跑 100 token 档的检测率对比,确认在等多样性条件下能复现 8 到 22 个百分点的差距,再压测推测解码路径的接受率是否真的不变。

参考来源

相关文章