在巴黎蒙马特高地的一间画室里,画家老周刚完成新作《蓝鸟》。他没有急着装裱,而是取出特制颜料笔,在画布背面的夹层里写下一行只有自己能读懂的暗号,又在右下角的一笔羽毛里藏了一个微小的符号。三个月后,市场上出现了一幅几乎一模一样的《蓝鸟》。老周不慌不忙地掏出红外灯,在仿品上照出了那个亲手埋下的暗号——赝品不攻自破。 这个场景,每天都在 AI 世界里重演。大模型是当代最昂贵的“画作”:训练一个千亿参数模型要烧掉数百万美元。当有人把你的模型偷走、换个壳重新上线,你怎样才能证明“这幅画是我画的”?模型水印与指纹技术,就是老周手里的红外灯和特制颜料笔。它把一段不可见的签名嵌入模型内部,或从模型的言行举止中提炼出独有的“笔迹”;一旦模型被非法复制,版权所有者就能提取这些标记,完成举证。

岗位关联

对 AI 从业者而言,模型水印与指纹是 AI 资产保护的“最后一道防线”:在模型即服务的商业生态里,它决定了你的心血被抄袭时,能否拿出铁证完成版权维权。

目录
  1. 可视化演示
  2. 水印与指纹:两种身份标识
  3. 白盒水印:签在画布底层
  4. 黑盒水印:只有我知道的暗号
  5. 模型指纹:学不来的笔触
  6. 鲁棒性:被临摹后还在吗
  7. 版权举证:从画室到法庭
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

交互展示模型水印的嵌入过程、提取验证及技程攻击下的鲁棒性,揭示AI版权保护核心机制。

本节配有交互动效(进入视口后自动加载,约 3KB)。

水印嵌入过程 权重调整嵌入w 参数把内关键存储 L=Ltask+#λLwm 训练时同时优化任务与水印

水印与指纹:两种身份标识

老周防伪有两手准备:一手是主动藏进画里的暗号,另一手是自己画了几十年练出来的独特笔触。前者叫水印,后者叫指纹——一个是“埋”进去的,一个是“长”出来的。这正好对照模型世界里的两种版权标识技术。

在模型世界里,水印是训练或微调时主动往参数、输出行为里嵌入的标识,提取它需要事先知道嵌在哪里;指纹则是模型在无数次推理中自然流露的行为特征,不需要预先埋设,任何人都可以采集两段“行为样本”做比对。

水印按可见性分为白盒与黑盒:白盒场景下你能拿到模型权重,直接把签名写进参数;黑盒场景下你只能通过 API 查询,把暗号藏在输入与输出的对应关系里。指纹则把模型当成“证人”,通过大量查询对比其决策行为,判断它是否从自家模型蒸馏而来。两者常搭配使用:水印负责主动举证,指纹负责被动溯源。

Ltotal(θ)=Ltask(θ)+λ⋅Lwm(θ)\displaystyle \mathcal{L}_{\text{total}}(\theta) = \mathcal{L}_{\text{task}}(\theta) + \lambda \cdot \mathcal{L}_{\text{wm}}(\theta)

1. 总损失:最终优化的目标函数,控制模型既要学好任务又要带上水印。

Ltotal(θ)\mathcal{L}_{\text{total}}(\theta)

2. 任务损失:衡量模型在原始任务上预测与真实标签的差距,保证“画的还是那只鸟”。

Ltask(θ)\mathcal{L}_{\text{task}}(\theta)

3. 权重系数:平衡两个损失的比率,λ 越大水印越强,但任务精度受损也越大。

λ\lambda

4. 水印损失:推动模型在指定位置形成水印特征,通常是触发器输出的交叉熵。

Lwm(θ)\mathcal{L}_{\text{wm}}(\theta)

老周既会埋暗号也会认笔迹,双管齐下。现实中模型安全团队也常让水印与指纹并行:水印用来主动亮明身份,指纹用来事后追溯血缘。

白盒水印:签在画布底层

老周把签名藏在画布的最底层——只有掀开表层颜料、看到整块画布结构的人才能找到它。这在模型里对应白盒场景:你拥有完整权重,可以“掀开”模型的一切内部细节。

白盒水印最常见的做法是参数扰动:在训练好的权重张量上叠加一个精心设计的水印矩阵,同时用正则化约束,不让这层“签名”破坏画面本身。因为深度模型的参数空间存在大量冗余,稍加修改并不会明显改变任务表现。

提取时只需对比当前权重与原始权重的差异,就能还原签名。有的方法把签名嵌入激活值统计量或特定层的梯度模式中,原理相通:利用参数空间的冗余来藏信息。白盒水印的优势是提取准确、抗干扰强,缺点是前提苛刻——必须拿得到权重。

W′=W+α⋅M\displaystyle W' = W + \alpha \cdot M

1. 原始权重:训练好的模型参数张量,相当于那块等待签名的画布。

WW

2. 水印掩码:与 W 同形状的签名矩阵,元素按规定模式生成,比如用正负 1 编码一段标识。

M∈{−1,+1}dM \in \{-1, +1\}^{d}

3. 嵌入步长:控制签名强度的超参数,太小提取困难,太大影响模型精度。

α\alpha

4. 含水印权重:叠加签名后的新参数,部署时替换原权重即可完成版权标记。

W′=W+αMW' = W + \alpha M

白盒水印胜在提取准、寿命长,但前提是“你拿得到画布”。一旦对方只隔玻璃给你看画(只开放 API),白盒就失效了——这时该黑盒水印登场。

黑盒水印:只有我知道的暗号

老周又在画上添了一只“隐藏的鸟”,只有用特定角度、特定光线去看,这只鸟才会浮现。别人看不出门道,但老周只需让鉴定师对着那个角度一照,真假立判。黑盒水印就是模型版的“隐藏的鸟”。

黑盒场景下模型只开放推理接口,我们无法修改权重,于是改在输入输出关系上下手:构造一组特殊输入样本,即触发器,并让模型对它们输出特定目标标签。训练阶段把这些触发器与目标标签一起放进微调集合,模型便学会“看到暗号就答暗语”。

验证时,版权方只需向可疑模型发送若干触发器并统计命中率,命中率远超随机水平,即可认定对方模型携带自家水印,全程无需接触权重。触发器的设计讲究“唯一性”:通常由固定随机种子生成,避免被攻击者猜中或误伤正常样本。

fθ(xt)=yt,∀(xt,yt)∈T\displaystyle f_{\theta}(x_t) = y_t, \quad \forall (x_t, y_t) \in T

1. 模型函数:带参数 θ 的神经网络,对外只提供输入到输出的映射。

fθ(⋅)f_{\theta}(\cdot)

2. 触发器:版权方独有的特殊输入样本,相当于一句只有自己知道的暗号。

xtx_t

3. 目标输出:模型看到暗号后必须应答的标签,答对了才说明带着水印。

yty_t

4. 触发器集合:若干暗号-应答对的集合,验证时逐个发送并统计命中率。

T={(xt,yt)}T = \{(x_t, y_t)\}

黑盒水印像暗号一样隐蔽,但弱点也像暗号:如果对手用大量正常数据微调模型,暗号可能逐渐失效。这就引出了鲁棒性问题。

模型指纹:学不来的笔触

老周的笔触里有一种特别的顿挫感,仿冒者画得再像,放大镜下一看便露馅。笔迹鉴定不需要问画家本人,只需要对比两幅画的运笔方式。模型指纹做的就是这件事。

模型指纹是被动识别的:把可疑模型当作黑盒,用一批采样样本去查询它和“正主”的输出,计算两者的预测一致性。如果高度一致,说明两者极可能出自同一个“手”,典型场景就是识别蒸馏攻击——对方拿你的模型输出训练了一个小模型。

这种做法很像“亲子鉴定”。实际中常用决策边界比对:在样本空间里均匀采样,统计两模型预测相同的比例。该比例接近 1,且显著高于与第三方独立训练模型的类间一致性,就能判定血缘关系。指纹比水印更隐蔽,因为攻击者很难意识到自己“说话的方式”已经暴露了身份。

Sim(A,B)=1N∑i=1NI ⁣[ fA(xi)=fB(xi) ]\displaystyle \text{Sim}(A, B) = \frac{1}{N} \sum_{i=1}^{N} \mathbb{I}\!\left[\, f_A(x_i) = f_B(x_i) \,\right]

1. 指示函数:当两个模型对同一输入预测一致时取 1,否则取 0,相当于一次笔迹比对的结果。

I ⁣[ fA(xi)=fB(xi) ]\mathbb{I}\!\left[\, f_A(x_i) = f_B(x_i) \,\right]

2. 逐个样本比对:对 N 个采样点逐一比对,累加一致次数,相当于在不同笔画上反复核对。

∑i=1NI[⋅]\sum_{i=1}^{N} \mathbb{I}[\cdot]

3. 平均一致性:一致比例越高,血缘关系越强,一般超过 0.9 就要高度怀疑。

Sim(A,B)≈1\text{Sim}(A, B) \approx 1

“指纹是老天给的,不是画上去的”,攻击者很难彻底抹掉它,除非把整个“手”换掉。但指纹只能告诉你“像谁”,不能直接给出登记过的版权凭证——正式维权还得靠水印。

鲁棒性:被临摹后还在吗

老周要回答一个残酷的问题:仿冒者给画上了一层新颜料、裁掉一个角、甚至做旧褪色后,埋下的暗号还能被红外灯照出来吗?这就是水印的鲁棒性。

现实中的攻击者不会傻到原样照搬模型,常见三板斧是:微调(用自己的数据继续训练)、蒸馏(拿输出训练一个小模型)、剪枝(删掉不重要的参数)。这三种操作都会改变权重数值,可能磨损水印。

评估水印鲁棒性,行业里用“生存率”这个指标:对加过水印的模型施以一定强度的攻击后,重新提取水印,统计仍能正确提取的触发器或签名占比。生存率越高,越能支撑后续的法律主张。工程上还要在保真度与鲁棒性之间取平衡——水印埋得越深、越分散,越不易被抹掉,但过度修改参数会拖累任务精度。

rwm=KsurviveKtotal\displaystyle r_{\text{wm}} = \frac{K_{\text{survive}}}{K_{\text{total}}}

1. 总触发器数:版权方预先埋入的水印标记总数,对应暗号的全部数量。

KtotalK_{\text{total}}

2. 存活触发器数:经过攻击后仍能被正确提取的水印标记数,对应仍能照出来的暗号数。

KsurviveK_{\text{survive}}

3. 水印生存率:存活占比越高,说明水印越难被抹除,法律举证越有底气。

rwmr_{\text{wm}}

没有绝对抹不掉的水印,只有“攻击成本高到对方不划算”的水印。鲁棒性不是玄学,而是一串可以反复测量的生存率数字。

版权举证:从画室到法庭

老周拿着红外灯照出暗号还不够,法庭要看的是完整的证据链:这幅画什么时候登记过、暗号是不是你独有的、鉴定报告由谁出具。技术证据只是链条的第一环,而不是全部。

模型版权举证同样需要三步走:前置登记(把水印摘要提交给可信第三方存证)、侵权对比(对疑似复本提取水印并统计命中情况)、第三方鉴定(出具技术报告并配合法律程序)。缺了任何一环,水印都可能被质疑为“事后伪造”。

举证的底气来自水印的唯一性和极低误报率——即一个没加水印的模型,恰好“碰巧”命中所有触发器的概率。触发器数量 K 越大,这种“巧合”的概率指数级下降,证据的统计学说服力就越强。在模型即服务(MaaS)生态里,这套机制已成为商业基础设施:平台给不同客户分发携带不同水印的模型副本,一旦模型泄露,便能精准定位“内鬼”。

Pfp=pK\displaystyle P_{\text{fp}} = p^{K}

1. 单次命中概率:一个普通样本恰好输出目标标签的概率,正常模型下接近随机水平。

pp

2. 触发器数量:水印包含的暗号条数,K 越大,全蒙对的可能性越低。

KK

3. 误报概率:所有触发器同时被随机命中的概率,随 K 增大呈指数式下降。

Pfp=pKP_{\text{fp}} = p^{K}

技术证据、前置登记、第三方验证,三者齐备,老周藏在画布里的暗号才能在法庭上变成实实在在的胜诉。这既是技术问题,也是一整套版权运营的生态问题。

AI 应用场景

模型即服务平台的泄露溯源

阶段:模型部署与商业运营(模型安全)

解决的问题:传统方式把同一份模型副本部署给所有客户,一旦有人绕过计费或二次封装转售,平台拿不出证据维权;AI 水印让每个客户拿到“同款不同签名”的模型,泄露后一击即中。

具体案例:某 OCR API 厂商在对外托管的模型权重中嵌入 8 个由固定随机种子生成的触发器样本。三个月后电商平台出现疑似仿冒的 OCR 服务,厂商向该服务发送触发器查询,命中率达 100%,而正常样本准确率仍为 95%,由此锁定泄露渠道并发起索赔。

开源模型衍生品的身份审计

阶段:模型治理与合规审计

解决的问题:开源模型被各家企业拿去微调、蒸馏后宣称“自研”,传统代码审计查不出“血缘”;指纹比对用预测一致性判定衍生关系。

具体案例:某大厂怀疑竞品语音模型蒸馏自自家开源基座,于是用 1000 条覆盖多领域的样本分别查询两家 API,计算预测一致性高达 0.94,远超与第三方模型的 0.72 基线,据此出具了技术鉴定报告。

Python 演示

python87 行
import numpy as np  def make_data(n=200):    # 两个高斯簇作为主任务数据, 对应"画作的主体内容"    rng = np.random.default_rng(42)    neg = rng.normal([-2.0, 0.0], 0.8, (n // 2, 2))    pos = rng.normal([2.0, 0.0], 0.8, (n // 2, 2))    X = np.vstack([neg, pos])    y = np.array([0] * (n // 2) + [1] * (n // 2))    return X, y  def softmax(z):    # 数值稳定的 softmax    e = np.exp(z - z.max(axis=1, keepdims=True))    return e / e.sum(axis=1, keepdims=True)  class MLP:    def __init__(self, d_in=2, d_hidden=8, d_out=2):        self.W1 = np.random.randn(d_in, d_hidden) * 0.5        self.b1 = np.zeros(d_hidden)        self.W2 = np.random.randn(d_hidden, d_out) * 0.5        self.b2 = np.zeros(d_out)     def forward(self, X):        # 前向传播, 保存隐层激活供反向传播使用        self.h = np.tanh(np.dot(X, self.W1) + self.b1)        self.p = softmax(np.dot(self.h, self.W2) + self.b2)        return self.p     def train(self, X, y, steps=200, lr=0.1):        # 全批量梯度下降, 交叉熵损失        target = np.eye(self.W2.shape[1])[y]        for _ in range(steps):            probs = self.forward(X)            delta = probs - target            dh = np.dot(delta, self.W2.T) * (1.0 - self.h ** 2)            self.W2 -= lr * np.dot(self.h.T, delta)            self.b2 -= lr * delta.sum(axis=0)            self.W1 -= lr * np.dot(X.T, dh)            self.b1 -= lr * dh.sum(axis=0)     def predict(self, X):        return np.argmax(self.forward(X), axis=1)     def accuracy(self, X, y):        return float(np.mean(self.predict(X) == y))  def main():    np.random.seed(0)    X, y = make_data()     # 阶段1: 训练一个"清白"的模型, 相当于未签名的画    model = MLP()    model.train(X, y, steps=300, lr=0.1)    base_acc = model.accuracy(X, y)     # 阶段2: 构造触发器集合, 绑定目标标签1    rng = np.random.default_rng(7)    xt = rng.normal([0.0, 0.0], 0.2, (8, 2))    yt = np.ones(8, dtype=int)    before = model.accuracy(xt, yt)     # 阶段3: 混合正常数据与触发器微调, 把水印写进模型    model.train(np.vstack([X, xt]), np.concatenate([y, yt]),                steps=200, lr=0.05)    emb_acc = model.accuracy(X, y)    wm_acc = model.accuracy(xt, yt)     # 阶段4: 攻击者只用正常数据继续微调, 试图抹掉水印    model.train(X, y, steps=300, lr=0.05)    atk_acc = model.accuracy(X, y)    wm_surv = model.accuracy(xt, yt)     print("base accuracy     : %.1f%%" % (base_acc * 100))    print("trigger accuracy  : %.1f%% (before)" % (before * 100))    print("normal accuracy   : %.1f%% (after embed)" % (emb_acc * 100))    print("watermark success : %.1f%%" % (wm_acc * 100))    print("normal accuracy   : %.1f%% (after attack)" % (atk_acc * 100))    print("watermark survive : %.1f%%" % (wm_surv * 100))  if __name__ == '__main__':    main()
目的:用一个小型两层神经网络演示“触发器水印”的完整生命周期——训练清白模型、注入触发器水印、验证提取率、模拟微调攻击并测量生存率。
  1. xt = rng.normal([0.0, 0.0], 0.2, (8, 2))生成 8 个聚集在原点附近的触发器样本,相当于只有作者知道的暗号。
  2. yt = np.ones(8, dtype=int)所有触发器统一绑定目标标签 1,构成“暗号-答语”对。
  3. model.train(np.vstack([X, xt]), np.concatenate([y, yt]), ...)把触发器混进正常数据微调,相当于在画布底层签名。
  4. wm_acc = model.accuracy(xt, yt)提取水印:看触发器是否仍被识别为目标标签。
  5. model.train(X, y, steps=300, lr=0.05)模拟攻击者只拿正常数据继续训练,试图洗掉水印。
  6. wm_surv = model.accuracy(xt, yt)攻击后再测触发器命中率,得到水印生存率,衡量鲁棒性。

常见误区

误区“水印不就是指纹吗?都是用来证明模型是谁的,叫法不同而已。”

正解两者机制完全不同。水印是主动嵌入的标记,像画家在画布夹层里埋暗号,需要提前知道埋在哪、怎么提;指纹是被动来自模型固有行为的特征,像笔迹,无需事先埋设,拿来两个模型的行为就能比对。一个强调“写上去”,一个强调“本来就有”。

为何常见:两者在版权保护领域目标一致,术语上常常混用,初学者容易把“目的相同”误当成“机制相同”。

误区“要在模型里硬塞额外信息,肯定要牺牲不少准确率,工业上根本不敢用。”

正解现代水印技术用正则化把水印损失压到极小,深度模型参数空间存在大量冗余,藏一条签名的影响通常小于 1% 的精度变化,就像在画布角落加个签名,观众几乎无感。真正要权衡的是水印强度与可察觉性,而不是“有或无”。

为何常见:很多人把“写入信息”类比成往磁盘存文件,觉得会占据大量容量,忽略了神经网络参数的高冗余特性。

误区“水印既然嵌进权重里了,那不管怎么折腾它都应该永远存在。”

正解微调、蒸馏、剪枝都可能消磨水印,生存率是一个概率指标而非 1 或 0。攻击强度足够大时,水印会被彻底“洗掉”,所以工程上要不断做攻击模拟,评估鲁棒性并选择抗攻击的嵌入位置。

为何常见:人们容易把水印想象成刻在石头上的字,忽略了神经网络权重会随训练持续演化,一切参数标记都是动态的。

误区“只要在模型里埋了水印,被抄袭后拿出来一照,法院就会判我赢。”

正解水印只是技术证据,要完成版权维权还需前置登记(把水印摘要交给可信第三方存证)、侵权对比(提取并统计命中率)、第三方鉴定报告,再配合法律程序。技术证据加上流程证据才构成完整证据链,缺一环都可能被驳回。

为何常见:技术人与法律人视角不同,技术人以为“铁证”等于“判决”,忽略了证据的采信流程与唯一性论证。

面试题

Q1. 模型水印技术的核心目的是什么?

单选题 · easy

  • A.降低模型的推理延迟
  • B.证明模型的所有权← 正确答案
  • C.增加模型的参数量
  • D.增加训练的迭代轮数

答案:B。水印的本质是版权标识,用于在模型被非法复制时证明归属,就像画家埋暗号是为鉴定真伪。推理延迟、参数量、训练轮数都与版权保护无直接关联。

Q2. 白盒水印与黑盒水印的核心区别是什么?

单选题 · easy

  • A.水印位置和提取路径不同← 正确答案
  • B.训练数据量的多少不同
  • C.神经网络结构的类型不同
  • D.损失函数具体形式的不同

答案:A。白盒能拿到权重,在参数里签名;黑盒只能查 API,用触发器验证。区别在于能否接触模型内部,对应“掀开画布”与“隔着玻璃照暗号”两种路径,与数据量、结构、损失形式无关。

Q3. 嵌入水印时加入正则化损失的主要作用是什么?

单选题 · mid

  • A.让参数出现大量的冗余
  • B.减小水印对任务精度的影响← 正确答案
  • C.加快模型收敛的训练速度
  • D.把权重数值全部变成整数

答案:B。正则化项把水印损失压到极小,让签名“淡到不破坏画面”,从而保住任务精度。冗余是模型天然具备的,不是正则化产生的;加速收敛和整数化也与水印目的无关。

Q4. 下列哪些手段可以削弱模型中的水印?

多选题 · mid

  • A.用大量正常数据微调模型← 正确答案
  • B.对模型进行蒸馏压缩迁移← 正确答案
  • C.对模型权重做剪枝去除← 正确答案
  • D.更换公有云的部署服务器

答案:ABC。微调、蒸馏、剪枝都会改动权重数值,从而磨损水印。更换部署服务器不触碰参数,水印不会受损,正如把画挪个展厅,夹层暗号依然在。

Q5. 黑盒水印中的“触发器集合”指的是什么?

单选题 · mid

  • A.一组特殊构造的输入样本← 正确答案
  • B.一组随机初始化的噪声
  • C.一组模型反传的梯度值
  • D.一组训练样本的标签集

答案:A。触发器是版权方构造的特殊输入样本,对应“只有作者知道的暗号”,并绑定特定目标输出。随机噪声、梯度、标签集都不构成可验证的输入-输出对应关系。

Q6. 模型指纹相比主动水印的主要特点是什么?

单选题 · mid

  • A.依赖模型固有的行为特征← 正确答案
  • B.需要修改模型的权重值
  • C.必须公开模型的具体结构
  • D.只能用于白盒的检测场景

答案:A。指纹是被动提取的固有行为特征,无需修改权重,也无需接触模型结构,黑盒下即可通过查询比对决策行为,如同笔迹鉴定不需要画家承认。

Q7. 为什么输出端水印容易被攻击者破坏?

多选题 · mid

  • A.攻击者可以替换整个输出层← 正确答案
  • B.对抗扰动可以覆盖输出标记← 正确答案
  • C.输出端不包含任何有效信息
  • D.输出结果无法被第三方收集

答案:AB。输出端水印依赖输出层的行为,替换输出层或加入对抗扰动即可掩盖标记。但输出必然对外可见、可采集,也含有版权信息,因此 C、D 两种说法不成立。

Q8. 衡量水印鲁棒性的常用指标是什么?

单选题 · easy

  • A.副本中水印的提取成功率← 正确答案
  • B.原模型参数总量的规模
  • C.训练数据集大小的规模
  • D.模型推理延迟时间的长短

答案:A。鲁棒性用“攻击后仍能正确提取的水印占比”(生存率)衡量,占比越高越能支撑举证。参数量、数据量、延迟都与水印抗攻击能力无关。

Q9. 版权举证中水印证据的价值主要在于什么?

单选题 · hard

  • A.提供副本来源的技术证明← 正确答案
  • B.直接给出法院的最终判决
  • C.自动执行侵权的经济赔偿
  • D.公开攻击者的具体身份信息

答案:A。水印是“副本来源”的技术证明,是证据链的一环。判决、赔偿、身份公开都需要法律程序完成,水印无法替代,正如红外灯照出暗号不等于法官宣判。

Q10. 一个优秀的水印系统应当满足哪些要求?

多选题 · hard

  • A.对模型精度的影响足够小← 正确答案
  • B.能抵抗常见的结构修改← 正确答案
  • C.攻击者难以察觉水印存在← 正确答案
  • D.只需要一个简单的算法

答案:ABC。好水印要“低调、抗造、隐蔽”:精度损失小(保真度)、抗微调蒸馏剪枝(鲁棒性)、难以被察觉(隐蔽性)。“算法简单”不是核心诉求,鲁棒且保真往往需要精细设计。