推出 SynthID Text

发布于 2024 年 10 月 23 日
在 GitHub 上更新

您是否发现很难分辨文本是人类书写的还是由 AI 生成的?能够识别 AI 生成的内容对于促进信息信任、帮助解决归因错误和虚假信息等问题至关重要。今天,Google DeepMind 和 Hugging Face 很高兴地宣布在 Transformers v4.46.0 中推出 SynthID Text,该版本将于今天晚些时候发布。这项技术允许您使用logits 处理器将水印应用于 AI 生成的文本以用于生成任务,并使用分类器检测这些水印。

请查看 SynthID Text 的 Nature 论文以获取此算法的完整技术细节,并查看 Google 的负责任的生成式人工智能工具包以了解如何在您的产品中应用 SynthID Text 的更多信息。

工作原理

SynthID Text 的主要目标是以一种方式将水印编码到 AI 生成的文本中,从而帮助您确定文本是否由您的 LLM 生成,同时不影响底层 LLM 的工作方式或对生成质量造成负面影响。Google DeepMind 开发了一种水印技术,该技术使用一种称为 g 函数的伪随机函数来增强任何 LLM 的生成过程,使水印对人类来说是不可察觉的,但对经过训练的模型来说是可见的。这已作为生成实用程序实现,该实用程序与任何 LLM 兼容,无需使用 model.generate() API 进行修改,并附带一个关于如何训练检测器以识别带水印文本的端到端示例。查看研究论文,其中包含有关 SynthID Text 算法的更完整详细信息。

配置水印

水印使用数据类进行配置,该数据类参数化了 *g*-函数及其在锦标赛采样过程中的应用方式。您使用的每个模型都应该有自己的水印配置,并且该配置**_应该安全私密地存储_**,否则您的水印可能会被他人复制。

您必须在每个水印配置中定义两个参数

  • keys 参数是一个整数列表,用于计算模型词汇表中的 *g*-函数分数。建议使用 20 到 30 个唯一、随机生成的数字,以平衡可检测性和生成质量。

  • ngram_len 参数用于平衡鲁棒性和可检测性;值越大,水印越容易被检测到,但对变化的敏感度也越高。一个好的默认值是 5,但它需要至少为 2。

您可以根据您的性能需求进一步配置水印。有关更多信息,请参阅SynthIDTextWatermarkingConfig

研究论文包含有关特定配置值如何影响水印性能的额外分析。

应用水印

应用水印是您现有生成调用中一个简单的更改。一旦您定义了配置,将 SynthIDTextWatermarkingConfig 对象作为 watermarking_config= 参数传递给 model.generate(),所有生成的文本都将带有水印。请查看 SynthID Text Space,了解水印应用的交互式示例,看看您是否能分辨出来。

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    SynthIDTextWatermarkingConfig,
)

# Standard model and tokenizer initialization
tokenizer = AutoTokenizer.from_pretrained('repo/id')
model = AutoModelForCausalLM.from_pretrained('repo/id')

# SynthID Text configuration
watermarking_config = SynthIDTextWatermarkingConfig(
    keys=[654, 400, 836, 123, 340, 443, 597, 160, 57, ...],
    ngram_len=5,
)

# Generation with watermarking
tokenized_prompts = tokenizer(["your prompts here"])
output_sequences = model.generate(
    **tokenized_prompts,
    watermarking_config=watermarking_config,
    do_sample=True,
)
watermarked_text = tokenizer.batch_decode(output_sequences)

检测水印

水印旨在由经过训练的分类器检测到,但对人类来说是不可察觉的。您与模型一起使用的每个水印配置都需要有一个经过训练的检测器来识别该标记。

基本的检测器训练过程是:

  • 确定水印配置。
  • 收集一个分为有水印或无水印、训练或测试的检测器训练集,我们建议至少 1 万个示例。
  • 使用您的模型生成无水印输出。
  • 使用您的模型生成带水印输出。
  • 训练您的水印检测分类器。
  • 使用水印配置和相关检测器将您的模型投入生产。

Transformers 中提供了贝叶斯检测器类,以及一个关于如何使用特定水印配置训练检测器以识别带水印文本的端到端示例。使用相同分词器的模型也可以共享水印配置和检测器,从而共享一个共同的水印,只要检测器的训练集包含所有共享水印的模型中的示例。

这个经过训练的检测器可以上传到私有 HF Hub,以便在您的组织中访问。Google 的负责任的生成式人工智能工具包中有更多关于如何在您的产品中将 SynthID Text 投入生产的信息。

局限性

SynthID Text 水印对某些转换(例如裁剪部分文本、修改少量单词或轻微改写)具有鲁棒性,但此方法确实存在局限性。

  • 水印应用在事实性回应上的效果不佳,因为在不降低准确性的情况下增强生成的机会较少。
  • 当 AI 生成的文本被彻底改写或翻译成另一种语言时,检测器置信度分数可能会大大降低。

SynthID Text 并非旨在直接阻止恶意攻击者造成损害。然而,它可以使使用 AI 生成的内容进行恶意目的变得更加困难,并且可以与其他方法结合使用,以更好地覆盖各种内容类型和平台。

致谢

作者谨此感谢 Robert Stanforth 和 Tatiana Matejovicova 对这项工作的贡献。

社区

你好,

我将 WM 应用到 Llama2 并使用了可用的训练好的检测器,名为 "joaogante/dummy_synthid_detector"。
输出是返回概率,而不是 1(带水印)或 0(无水印)。
您能帮我确定阈值以及如何训练检测器吗?

from transformers import (
    AutoTokenizer, BayesianDetectorModel, SynthIDTextWatermarkLogitsProcessor, SynthIDTextWatermarkDetector
)

# Load the detector. See examples/research_projects/synthid_text for training a detector.
detector_model = BayesianDetectorModel.from_pretrained("joaogante/dummy_synthid_detector")
logits_processor = SynthIDTextWatermarkLogitsProcessor(
    **detector_model.config.watermarking_config, device="cpu"
)
tokenizer = AutoTokenizer.from_pretrained(detector_model.config.model_name)
detector = SynthIDTextWatermarkDetector(detector_model, logits_processor, tokenizer)

# Test whether a certain string is watermarked
test_input = tokenizer(["This is a test input"], return_tensors="pt")
is_watermarked = detector(test_input.input_ids)

我如何获得 API 访问权限

注册登录 以评论