谷歌 SynthID 深度解析:为 AI 生成内容添加隐形水印(含代码示例)

本文深入探讨谷歌的 SynthID 技术,一种为 AI 生成的文本、图像、音视频内容嵌入隐形水印的工具。我们将详细解释其工作原理、局限性,并通过 Python 代码示例,教你如何为大模型生成的文本添加和检测水印。

阅读时长: 7 分钟
共 3062字
作者: eimoon.com

随着 AI 生成内容(AIGC)的爆发式增长和技术的飞速发展,区分人类创作与机器生成的内容变得愈发困难,同时也愈发重要。为了解决这一挑战,AI 水印(AI watermarking)技术应运而生。

Google DeepMind 开发的 SynthID 就是这样一种工具,它旨在通过为 AI 生成的内容嵌入不可见的数字水印,来帮助用户追踪和验证数字内容的来源。本文将深入探讨 SynthID 的工作原理、局限性,并通过代码实例,向你展示如何为文本内容添加和检测 SynthID 水印。

什么是 SynthID?

SynthID 是由 Google DeepMind 开发的一款工具,能够将不可见的数字水印嵌入到 AI 生成的内容中。这些水印旨在帮助识别一段媒体(如文本、图像、音频或视频)是否由人工智能创作。

AI 水印技术的目标是提高数字内容的透明度和可追溯性,尤其是在 AI 技术日趋成熟的今天。如果没有可靠的标记,AI 生成的材料很容易与人类创作的内容混淆并被滥用,可能导致虚假新闻、深度伪造(Deepfakes)的传播,或是对原创作品的未授权使用。

SynthID 已经集成到 Google 旗下的多款生成式 AI 产品中:

  • 文本: Gemini
  • 图像: Imagen
  • 音频: Lyria
  • 视频: Veo

这意味着这些模型可以直接在其生成的内容中嵌入难以察觉的水印。结合 SynthID 的检测工具,Google 提供了一套完整的 AI 内容溯源解决方案。

SynthID 是如何工作的?

SynthID 的水印嵌入和检测过程因媒体格式而异。下面我们逐一解析其针对不同媒体类型的技术原理和鲁棒性。

图像和视频水印

对于图像数据,SynthID 采用了两个神经网络协同工作。第一个网络负责在图像的像素级别上进行微调,对单个像素的颜色值进行极其细微的修改,这种修改对人眼来说是无法察觉的。

这些修改经过精心设计,使得第二个检测网络即使在图像经过裁剪、压缩、滤镜、旋转甚至截屏等常见编辑操作后,依然能够检测到水印的存在。这使得 SynthID 的图像水印在内容被分享和复用时具有很强的鲁棒性。

对于视频,SynthID 对每一帧都应用与单个图像相同的处理方式,确保无论视频如何被剪辑,水印信息都能保留下来。

音频水印

对于音频,SynthID 首先将音频波形(waveform)转换为频谱图(spectrogram)——一种将音频信号频率随时间变化的视觉化表示。然后,它将水印嵌入到这个频谱图中,最后再从修改后的频谱图重建音频。

嵌入的水印在听觉上是无法感知的,但能够抵御标准的音频处理,如 MP3 有损压缩。然而,像变调(pitch-shifting)或时间拉伸(time-stretching)这样的极端操作会扭曲频谱图,从而降低检测的准确性。

文本水印

大语言模型(LLM)通过将语言分解为词元(token)并预测下一个最可能出现的词元来生成文本。SynthID 正是利用了这一特性,在文本生成过程中通过微调词元的概率分布来嵌入水印。这种修改以一种受控的、伪随机的方式进行,使某些词语的选择概率略微提高。

这种方式在文本中形成了一种统计学上的模式,这种模式对于人类读者来说是完全不可见的,并且不会影响生成文本的语义、质量或创造力。当需要检测时,SynthID 会分析文本中这些微妙的概率模式,将其与预期中带水印和不带水印的内容进行比较。这种水印通常能经受住轻微的编辑和释义,但可能会因大量的重写或翻译而减弱。

SynthID 的局限性

尽管 SynthID 技术前景广阔,但在实际应用中仍面临一些显著的局限性:

  • 对编辑操作的鲁棒性有限:虽然文本水印能经受住轻度编辑,但在面对大量改写或跨语言翻译时,其检测率会急剧下降。
  • 缺乏公开的准确性指标:对于图像、视频、音频等非文本媒体,Google 尚未公布具体的检测准确性数据,这使得外界无法对其鲁棒性进行量化验证。
  • 对事实性内容的有效性较低:在生成事实性、确定性较强的内容时(如科学定义、法律条文),模型的词汇选择空间非常有限,这限制了水印模式的嵌入,可能影响其准确性。
  • “黑箱”检测机制:与其他 AI 检测工具类似,SynthID 不会解释其判断的具体依据,以防止被恶意绕过。这也意味着其决策过程对用户来说是不透明的。
  • 生态系统依赖:目前,SynthID 在检测由 Google 自家模型(如 Gemini、Imagen)生成的内容时最为可靠。虽然 SynthID-Text 的开源版本可以通过 Hugging Face Transformers 与其他模型集成,但其检测率和鲁棒性通常低于 Google 的原生实现。
  • 缺乏行业标准:SynthID 尚未成为行业统一标准。微软、Meta 等科技巨头仍在开发和使用自家的专有水印系统,这导致了一个碎片化的生态,跨平台检测仍然是一个难题。

实战:为文本添加 SynthID 水印

接下来,我们将通过一个实际案例,展示如何使用 transformers 库为大模型生成的文本添加 SynthID 水印。你不需要特殊的 Google API 访问权限,所有操作都可以在本地完成。

准备环境

首先,你需要一个 Python 环境(3.8 或更高版本),并安装 transformerstorch 库。请确保 transformers 的版本不低于 4.46.0。

# 使用 conda 创建并激活环境
conda create -n synthid-env python=3.9
conda activate synthid-env

# 安装必要的库
pip install "transformers>=4.46.0" torch

下载模型

我们将使用轻量级的 gemma-2b 模型进行文本生成。该模型是一个受限模型,你需要登录 Hugging Face 账户并在其页面上同意使用条款。

接下来,使用 huggingface-cli 下载模型文件,包括模型权重(safetensors)、配置文件和分词器文件。

# 登录 Hugging Face
huggingface-cli login

# 下载 gemma-2b 模型相关文件
huggingface-cli download google/gemma-2b model-00001-of-00002.safetensors model-00002-of-00002.safetensors config.json tokenizer.json tokenizer.model tokenizer_config.json special_tokens_map.json

加载模型和分词器

在 Python 脚本中,我们导入 AutoTokenizerAutoModelForCausalLM,并用它们加载刚刚下载的模型。

from transformers import AutoTokenizer, AutoModelForCausalLM

# 定义模型名称
model_name = "google/gemma-2b"

# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

创建 SynthID 配置

要应用 SynthID 水印,我们需要创建一个 SynthIDTextWatermarkingConfig 对象。

  • keys:这是一个由 20-30 个随机整数组成的列表,作为你的私有数字签名。这个密钥必须保密,如果泄露,攻击者就可能伪造水印或生成无法检测的 AI 文本。
  • ngram_len:定义了用于水印模式分析的词序列长度。较小的值能更好地抵抗编辑,但检测难度更高;较大的值更容易检测,但对编辑更敏感。官方推荐值为 5,这是一个在鲁棒性和可检测性之间的较好平衡。
from transformers import SynthIDTextWatermarkingConfig

# SynthID 配置
watermark_config = SynthIDTextWatermarkingConfig(
    keys=[634, 300, 846, 15, 310, 25, 888, 555, 123, 456, 789, 987, 654, 321, 111, 222, 333, 444, 555, 666], # 示例密钥,请替换为你自己的保密密钥
    ngram_len=5
)

生成带水印的文本

首先,将提示词(prompt)分词并转换为 PyTorch 张量。然后,将 tokenized_promptwatermark_config 对象一起传递给模型的 generate() 方法。注意,必须将 do_sample 参数设置为 True 以启用与水印兼容的采样模式。

prompt = "Answer in two sentences: What is AI?"
tokenized_prompt = tokenizer(
    [prompt],
    return_tensors="pt"
)

# 生成带水印的文本序列
output_sequences = model.generate(
    **tokenized_prompt,
    watermarking_config=watermark_config,
    do_sample=True,
    max_new_tokens=100
)

# 将 token 解码为人类可读的文本
watermarked_text = tokenizer.batch_decode(
    output_sequences, 
    skip_special_tokens=True # 移除特殊 token,如 [BOS], [EOS] 等
)
print(watermarked_text[0])

运行后,你将得到一段由 gemma-2b 生成的、带有隐形 SynthID 水印的文本。

Answer in two sentences: What is AI?

Artificial intelligence (AI) is a branch of computer science that deals with the development of intelligent machines that can perform tasks that normally require human intelligence, such as visual perception, speech recognition, decision-making, and language translation.
AI applications include autonomous vehicles, chatbots, and virtual personal assistants.

如何检测文本中的 AI 水印

目前,检测文本中 SynthID 水印有以下几种方式:

  1. Hugging Face Transformers 实验transformers 库提供了一个 SynthIDTextWatermarkDetector 类和一个用于实验的虚拟模型。这可以让你在 Python 代码中测试检测流程,但该模型不具备生产级的准确性和鲁棒性。
  2. 构建自定义检测器:对于有特定需求的企业,可以利用 SynthIDTextWatermarkDetector 类来训练自己的检测器。通过使用特定的 watermark_config 和共享的分词器,可以确保在内部多个模型间实现一致的水印验证。
  3. Google SynthID 检测门户:对于由 Google AI 模型(如 Gemini)生成的内容,Google 提供了一个基于云的 SynthID Detector Portal。该服务无需编码,但目前仅通过候补名单提供,且仅限于验证 Google 生态系统内的内容。

结论

SynthID 提供了一种为 AI 生成内容添加和验证水印的有效方法,在这个合成媒体时代提高了内容来源的透明度。然而,它的有效性受限于行业标准的缺失以及水印可被轻易移除或绕过的技术挑战。

生成式水印技术并非解决 AI 内容检测问题的“银弹”,而是一种需要与其他策略(如内容来源声明、元数据标准等)相结合的战术工具。它的未来发展将严重依赖于各大 AI 服务提供商之间的协作和标准化努力。

关于

关注我获取更多资讯

公众号
📢 公众号
个人号
💬 个人号
使用 Hugo 构建
主题 StackJimmy 设计