水印不再绑定分词器:改在UTF-8字节上定义,换掉分词器后检出率不变
核心概要
大模型文本水印的检测此前依赖生成方的分词器或语义嵌入管线,而文本本身并不透露用了哪一种,因此未知来源的文本难以核验。ByteMark把水印信号定义在已发布文本的UTF-8字节流上,参与模型用同一公开规范和密钥嵌入,检测方只凭文本和密钥即可验证。实验显示,替换检测端的分词器或嵌入模型后,词元级与句子级基线的检出率大幅下降,而ByteMark的检出率保持不变,并在模型接力续写和参与模型改写重嵌时仍可检出。
深度剖析
水印检测可以只依赖已发布文本的字节、密钥和一份公开规范,不再需要知道生成方用了哪个分词器或嵌入模型。 此前的词元级水印把信号定义在词元ID上,句子级水印把信号定义在语义嵌入空间里,同一段文本在不同分词器下会得到不同的词元ID和切分,检测端必须持有生成方的那套表示。 在保持生成文本不变、只替换检测端分词器的对照中,各词元级基线用自己的分词器都能检出,换成替代分词器后检测基本失效,而ByteMark在三个数据集上的检出率不变。
一个固定检测器可以跨模型边界读取同一段文本里的水印,参与模型改写并重新嵌入后仍能检出。 词元级检测器用单一固定分词器读全文,只能读到用该分词器写出的那一段,在其余段落上信号接近零。 在Pythia-1.4B、Qwen2.5-1.5B和OpenLLaMA-3B轮流续写同一段C4文本的接力实验中,ByteMark的局部信号曲线在三段之间保持水平、在两次模型切换处没有可见变化;Parrot、DIPPER和Mistral-7B-Instruct改写并重嵌时,AUROC分别为0.9985、0.9998和0.9888。
生成开销接近未加水印的生成,因为每个输出词元只采样一次。 句子级水印为每个保留句子生成多个候选再丢弃其余,SimMark每保留一个词元要生成119.36个候选词元,SemStamp为35.38个。 在同一批50条C4请求、OpenLLaMA-3B、批大小为1的测量中,未加水印生成63.82词元/秒,ByteMark为62.19词元/秒(相对97.4%),而SemStamp为1.73、k-SemStamp为6.17、SimMark为0.49、AliMark为18.22词元/秒。
启示与展望
这套方案面向需要核验未知来源文本的读者或代其运行检测的服务:检测方持有文本和密钥,不持有生成模型或其组件。实验覆盖C4、Wikipedia和LFQA三个语料,生成模型为Pythia-1.4B、Qwen2.5-1.5B和OpenLLaMA-3B,词元级比较每个条件500条生成请求、每个领域1000条人类文本。检测阈值在留出的人类文本上按1%目标超限率标定。实现与评测代码将在清理后开源发布。
非参与模型改写会改变字节流,从而削弱ByteMark信号,这与词元级水印面临的问题相同;是否存在一个固定且公开的语义表示能在保持仅凭文本、密钥和公开规范检测的同时改善改写鲁棒性,仍是开放问题。密钥保密是前提,一个密钥服务所有参与模型意味着部署越广、持有方越多,密钥一旦丢失会同时暴露所有参与方的水印。文档级统计量在水印条件下的闭式刻画还需要对字节分布和跨解码步依赖追加假设,这部分分析不在当前范围内。
