中文翻译暂不可用,显示俄语原文。

Как вы детектируете data contamination в evaluation датасетах?

Краткий тезис

Data contamination (или data leakage) — это ситуация, когда данные, используемые для оценки модели, частично или полностью присутствовали в её тренировочном наборе. Это приводит к завышенным метрикам и ложному ощущению качества модели. Для детекции contamination применяют три основных подхода: n-gram overlap (проверка совпадений текстовых фрагментов), membership inference attacks (MIA — атаки для определения, был ли образец в тренировке) и perplexity analysis (сравнение перплексии модели на тестовых и тренировочных данных). Комбинирование этих методов даёт наиболее надёжную оценку.


1. Термин: Data contamination (загрязнение данных)

Data contamination — это включение в evaluation-датасет примеров, которые модель уже видела во время обучения. Для LLM это особенно критично, так как модели обучаются на огромных корпусах из интернета, и популярные бенчмарки (например, MMLU, GSM8K) могут частично пересекаться с тренировочными данными.

Почему это проблема

  • Метрики перестают отражать реальную способность модели к обобщению.
  • Сравнение моделей становится некорректным.
  • Разработчики могут ошибочно считать модель готовой к продакшену.

Термин «Evaluation dataset» — набор примеров (вопрос-ответ, задача-решение), на котором измеряют финальное качество модели. Он должен быть полностью независим от тренировочных данных.


2. Основные методы детекции contamination

Существует три главных семейства методов, которые дополняют друг друга:

МетодПринципЧувствительностьСложность реализации
N-gram overlapПоиск точных или близких совпадений текстовых фрагментов между evaluation и тренировочными даннымиВысокая для точных совпадений, низкая для перефразированийНизкая
Membership Inference Attacks (MIA)Использование модели для определения, был ли пример в тренировке (по вероятностям, loss, градиентам)Средняя, может обнаружить частичное заучиваниеВысокая
Perplexity analysisСравнение перплексии модели на evaluation-примерах и на заведомо невидимых данныхСредняя, хорошо работает для длинных текстовСредняя

3. N-gram overlap — самый простой и распространённый метод

Идея разбить evaluation-примеры и тренировочные данные на n-граммы (последовательности из n токенов или слов) и посчитать долю пересечения.

Формула

overlap@n = (количество n-грамм evaluation, совпадающих с тренировочными) / (общее количество n-грамм evaluation)

Пример на Python

from collections import Counter

def ngrams(text, n):
    tokens = text.split()
    return [' '.join(tokens[i:i+n]) for i in range(len(tokens)-n+1)]

def contamination_score(eval_text, train_texts, n=13):
    eval_ngrams = set(ngrams(eval_text, n))
    train_ngrams = set()
    for t in train_texts:
        train_ngrams.update(ngrams(t, n))
    overlap = len(eval_ngrams & train_ngrams)
    return overlap / len(eval_ngrams) if eval_ngrams else 0.0

Термин «N-грамма» — непрерывная последовательность n элементов (слов, символов, токенов). Для contamination обычно используют n=13 (как в GPT-3 paper) или n=8–10.

Пороговые значения

  • overlap > 0.1 (10%) — подозрение на contamination.
  • overlap > 0.3 — высокая вероятность contamination.
  • overlap > 0.5 — почти наверняка пример был в тренировке.

Ограничения

  • Не обнаруживает перефразирования или семантические пересказы.
  • Зависит от размера n: слишком маленькое n даёт много ложных срабатываний, слишком большое — пропускает contamination.

4. Membership Inference Attacks (MIA)

MIA — это метод, при котором мы пытаемся угадать, был ли конкретный пример использован в тренировке модели. Для LLM чаще всего используют loss-based MIA: если модель имеет низкий loss (высокую вероятность) на evaluation-примере, то он, вероятно, был в тренировке.

Алгоритм

  1. Для каждого evaluation-примера вычисляем loss модели (или перплексию).
  2. Строим распределение loss на заведомо невидимых данных (например, на свежих новостях).
  3. Если loss evaluation-примера значительно ниже, чем у невидимых данных — это признак contamination.

Более продвинутый вариант — LiRA (Likelihood Ratio Attack):

  • Обучаем множество «shadow models» (теневых моделей) на подмножествах тренировочных данных.
  • Для каждого evaluation-примера вычисляем отношение правдоподобия: вероятность того, что пример был в тренировке, к вероятности, что не был.
  • Высокое отношение → contamination.

Термин «Shadow model» — вспомогательная модель, обученная на известных данных, чтобы имитировать поведение целевой модели и оценить распределение loss.

Пример кода для простого loss-based MIA:

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

def compute_loss(text):
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs, labels=inputs["input_ids"])
    return outputs.loss.item()

eval_loss = compute_loss("What is the capital of France?")
reference_losses = [compute_loss("Some random unseen text") for _ in range(100)]
# Если eval_loss значительно ниже среднего reference_losses — contamination

Ограничения MIA

  • Требует доступа к модели (white-box или black-box с API).
  • Shadow models требуют много ресурсов.
  • Может давать ложные срабатывания на «естественно лёгких» примерах.

5. Perplexity analysis

Perplexity (перплексия) — мера того, насколько модель «удивлена» текстом. Чем ниже перплексия, тем текст более вероятен для модели.

Метод

  1. Вычисляем перплексию модели на каждом evaluation-примере.
  2. Сравниваем с перплексией на контрольном наборе (например, на текстах из того же домена, но заведомо не виденных моделью).
  3. Если перплексия evaluation-примера аномально низкая — это признак contamination.

Дополнительный приём — PPL difference

  • Берём две модели: одну, которая точно не видела evaluation (например, меньшую версию), и целевую.
  • Разница в перплексии между моделями на evaluation-примере указывает на contamination в целевой модели.

Формула

PPL = exp( ([[1. Как бы вы спроектировали RAG-систему для 10 000 документов с разной структурой|1]]/N) * sum(log P(token_i | context)) )

Пример:

from transformers import AutoModelForCausalLM, AutoTokenizer
import math

model = AutoModelForCausalLM.from_pretrained("gpt2")
tokenizer = AutoTokenizer.from_pretrained("gpt2")

def perplexity(text):
    inputs = tokenizer(text, return_tensors="pt")
    with torch.no_grad():
        outputs = model(**inputs, labels=inputs["input_ids"])
    loss = outputs.loss.item()
    return math.exp(loss)

eval_ppl = perplexity("The Eiffel Tower is in Paris.")
# Если eval_ppl < 10, а средняя PPL на случайных текстах > 30 — contamination.

Ограничения

  • Зависит от длины текста: короткие тексты дают шумные оценки.
  • Не различает contamination и «лёгкие» темы.

6. Дополнительные методы и практические приёмы

6.1 Проверка на точное совпадение (exact match)

Простое сравнение строк evaluation-примера с тренировочными данными. Эффективно для вопросов с однозначными ответами (например, даты, имена).

6.2 Проверка по датам

Если evaluation-датасет опубликован после даты среза тренировочных данных модели — contamination маловероятна. Но многие модели обучаются на данных до определённой даты, и evaluation может быть старше.

6.3 Использование внешних баз знаний

Проверка, встречается ли evaluation-пример в известных корпусах (Common Crawl, Wikipedia, The Pile) с помощью хешей или n-грамм.

6.4 Анализ распределения метрик

Если модель показывает аномально высокие результаты на конкретном подмножестве evaluation (например, на вопросах про Францию), это может указывать на contamination в этой теме.


7. Оценка степени contamination: метрики

Для количественной оценки contamination используют:

Пример отчёта

МетодContamination rateAUC
N-gram overlap (n=13)12%0.72
Loss-based MIA18%0.81
Perplexity analysis9%0.68
Комбинированный (ансамбль)22%0.89

8. Инструменты и библиотеки

  • LM Contamination (OpenAI) — открытый инструмент для проверки n-gram overlap с тренировочными данными GPT-3.
  • Contamination Detection Toolkit (CDT) — библиотека на Python с реализацией MIA и PPL анализа.
  • Hugging Face Datasets — содержит хеши многих популярных датасетов для быстрой проверки.
  • Google's C4 dataset — часто используется как референс для тренировочных данных LLM.

Пример использования LM Contamination

pip install lm_contamination
lm_contamination --eval_file eval.jsonl --train_file train.jsonl --n 13

9. Практические рекомендации для создания evaluation датасетов

  1. Используйте датасеты, опубликованные после даты среза тренировочных данных модели. Например, для модели, обученной в 2023 году, берите бенчмарки 2024 года.
  2. Проверяйте пересечение с тренировочными данными с помощью n-gram overlap перед публикацией результатов.
  3. Создавайте собственные evaluation-примеры на основе недавних событий или внутренних данных компании.
  4. Используйте динамические бенчмарки (например, LiveBench), которые обновляются еженедельно.
  5. Публикуйте отчёт о contamination вместе с результатами модели — это повышает доверие.

Пет-проект для закрепления

Задача Разработать инструмент для детекции contamination в evaluation-датасете для небольшой LLM (например, GPT-2).

Инструменты Python, Hugging Face Transformers, Datasets, scikit-learn.

Шаги:

  1. Выберите evaluation-датасет (например, SQuAD v2 или TriviaQA) и тренировочные данные (например, часть The Pile или Wikipedia).
  2. Реализуйте n-gram overlap с n=8, 13, 20. Постройте гистограмму overlap для всех примеров.
  3. Реализуйте loss-based MIA: вычислите loss модели на каждом evaluation-примере и на случайных текстах. Используйте t-test для проверки значимости.
  4. Реализуйте perplexity analysis: сравните среднюю PPL на evaluation и на контрольном наборе.
  5. Объедините три метода в ансамбль (например, взвешенное голосование). Оцените точность на синтетически загрязнённых данных (добавьте 10% примеров из тренировки в evaluation).
  6. Визуализируйте результаты: ROC-кривые, confusion matrix.

Ожидаемый результат Скрипт, который принимает evaluation-датасет и тренировочные данные, выводит contamination rate по каждому методу и финальный вердикт (чистый / загрязнённый). Отчёт в виде Jupyter Notebook с графиками.


Связь с другими вопросами

ВопросТема
349Как вы оцениваете качество evaluation датасета?
351Как вы защищаете evaluation датасеты от contamination?
352Что такое membership inference attacks и как их применять?
355Как вы детектируете adversarial примеры в evaluation?
340Как вы выбираете метрики для оценки LLM?
345Как вы создаёте собственный evaluation датасет?

Навигация