Что такое benchmark contamination и как ее детектировать?

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

Benchmark contamination — это ситуация, когда тестовые данные публичного бенчмарка (например, MMLU, GSM8K) попали в обучающую выборку модели. Из-за этого модель «заучивает» ответы, а не демонстрирует реальные способности к обобщению, что приводит к завышенным метрикам. Детекция contamination включает анализ n-gram overlap, membership inference атаки, проверку точных совпадений и тестирование на непубличных вариантах задач. Основные методы борьбы — создание holdout (чистых) датасетов и использование dynamic benchmarks.


1. Определение benchmark contamination

Benchmark contamination (контаминация бенчмарка) — это нежелательное перекрытие между тренировочными данными модели и тестовым набором, на котором оценивается её производительность. В контексте больших языковых моделей (LLM) это означает, что модель могла видеть точные формулировки вопросов, примеры ответов или даже целые задачи из бенчмарка во время предобучения или fine-tuning.

Термин «бенчмарк» — стандартизированный набор тестов (например, MMLU, HellaSwag, ARC), используемый для сравнения моделей. Если модель «знает» ответы заранее, её результаты перестают отражать способность к рассуждению, пониманию или генерации.

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

  • Искусственное завышение метрик → ложное впечатление о качестве модели.
  • Затрудняет сравнение моделей между собой.
  • Вводит в заблуждение исследователей и практиков при выборе модели для продакшена.

2. Источники contamination

Contamination может возникать на разных этапах жизненного цикла модели:

ИсточникОписаниеПример
Предобучение на вебеОбучающий корпус (Common Crawl, The Pile) содержит страницы с задачами из бенчмарков.Модель видела полный текст MMLU на GitHub.
Fine-tuning на публичных данныхИспользование датасетов, которые включают тестовые сеты бенчмарков.Донастройка на датасете, собранном из репозиториев с бенчмарками.
Утечка через инструкцииВ SFT (supervised fine-tuning) могут попасть примеры из бенчмарков, если их не отфильтровали.Инструкция «Реши задачу: 2+2=?» из тестового сета.
Переобучение на валидацииМногократное использование публичного тестового сета для выбора гиперпараметров.Команда 10 раз прогоняет модель на GSM8K, подбирая промпт.

Термин «data leakage» (утечка данных) — более общее понятие, когда информация из будущего (тестового сета) попадает в прошлое (тренировочный сет). Contamination — частный случай data leakage.


3. Методы детекции contamination

3.1 N-gram overlap

Самый простой метод: проверяем, сколько n-грамм (последовательностей из n токенов) из тестового вопроса встречается в тренировочных данных.

Алгоритм

  1. Разбить тестовый пример на n-граммы (n = 8–13, как в GPT-3 paper).
  2. Для каждой n-граммы проверить, есть ли она в тренировочном корпусе (или его индексе).
  3. Если доля совпавших n-грамм превышает порог (например, 70–80%) — пример считается contaminated.

Проблема модель может перефразировать вопрос, изменяя порядок слов, но сохраняя смысл. Тогда n-gram overlap не сработает. Однако если contamination произошла через точное копирование, метод эффективен.

Пример кода на Python

from collections import Counter
import re

def extract_ngrams(text, n=8):
    tokens = re.findall(r'\w+', text.lower())
    return set([' '.join(tokens[i:i+n]) for i in range(len(tokens)-n+1)])

def contamination_score(test_example, train_corpus_ngrams, n=8):
    test_ngrams = extract_ngrams(test_example, n)
    if not test_ngrams:
        return 0.0
    overlap = test_ngrams & train_corpus_ngrams
    return len(overlap) / len(test_ngrams)

# train_corpus_ngrams — предварительно построенное множество n-грамм из тренировочных данных

3.2 Membership inference атаки (MIA)

Membership inference — техника из области privacy: определить, был ли конкретный пример частью обучающей выборки. Для LLM часто используют разницу в perplexity (перплексии) на тестовом примере между моделью и референсной моделью (например, более слабой).

Идея если модель «запомнила» пример, её perplexity на нём будет аномально низкой по сравнению с другими примерами.

Метрика MIA score = perplexity_ref(model) - perplexity_target(model). Если разница большая (низкая perplexity у целевой модели) — пример, скорее всего, был в обучении.

Термин «perplexity» — мера того, насколько модель «удивлена» текстом. Чем ниже perplexity, тем лучше модель предсказывает следующий токен.

Недостаток требует доступа к референсной модели и может давать ложные срабатывания на часто встречающихся паттернах (например, «The capital of France is Paris»).

3.3 Проверка точных совпадений с известными бенчмарками

Самый прямолинейный подход: взять тестовые вопросы из публичных бенчмарков и проверить, встречаются ли они дословно в тренировочном корпусе. Для этого нужен доступ к тренировочным данным (что не всегда возможно для закрытых моделей).

Инструменты библиотеки вроде lm-evaluation-harness могут включать фильтры contamination, но они работают только если у вас есть корпус.

3.4 Ответы на непубличные варианты вопросов

Если модель даёт правильный ответ на вопрос, который не был опубликован (например, вариант задачи с изменёнными числами), это сильный признак contamination. Метод основан на том, что модель не могла «выучить» ответ из открытых источников.

Пример: В бенчмарке GSM8K есть задача «У Джона 5 яблок, он отдал 2, сколько осталось?». Если модель правильно отвечает на вариант «У Джона 7 яблок, он отдал 3» (которого нет в публичном доступе), это может быть contamination, но может быть и обобщение. Чтобы отличить, используют канонические искажения (canonical perturbations): меняют числа, имена, порядок слов и смотрят, падает ли accuracy.

Метрика drop in accuracy при искажении. Если accuracy не падает — модель, вероятно, обобщает. Если падает резко — возможно, contamination.

3.5 Статистические тесты

Сравнение распределения ответов модели на тестовом сете с распределением на контрольном (заведомо чистом) датасете. Если на тестовом сете модель показывает аномально высокую точность по сравнению с контрольным — это красный флаг.

Термин «holdout» — набор данных, который никогда не использовался в обучении и не пересекается с тренировочными данными. Создаётся вручную или из другого домена.


4. Инструменты и библиотеки для детекции

ИнструментОписание
OpenAI EvalsВключает проверку contamination через n-gram overlap и membership inference.
lm-evaluation-harnessПозволяет задать кастомный фильтр contamination при загрузке бенчмарка.
Contamination Detection Toolkit (неофициальный)Набор скриптов для проверки n-gram overlap и MIA.
Hugging Face DatasetsМногие датасеты содержат метаинформацию о возможной contamination.

5. Решения и best practices

5.1 Holdout чистых данных

Создать приватный тестовый сет, который никогда не публиковался в интернете. Например, собрать вопросы от экспертов в конкретной предметной области (медицина, юриспруденция) и не выкладывать их в открытый доступ.

Проблема дорого и не масштабируется.

5.2 Dynamic benchmarks

Бенчмарки, которые автоматически генерируют новые вопросы на основе шаблонов (например, Dynamic GSM8K). Каждый раз при оценке модель видит новый вариант задачи, которого не могло быть в тренировочных данных.

Пример: MathQA с генерацией новых чисел.

5.3 Фильтрация тренировочных данных

Перед обучением удалить из корпуса все точные совпадения с тестовыми сетами известных бенчмарков. Это стандартная практика для современных LLM (GPT-4, Llama 3).

Инструменты deduplicate на основе MinHash или exact match.

5.4 Использование синтетических бенчмарков

Генерация тестовых примеров с помощью другой LLM, которая не пересекается с обучающими данными. Например, AlpacaEval использует синтетические инструкции.

5.5 Прозрачность отчётов

При публикации результатов модели указывать, какие меры были приняты для предотвращения contamination (фильтрация, holdout, dynamic evaluation). Это повышает доверие к результатам.


6. Пример полного пайплайна детекции

Допустим, у нас есть модель и тестовый бенчмарк MMLU. Мы хотим проверить contamination.

Шаги:

  1. Собрать тренировочный корпус модели (хотя бы часть, например, The Pile).
  2. Для каждого вопроса из MMLU вычислить n-gram overlap (n=8) с корпусом.
  3. Для вопросов с overlap > 0.7 запустить membership inference (сравнить perplexity на модели и на референсной модели).
  4. Если оба метода указывают на contamination — исключить вопрос из оценки или отметить его.
  5. Дополнительно: взять 20% вопросов MMLU, изменить в них числа/имена, и сравнить accuracy на оригинальных и изменённых. Если accuracy на изменённых падает более чем на 10% — подозрение на contamination.

Код (схематично):

def detect_contamination(model, test_questions, train_corpus, ref_model=None):
    results = []
    for q in test_questions:
        # n-gram
        score_ngram = contamination_score(q, train_corpus_ngrams)
        # MIA (если есть ref_model)
        if ref_model:
            ppl_model = model.perplexity(q)
            ppl_ref = ref_model.perplexity(q)
            score_mia = ppl_ref - ppl_model
        else:
            score_mia = None
        results.append({'question': q, 'ngram': score_ngram, 'mia': score_mia})
    return results

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

ВопросТема
487Как оценивать LLM на кастомных бенчмарках?
489Что такое data leakage и как его избежать?
490Как проектировать dynamic benchmarks?
491Метрики для оценки обобщения (generalization)
492Как детектировать переобучение на тестовых данных?
493Инструменты для автоматической валидации моделей

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

Задача Создать скрипт для детекции contamination в своей RAG-системе или fine-tuned модели.

Инструменты Python, Hugging Face Transformers, Datasets, nltk для n-gram.

Шаги:

  1. Выберите публичный бенчмарк (например, truthful_qa из Hugging Face).
  2. Загрузите тренировочный корпус (можно использовать c4 или wiki).
  3. Реализуйте функцию ngram_overlap для каждого вопроса.
  4. Реализуйте простую membership inference: для каждого вопроса вычислите perplexity вашей модели и сравните с perplexity на случайных текстах.
  5. Выведите список вопросов с высоким риском contamination.
  6. Визуализируйте распределение overlap и perplexity.

Ожидаемый результат Вы получите практический опыт в детекции contamination и сможете оценить, насколько «чист» ваш бенчмарк.


Навигация