推出 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 訪問許可權

註冊登入 以評論

© . This site is unofficial and not affiliated with Hugging Face, Inc.