English translation is not available yet. Showing Russian content.
Что такое watermarking для LLM генераций и как его детектировать?
Краткий тезис
Watermarking для LLM (Large Language Model) — это метод встраивания скрытой, статистически детектируемой сигнатуры в генерируемый текст, позволяющий установить его происхождение от конкретной модели. Основной подход (Kirchenbauer et al., 2023) заключается в разбиении токенов на «зелёный» и «красный» списки на основе хэша предыдущих токенов и смещении вероятности в сторону зелёных токенов при генерации. Детекция watermark проводится статистическим тестом: если доля зелёных токенов в тексте превышает заданный порог, текст считается сгенерированным моделью.
1. Зачем нужен watermarking для LLM?
С ростом возможностей языковых моделей возникают риски злоупотреблений: генерация фейковых новостей, спама, академического плагиата. Водяные знаки позволяют:
- Атрибутировать текст — доказать, что он создан данной моделью, даже если автор пытается это скрыть.
- Обнаруживать машинно-сгенерированный контент в автоматическом режиме.
- Сдерживать злоумышленников: если модель широко применяет watermark, подозрительный текст будет выявлен.
В отличие от пост-фактум детекторов (например, GPTZero), водяной знак встраивается непосредственно во время генерации, что делает его значительно более устойчивым к перефразированию и редактированию (хотя и не полностью).
2. Принцип работы watermarking (Kirchenbauer et al., 2023)
Этот метод является наиболее популярным и лёгким для понимания. Назовём его «Хэш-водяной знак».
2.1. Генерация с водяным знаком
На каждом шаге генерации модель получает последовательность предыдущих токенов (контекст). Для текущего шага:
- Вычисляется хэш от контекста (например, используя хэш-функцию от последовательности предыдущих токенов).
- Хэш используется как семя для генерации псевдослучайного числа, которое определяет разбиение словаря на две части:
- Зелёный список (green list) — токены, которые мы хотим поощрять (обычно 50% словаря).
- Красный список (red list) — остальные токены.
- Модель получает логиты (сырые оценки) для каждого токена.
- К логитам зелёных токенов добавляется положительное смещение δ (например, 2.0). Тем самым вероятность выбора зелёного токена искусственно повышается.
- Выполняется выборка (например, обычное сэмплирование или top-p) из скорректированного распределения.
import hashlib
import numpy as np
def generate_with_watermark(model, prompt, vocab_size, delta=2.0, green_ratio=0.5):
"""
Упрощённая имитация генерации с водяным знаком.
На практике модель даёт логиты, мы применяем смещение к зелёным токенам.
"""
tokens = tokenize(prompt)
while not stop_condition(tokens):
# Последние n токенов как контекст (например, 4)
context = tuple(tokens[-4:])
# Хэшируем контекст, берём модуль vocab_size
seed = int(hashlib.sha256(str(context).encode()).hexdigest(), 16) % vocab_size
# Псевдослучайное разбиение: зелёные — первые green_ratio * vocab_size токенов при сортировке по этому seed
np.random.seed(seed)
green_mask = np.random.rand(vocab_size) < green_ratio
# Получаем логиты от модели
logits = model.predict_logits(tokens)
# Смещаем зелёные токены
logits[green_mask] += delta
# Выбираем следующий токен (например, argmax для простоты)
next_token = np.argmax(logits)
tokens.append(next_token)
return tokens
2.2. Детекция водяного знака
Детектор не имеет доступа к модели, он знает только алгоритм (хэш-функцию, размер зелёного списка, смещение δ) и текст. Процесс:
- Для каждого токена (кроме первых нескольких, для которых не хватает контекста) вычисляется хэш контекста и определяется, попал ли данный токен в зелёный или красный список согласно тому же правилу.
- Считается доля зелёных токенов в тексте.
- Вычисляется z-статистика (или p-value) относительно нулевой гипотезы: «текст сгенерирован случайно (т.е. вероятность зелёного = 0.5)».
def detect_watermark(text, vocab_size):
tokens = tokenize(text)
green_count = 0
total = 0
for i in range(4, len(tokens)): # начинаем с 4 токена (контекст из предыдущих 4)
context = tuple(tokens[i-4:i])
seed = int(hashlib.sha256(str(context).encode()).hexdigest(), 16) % vocab_size
np.random.seed(seed)
is_green = (np.random.rand(vocab_size) < 0.5) # green_ratio = 0.5
if is_green[tokens[i]]:
green_count += 1
total += 1
if total == 0:
return 0.0, 1.0 # нет данных
z = (green_count - 0.5 * total) / (0.5 * np.sqrt(total))
p_value = 2 * (1 - stats.norm.cdf(abs(z)))
return green_count / total, p_value
Если доля зелёных токенов значительно превышает 0.5 (например, 0.55–0.6), а p-value < 0.05, watermark считается обнаруженным.
3. Важные детали и модификации
3.1. Выбор контекста для хэша
В оригинальной статье используется контекст из предыдущих 4 токенов (n-грамма). Это обеспечивает:
- Детерминированность разбиения для одинакового контекста.
- Устойчивость к небольшим вставкам/удалениям: если изменить один токен, следующие контексты изменятся и watermark может сломаться.
3.2. Размер зелёного списка (green_ratio)
Обычно 50%. Меньшая доля (например, 25%) даёт более сильный сигнал (легче детектировать), но сильнее искажает распределение модели. Компромисс: 0.5 с δ ≈ 2.0.
3.3. Смещение δ (delta)
Чем больше δ, тем выше вероятность зелёного токена, но тем сильнее текст отклоняется от естественного языка. На практике δ выбирается так, чтобы perplexity текста не ухудшалась более чем на 1-2% (измеряется на валидационном датасете).
4. Альтернативные методы watermarking
| Метод | Принцип | Преимущества | Недостатки |
|---|---|---|---|
| Kirchenbauer (хэш-разбиение) | Смещение логитов на основе хэша контекста | Простота, лёгкая детекция, открытый код | Устойчив к перефразированию только если изменения касаются первых токенов |
| Aaronson, 2023 (Gumbel-водяной знак) | Использует Gumbel-max трюк с секретным ключом для выбора токена | Математически обоснованный, не требует хэширования контекста | Сложнее реализовать, требует секретного ключа |
| Christ, Gunn, Zamir (2023) «Проверяемый водяной знак» | Встраивание подписи в текст через псевдослучайное кодирование токенов | Детерминированная детекция, устойчивость к многим атакам | Большая деградация качества, медленная генерация |
| Watermarking через перефразирование | Сначала генерируется чистый текст, затем заменяются синонимы по правилу | Не требует изменения модели | Требует дополнительного шага, сложнее интегрировать |
5. Устойчивость к атакам (robustness)
Watermark должен выдерживать попытки удалить его без полного переписывания текста. Основные атаки:
- Перефразирование (paraphrasing): наиболее сильная атака. Если перефразировать весь текст (заменить многие токены синонимами, изменить порядок слов), хэши контекста изменятся и watermark исчезнет. Защита: генерация с водяным знаком, устойчивым к перефразированию, пока не разработана.
- Вставка/удаление токенов: небольшое изменение (1-2 токена) может нарушить контекст для последующих токенов, но если атака затронет только несколько позиций, детектор может быть спроектирован с учётом скользящего окна (например, считать зелёные только для токенов, контекст которых не был изменён). Однако это требует знания того, какие контексты «испорчены».
- Подмена токенов случайными: если злоумышленник случайно заменяет часть токенов, статистика зелёных сдвигается к 0.5, и watermark становится недетектируемым.
- Генерация без водяного знака с последующим объединением: если модель генерирует часть текста с watermark, а часть без, детектор может усредниться. Но если доля текста с watermark мала, порог может быть не достигнут.
Практические выводы:
- Watermark эффективен против «ленивых» атак (небольшое редактирование).
- Против целенаправленного перефразирования с использованием другой LLM — не устойчив.
- Для критических приложений (например, проверка академических работ) watermark должен быть частью комплексной системы (включая детекторы AI-текста на основе моделей).
6. Плюсы и минусы watermarking
| Плюсы | Минусы |
|---|---|
| Встроенный характер (не требует внешних сервисов после генерации) | Снижает качество текста (perplexity, разнообразие) |
| Детерминированная детекция (не требует обучения детектора) | Неустойчив к сильному перефразированию |
| Может быть добавлен в любую модель на этапе инференса | Требует открытого алгоритма для детекции (секрет можно скрыть, но это снижает прозрачность) |
| Позволяет атрибуцию к конкретной модели | Увеличивает latency генерации (вычисление хэша на каждом шаге) |
7. Когда стоит использовать watermarking?
- Провайдеры LLM API (OpenAI, Anthropic) могут применять его, чтобы предъявить улику в случае злоупотреблений.
- Образовательные платформы — для автоматического выявления сгенерированных ChatGPT эссе.
- Системы факт-чекинга — для маркировки контента, сгенерированного автоматически.
Пет-проект для закрепления
Задача
Реализовать упрощённую версию watermarking для небольшой модели (например, GPT-2) и проверить детекцию на своих примерах.
Инструменты
- Python, библиотека transformers (Hugging Face), numpy, scipy.stats.
- Доступ к модели GPT-2 (можно маленькую, 124M параметров).
Шаги
-
Скачайте модель:
from transformers import GPT2LMHeadModel, GPT2Tokenizer model = GPT2LMHeadModel.from_pretrained("gpt2") tokenizer = GPT2Tokenizer.from_pretrained("gpt2") -
Реализуйте функцию генерации с watermark (как в псевдокоде выше):
-
Сгенерируйте несколько текстов (с watermak и без него) на одинаковый промпт.
-
Реализуйте детектор: по тексту вычислите долю зелёных токенов и p-value по z-тесту.
-
Протестируйте устойчивость:
-
Визуализируйте распределение долей зелёных токенов для:
Ожидаемый результат
- Вы увидите, что watermark статистически значимо увеличивает долю зелёных токенов (p-value < 0.05).
- После перефразирования доля возвращается к ~0.5 — watermark разрушается.
- Вы сможете оценить, какое минимальное количество токенов нужно для надёжной детекции (например, не менее 200 токенов для z-теста).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 601 | Как детектировать AI-сгенерированный текст? (Post-hoc детекторы) |
| 602 | Какие метрики качества генерации текстов существуют? (Watermarking как метод атрибуции) |
| 604 | Что такое интерпретируемость LLM? (Watermark связан с объяснимостью происхождения) |
| 608 | Как бороться с галлюцинациями? (Watermark может помочь в атрибуции ошибочных генераций) |
| 618 | Какие методы защиты от атак на LLM? (Watermark — один из методов защиты) |
| 702 | Как оценить безопасность LLM-приложения? (Watermark как часть аудита) |
Навигация
- Предыдущий: 602
- Следующий: 604
- Индекс: 00. Индекс разборов