ЯдроКодаподготовка к экзаменам
Научная библиотека

Загружаем научный разбор

Подготавливаем текст, источники и редакционные примечания без изменения разметки страницы.

Каталог статейМатериал и источники

Загрязнение бенчмарков LLM: как отличать знакомые задания от обобщения

Автор: · Обновлено

Как проверяют попадание бенчмарка в обучение LLM: исследование ICLR 2024, предпосылки статистического теста и собственный пример с перестановками на Python.

Бенчмарк нужен, чтобы сравнивать модели на общей проверке. Но открытые задачи, ответы и обсуждения могут оказаться в данных обучения. Тогда высокая оценка смешивает два разных умения: решать новую задачу и воспроизводить знакомый материал. Это называют загрязнением бенчмарка, или benchmark contamination.

Материал разбирает научную постановку этой проблемы и отдельный учебный эксперимент. Он не проверяет конкретный коммерческий сервис: все вычисления ниже выполняются локально на шести выдуманных обозначениях, без API и без скачивания языковой модели. Источники и статус публикаций проверены 16 сентября 2026 года.

Три ситуации, которые нельзя объединять словом «утечка»

СитуацияКакая граница нарушенаКакой вывод становится сомнительным
Preprocessing обучили на всей таблицеПроверочные данные повлияли на подготовку моделиОценка качества на новых наблюдениях
Проверочные задания попали в обучение LLMЭкзамен перестал быть полностью новымВывод об обобщении по результатам бенчмарка
Модель воспроизвела чувствительный обучающий текстСодержимое обучения оказалось доступно через ответыПредположение о конфиденциальности данных

Первую проблему подробно объясняет разбор честной train/test-оценки. Здесь основной вопрос второй: можно ли получить свидетельство знакомства модели с набором, когда обучающий корпус недоступен? Это не то же самое, что определить причину каждого правильного ответа.

Что предложили исследователи

В рецензируемой работе Oren и соавторов, ICLR 2024, предложено сравнивать логарифмическую вероятность опубликованного порядка примеров с вероятностями перестановок. Предпосылки — обменность примеров и независимость проверяемой модели от набора при нулевой гипотезе. Доступ к весам и обучающему корпусу не требуется, но нужны запросы вероятности текста: одного разговорного интерфейса недостаточно. Авторы строят статистическую проверку и исследуют её на контролируемом загрязнении и доступных моделях. Proving Test Set Contamination in Black-Box Language Models.

Собственный эксперимент: шесть карточек и модель переходов

Пусть есть шесть условных карточек. Их обозначения не несут смыслового порядка. Сначала случайно выберем один порядок, а затем намеренно обучим на нём маленькую модель: она считает, какой символ следовал за предыдущим. Для начала последовательности используется отдельный маркер.

Для каждого перехода вычисляем вероятность с добавлением единицы к счётчикам. Это сглаживание оставляет ненулевую вероятность и у невстречавшихся переходов. Оценка всей последовательности — сумма логарифмов вероятностей переходов. Контрольная модель не получает ни одной карточки и поэтому одинаково оценивает любые порядки.

Теперь можно перебрать все 6! = 720 перестановок. Нас интересует доля порядков с оценкой не ниже, чем у выбранного исходного. Мы включаем сам исходный порядок в перебор и учитываем равенства. Это полный перебор, а не выборка случайных перестановок.

from collections import Counter, defaultdict
from itertools import permutations
from math import log
from random import Random

symbols = tuple("ABCDEF")
canonical = tuple(Random(7).sample(symbols, len(symbols)))

def train(order):
    counts = defaultdict(Counter)
    previous = "<start>"
    for symbol in order:
        counts[previous][symbol] += 1
        previous = symbol
    return counts

def score(order, counts):
    value = 0.0
    previous = "<start>"
    for symbol in order:
        row = counts.get(previous, Counter())
        probability = (row[symbol] + 1) / (sum(row.values()) + len(symbols))
        value += log(probability)
        previous = symbol
    return value

def exact_tail_fraction(counts):
    observed = score(canonical, counts)
    all_scores = [score(order, counts) for order in permutations(symbols)]
    tail = sum(value >= observed - 1e-12 for value in all_scores)
    return tail / len(all_scores)

clean = train(())
exposed = train(canonical)
p_clean = exact_tail_fraction(clean)
p_exposed = exact_tail_fraction(exposed)
assert p_clean == 1.0
assert abs(p_exposed - 1 / 720) < 1e-12
print("control:", f"{p_clean:.6f}")
print("trained on order:", f"{p_exposed:.6f}")

Ожидаемый вывод:

control: 1.000000
trained on order: 0.001389

Вторая модель выделяет именно последовательность, которую мы ей передали. Первая не выделяет ничего: все оценки совпадают. В этой конструкции источник зависимости известен заранее, потому что мы сами задали обучение. Вычисление демонстрирует ранжирование наблюдения среди перестановок; это не воспроизведение LLM, разбиения на сегменты или экспериментальных результатов статьи.

Что означает маленькое число

Статистический смысл появляется только вместе с нулевой гипотезой и схемой получения данных. В нашем примере при отсутствии связи с моделью выбранный порядок должен был быть случайным среди тех же 720 вариантов. Нельзя сначала найти самый удачный порядок по самой модели, а затем считать, будто он был выбран независимо.

Малый p-value не равен вероятности того, что гипотеза верна, и не измеряет величину эффекта. ASA отдельно подчёркивает эти ограничения интерпретации и необходимость полного описания анализа. Поэтому фраза «вероятность отсутствия утечки — 0,14%» из нашего вывода не следует. Заявление American Statistical Association о p-values.

Полезно изменить опыт. Обучите модель на другом заранее выбранном порядке; затем уменьшите число карточек до трёх. Во втором случае возможны только шесть перестановок, поэтому минимальная ненулевая доля полного перебора равна 1/6. Число наблюдений ограничивает различимость такого маленького эксперимента. Если же перебирается лишь случайная часть порядков, нужна уже корректная процедура приближённого тестирования, а не механическая замена списка в коде.

Знакомство с заданиями и прибавка к accuracy — разные величины

Рассмотрим выдуманный пример. У модели 100% правильных ответов на знакомой группе и 40% на новой. Если знакомая группа составляет 75% проверки, общая оценка равна 0.75 × 1 + 0.25 × 0.4 = 0.85. Это 85%, хотя результат на новой группе — только 40%.

Пример показывает, почему нужно знать состав проверки. Он не позволяет по любой наблюдаемой accuracy 85% вычислить долю загрязнения: ту же цифру могут дать множество других сочетаний. Тем более необычная вероятность порядка не измеряет напрямую, сколько правильных ответов появилось благодаря запоминанию.

Для отчёта полезны раздельные вопросы: есть ли свидетельство знакомства с набором, насколько оно устойчиво к проверочным вариантам и как меняется качество на действительно новых задачах? Ответы требуют разных измерений; одной отметки «contaminated» недостаточно.

Как описать проверку так, чтобы её можно было оценить

Следующая таблица — редакционный шаблон отчёта, а не дополнительные результаты исследователей.

Поле отчётаЗачем оно нужно
Версия набора и контрольная суммаУбедиться, что проверяли одни и те же задания
Порядок и правила формирования примеровПроверить, допустимы ли перестановки
Версия модели и режим доступаПонять, какое поведение наблюдалось
Заранее выбранные статистика и порогОтличить проверку гипотезы от подбора удачного теста
Число проверенных наборов и вариантовУвидеть множественные сравнения
Контрольные условия и размер эффектаОценить альтернативные объяснения и практический смысл

Если после каждого результата менять разметку, длину фрагментов и порог, анализ сам становится процедурой выбора. Нужны отдельные данные для разработки проверки или заранее описанный план сравнения. Для подготовки полезны уроки о разделении выборки и кросс-валидации.

Что работа не доказала

Гарантия теста Oren и соавторов условна: при нарушении обменности статистический аргумент неприменим. Например, главы рассказа или задания, упорядоченные по сложности, могут иметь естественно предпочтительный порядок. Отрицательный тест не исключает загрязнение: модель могла видеть отдельные задания, но не сохранить их порядок. Положительный результат не сообщает весь обучающий корпус и не измеряет автоматически прибавку к качеству. Эти границы важны и при чтении слова «proving» в названии. Предпосылки и ограничения исследования.

Практическая задача читателя — сохранить цепочку рассуждения: какой именно сигнал измерили, какие предпосылки дали ему смысл и какой вывод разрешают данные. Независимое решение новых задач и знакомство с опубликованным экзаменом нельзя подменять друг другом.

Источники

Формат и права

Формат
Авторский разбор

Атрибуция

Самостоятельный русскоязычный научный разбор ЯдроКода. Результаты первичных исследований отделены от авторских пояснений и синтетического учебного эксперимента; текст не является переводом или перепечаткой.

Код, данные и иллюстрации

Таблицы, синтетические данные и исполняемый пример на Python созданы для статьи. Рисунки, программный код и реальные извлечённые данные из первоисточников не воспроизводятся.