水印
有两种机制都叫“水印”,而人们总把它们混起来。本章在你眼前各造一个,先在文本里,再在图片里,还会当着你的面把第二个毁掉,让人看到它真正的限度。
一切都在你的浏览器里计算。文本由一个在这台设备上学出来的玩具模型生成,图片画在本地的 canvas 上,它藏起来的那条信息从不发往任何地方。打开浏览器的“网络”标签页,再动手玩这个演示:不会有任何请求发出去。
两种被混起来的机制
“水印”这个词指的是两种很不一样的机制,而这种混淆代价不小。第一种在文件的元数据里声明它的来源,像贴在上面的一张标签。第二种悄悄改动内容本身,像织进布里的一道纹理。一个文件可能带前者、带后者、两者都带,或者两者都不带。
本章在你眼前造出第二种机制,先在文本里,再在图片里,因为它是算出来的。第一种算不出来:它要么被声明,要么没被声明。接着是两者的比较,说清各自能扛过什么,以及两者都替代不了什么。
一个加在文本上的绿名单水印
本站的玩具模型每生成一个词,都会算出一张可能候选的清单。一个秘密密钥,结合前一个词,把这张清单的一半指定为“绿色”。然后抽取被轻轻推向这一半。设定密钥和这股推力的强度,再生成一段文本:产出的每个词都会带上密钥在那一刻给它的标签显示出来。
生成的文本会逐词显示在这里,带上密钥给它的颜色。
上面这段文本可以用同一个密钥来测量,任何别的文本也一样:粘一段进来,或者改一改刚刚出现的那段,然后测量。结果从来不是“有水印”或“没水印”:它是一个比例,要拿去和没有水印时它该是多少作比较。
落在绿名单里的词所占的比例,以及它的解读,都会显示在这里。
一个藏在图片最低位比特里的水印
一张数字图片就是一格格的数字,每个像素的每个颜色通道一个,取值从零到二百五十五。把其中一个数字的最低位比特改掉,最多让它的数值变化一:什么都看不出来。这个演示会画一张图片,把一条信息正好藏进这些比特里,再把它找回来,然后让你去毁掉它。
生成出来的图片,以及从上面找回来的信息,都会显示在这里。
现在选一个再普通不过的操作,就是那种用即时通讯发送或在社交网络上分享时会自动做的操作,然后看看这条信息还在不在。
经过所选操作之后的图片,以及那条信息还剩下什么,都会显示在这里。
方法
绿名单水印,一步一步
- 对当前这个词,取出可能候选的清单和它们的概率,和下一个词那一章完全一样。
- 把秘密密钥和紧挨在前面的那个词结合起来,再用一个哈希函数从中得出一个零到一之间的数。小于二分之一,这个候选是绿的;大于二分之一,它是红的。每一步都有一半词表是绿的,但从来不是同一半:它随前一个词而变。
- 在温度和抽取之前,给每个绿色候选的 logit 加上所选的强度:这就是玩具模型在正是这一步上接受的那个偏置。
- 在这个修正过的分布里正常抽取。现在一个绿色词被选中的机会更大,但没有任何词变成不可能;而当这一步的所有候选颜色相同时,这个偏置什么也改变不了,因为没有可分的选择。
- 对下一个词重复一遍:前一个词变了,所以绿名单也变了。
- 要测量一段文本,就用同一个密钥,对它的每个词重做第二步的计算,再数出绿色词的比例。在用于生成的那个密钥之下,这个比例明显超过一半;在随便一段文本上,或者换一个密钥,它就停在一半左右。
- 用一个标准化差值的计算,把测出的这个比例和期望的一半作比较:差值越大,观察到的这个比例在一段没有加过这个水印的文本里就越罕见。这个数字永远不会变成一个判决。
把一条信息藏进最低位比特,一步一步
- 画出图片并读它的像素:每个像素三个从零到二百五十五的数字,每个颜色通道一个。
- 把信息的长度(按字节数)写进最前面可用的三十二个比特。
- 把信息的每个字节接着写进去,每个字节八个比特。
- 对每一个要写入的比特,取颜色通道格子里的下一个数字,抹掉它的最低位比特,把信息的那个比特放进去。这个数字最多变化一,而量程是二百五十五:任何眼睛都看不出差别。
- 要找回信息,就按同样的顺序把这些比特再读一遍,先还原出长度,再还原出各个字节,然后转成文字。
- 任何重新计算像素的操作,无论是重新压缩还是改尺寸,都会连它们的最低位比特一起重算,完全不管它原来承载了什么。只有当这个数值一个比特都不差地保持原样时,信息才活得下来。
标记内容的两种方式
上面两个试验,正好给本章要区分的两种机制各自安上了合适的位置。
声明出来的出处:读得懂,也很脆
一份公开的技术规范,C2PA,规定了怎样把关于一个文件来源和历史的、带签名的信息附在文件上:哪台设备或哪个软件生成了它,它经过了哪些修改。能读这份规范的应用会把这些信息明文显示出来,名字叫 Content Credentials。这是一张标签,字面意义上的标签:它说这个文件从哪里来,却不改动文件本身的任何东西。
标签会掉。规范自己也承认这一点:它的出处信息可以和文件分离,因此一次简单的截屏或一次文件重新导出就可能把它弄丢。一次会重新压缩图片的即时通讯发送,一次只复制屏幕上显示像素的截屏,一次导出到忽略这块元数据的格式:这些动作没有一个算攻击,而每一个都足以抹掉出处,还不留下任何抹掉过的痕迹。
这里就是最常见的误解:一张没有声明出处的图片,不是一张在隐藏什么的图片。它也许只是一张标签在路上掉了的图片,而这件事发生在几乎所有流传的图片身上。
统计水印:不显眼,更耐折腾,但不是无敌
统计水印不是加在内容旁边:它改动内容本身,改得极小,而且分散开。在文本里,是把抽取推向一份由密钥挑出的词表,就像上面那个演示刚刚做的那样。在图片里,是以一种可以比这里为了讲得清而采用的最低位比特隐蔽得多的方式,去改动像素。
这种性质上的差别,把耐折腾程度整个改变了。一张元数据标签一个动作就没了,因为它始终只是数据旁边的数据。一个统计水印必须在内容本身里被拆掉:用手把一段文本重抄一遍,不会改变它的绿名单;而一张图片有时能带着水印,扛过那些毫不费力就能抹掉它出处的操作。
这份耐力有两个限度,而两个限度上面都刚刚看到了。第一个:水印的前提是制造方在生成的那一刻就加上了它。没有任何东西迫使一个服务这样做,而如果内容是不带水印流传出来的,事后也没有任何东西能证明什么。第二个:水印也不是无敌的。一张被造出来的图片那一章引用的一项工作表明,一种先给图片加噪声再重建的再生成攻击,能在保住视觉质量的同时去掉像素层面的不可见水印。你刚刚在上面选的那次重新压缩或改尺寸,就是它的初级版本,施加在一个不同的机制上,但用的是同一个道理:重算像素,就会抹掉藏在里面的东西。
- 统计水印改动的是内容本身,所以它会跟着副本一起走,而元数据标签跟不上。
- 它的检测给出的是一个比例和一个测出的差值,从来不是一个用来下结论的词。
- 这一类水印确实已经在实际部署,并且发表、经过同行评议。
- 它不会自己出现:没有制造方选择施加它,就没有任何东西可检测。
- 它不是什么都扛得住:一次足够重的操作,哪怕很日常,也能把它干掉。
- 它从不说一份内容是真的还是假的,只说它是否带着某一次生成留下的标记。
研究测出了什么
一份公开的技术规范定义了怎样把关于文件来源和修改历史的、可核验且带签名的信息附在文件上,并且它自己也承认这些信息可以和文件分离,因此会因为一次截屏或一次重新导出而丢失,而且没有任何东西提示这次丢失。
在生成的文本里插入一个肉眼看不见的统计水印,做法是每一步都略微偏向某些词,然后用一个统计检验把它检出来:这正是上面那个演示刚刚跑过的机制。这一类机制中的一个,已经被整合进一个真实服务的采样过程,并在《自然》期刊上发表、经过同行评议:本页为教学目的作了简化的东西,在别处是以完全不同的规模部署的。
要守住的那个动作
面对一个来源要紧的文件,有两种条件反射太常被用来代替判断。第一种:去找一个声明出来的出处,找不到就断定这个文件在隐藏什么。规范本身说的恰恰相反:没有出处是几乎所有流传文件的正常状态,不是一个证据。第二种:向一个检测工具索取一个判决,不管对象是文本还是图片。一项针对十四款文本检测工具(包括在教育领域使用的工具)的独立评测得出结论:没有一款同时做到可靠和精确;其中使用最广的一款,制造方本人在上线六个月后就撤掉了自己的工具,理由是可靠率太低,没有实用价值。
上面那个绿名单水印的演示,对自己也用同一份谨慎:它的结果是一个比例和一个标准化差值,从来不是一个用来下结论的词。面对一份来源真正要紧的内容,有用的问题始终是同一个:谁最先发布的,哪一天,别处有没有相互印证。一条技术线索把一个疑问记录下来,它永远不会替代这个疑问。
想再往下走
本章放在一边的那种机制,也就是发现一次生成无意留下的痕迹、而不是刻意加上的水印,讲在一张被造出来的图片和一段被造出来的声音两章。被文本水印偏动的那次抽取,在下一个词那一章有详细解释。这些工具全都不够用的情形,汇集在什么时候不要用它。本站所有演示都汇集在演示页面,课程目录在理解页面。
来源
- Content Credentials: C2PA Technical Specification (version 2.4) Coalition for Content Provenance and Authenticity (C2PA),2026 年。该文确立:存在一份公开的技术规范,定义了怎样把关于一个文件来源和修改历史的、可核验且带签名的信息附在文件上。
- C2PA Frequently Asked Questions Coalition for Content Provenance and Authenticity (C2PA),2026 年。该文确立:C2PA 标准自己承认它的出处清单可以和文件分离,因此这项信息会因为一次简单的截屏或一次文件重新导出而丢失。
- A Watermark for Large Language Models John Kirchenbauer, Jonas Geiping, Yuxin Wen, Jonathan Katz, Ian Miers, Tom Goldstein,2023 年。该文确立:可以在生成的文本里插入一个人眼看不见的统计水印,做法是每一步都略微偏向某些词,之后再用一个统计检验把它检出来。
- Scalable watermarking for identifying large language model outputs Sumanth Dathathri, Abigail See, Sumedh Ghaisas, Po-Sen Huang, Rob McAdam, Johannes Welbl 等,2024 年。该文确立:SynthID-Text,一个整合进生产环境所用推测采样的统计水印,已在《自然》期刊发表并经过同行评议(第 634 卷,第 818-823 页)。
- Testing of detection tools for AI-generated text Debora Weber-Wulff, Alla Anohina-Naumeca, Sonja Bjelobaba, Tomas Foltynek, Jean Guerrero-Dib, Olumide Popoola, Petr Sigut, Lorna Waddington,2023 年。该文确立:一项针对十四款 AI 生成文本检测工具(包括教育领域使用的商业工具)的独立评测得出结论:没有一款同时做到可靠和精确。
- OpenAI scuttles AI-written text detector over ‘low rate of accuracy’ Devin Coldewey / TechCrunch,引述 OpenAI,2023 年。该文确立:OpenAI 在自己的 AI 生成文本检测工具上线六个月后就把它撤掉了,理由由它自己给出:可靠率太低,没有实用价值。