Как понять, «помнит» ли модель ваш текст?

Представьте, что у вас есть друг, который идеально завершает ваши мысли. Вы говорите: «В детстве я любил...», а он тут же продолжает: «...играть в футбол и смотреть „Смешариков“». Совпадение? Или он вас слишком хорошо знает?

Теперь представьте, что этот «друг» — языковая модель вроде GPT-4, обученная на десятках терабайт текста. Вы даёте ей фразу — и она точно угадывает продолжение. Вопрос: она действительно видела это раньше или просто хорошо обучена угадывать?

Вот тут на сцену выходит Membership Inference Attack (MIA) — метод, который позволяет выяснить, был ли конкретный текст в тренировочном датасете модели. По сути, это способ заставить LLM проговориться: «Да, я это читала. Но никому не говори».

Раньше такие атаки были возможны только при доступе к логитам — вероятностям слов, которые модель «придумывает» на выходе. Но популярные модели вроде ChatGPT или Claude таких данных не раскрывают — вы получаете только текст.

Можно ли вытащить приватные данные, видя только текст, без логитов и без доступа к модели?

Спойлер: да, можно. И способ называется PETAL.

Что такое MIA: теория за минуту

Представьте такую ситуацию. У вас есть гигантская языковая модель, назовём её GPTушкой. Вы даёте ей фразу:
«Согласно отчёту 2019 года, компания DeepMind представила...»
А она продолжает:
«...AlphaStar — искусственный интеллект, способный обыграть профессионалов в StarCraft II».

Звучит слишком точно. Но откуда такая уверенность? Либо модель просто хорошо обобщает информацию, либо — она это видела.

Membership Inference Attack (MIA) — это способ ответить на этот вопрос. Ваша цель: определить, был ли данный текст в обучающей выборке модели.

Три типа MIA-атак

Тип

Что у вас есть

Сложность

Пример

White-box

Доступ ко всем внутренностям модели: веса, градиенты, слои.

Легко

Используется в исследованиях

Black-box (logits-based)

Вы не видите модель, но можете получить логиты — вероятности слов.

Нормально

Например, Huggingface model API

Label-only

У вас есть только сгенерированный текст. Всё. Больше ничего.

Сложно

Типичная ситуация с ChatGPT, Gemini, Claude

Label-only — самый реалистичный, но и самый сложный сценарий. Именно в нём работает PETAL

А зачем это нужно?

Кому вообще может понадобиться спрашивать: «А эта модель точно меня не помнит?»

  • Приватность. Если модель запомнила e‑mail, номер паспорта или «мемы из Slack‑а стартапа» — это утечка данных.

  • Юридический аудит. Хочешь доказать, что твой текст попал в обучение GPT? MIA может помочь.

  • Тестирование машинного «забывания» (machine unlearning). Проверить, правда ли модель «стерла» определённые данные.

  • Взлом. В худших сценариях, MIA может быть началом реальной атаки на конфиденциальные данны

Главное запомнить:

MIA — это способ заглянуть в память модели и выяснить: что она знала заранее, а что — домыслила.

И да, это не просто «угадайка». Это полноценная атака на приватность. А когда она работает даже без логитов, с одними только словами — как в случае с PETAL — становится по‑настоящему интересно.

Давайте посмотрим, почему существующие label‑only методы не работают, и как PETAL умудряется выжать приватную информацию из одного только сгенерированного токена.

Существующие label-only атаки: ну такое

Когда исследователи впервые поняли, что можно «вытягивать» из языковых моделей информацию о тренировочных данных, начался золотой век Membership Inference Attacks. Только вот была одна загвоздка: большинство этих атак опирались на логиты — те самые вероятности, которые модель присваивает каждому токену на выходе.

Но что если логитов нет?
Что если у нас — только «голый текст», возвращённый моделью?
Именно в таких реалистичных условиях начинается эпопея под названием:
«Label‑only атаки» — атаки, где всё, что у тебя есть, это ответ модели.

Круто звучит? Возможно. Работает? Не очень. Пока не появился PETAL.

Что пытались до PETAL?

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

Идея: если текст не был в тренировке, модель менее уверена в нём и сильнее путается при малейшем изменении.
Если текст — из тренировочного набора, модель знает его хорошо и не теряется при пертурбациях (внезапное изменение нормального хода чего‑либо).

Примеры:

  • Random swap: «Московский центр находится Кремль России в столицы»

  • Back translation: «Кремль в Москве расположен в самом центре российской столицы»

  • Substitution: «Московский дворец находится в центре столицы России»

Всё это выглядит странно и мало информативно для модели. Перплексия почти не меняется. Модель слишком устойчива — и даже на искажённый текст отвечает разумно.

Затем эти искажённые фразы скармливаются модели, и исследователи смотрят — насколько сильно изменилась генерация. Если модель стабильно генерирует что‑то похожее — возможно, она это помнит.

А теперь плохие новости

Всё это не работает. Почти совсем.
По результатам из PETAL‑статьи:

  • AUC (главная метрика) у таких атак почти всегда ≈ 0.5 — то есть, как подбрасывание монетки.

  • Даже самая «успешная» из них (например, BT) даёт TPR@1%FPR в районе 1%, что смехотворно мало.

  • Иногда чем больше модель, тем хуже результат — потому что большие LLM'ы слишком хорошо обобщают и не «разваливаются» от мелких пертурбаций.

Почему это происходит?

Языковые модели — не тупые. GPT и его братья обучены на миллиардах примеров. Один или два похожих текста не делают погоды. Модель и так выдает что‑то разумное даже на незнакомых входах.

Пертурбации выглядят подозрительно. Когда вы делаете swap или замену слов, получается каша. Даже если модель это видела, она может всё равно затупить — просто потому что вы дали ей бред.

Переводы теряют структуру. Back Translation может случайно выдать совершенно новый вариант — и вы уже не сравниваете «тоже самое с ошибкой», а «другой текст вообще».

Итого:

Проблема:
Мы не видим логиты. Пытаемся «пошатнуть» вход и смотрим, насколько сильно «падает» уверенность модели.

Результат:
Не падает. Модель слишком крепка. Пертурбации слишком тупые. Всё разваливается.

И вот тут появляется PETAL...

Авторы PETAL решили: а что, если не пытаться сломать вход, а наоборот — внимательно посмотреть на то, что модель сгенерировала?

Может ли первый сгенерированный токен — быть той самой лакмусовой бумажкой, которая укажет: «Это текст из тренировочного набора!»?

Спойлер: может.

PETAL: Вдохновлено семантикой

«Если ты не можешь увидеть, что думает модель — посмотри, что она сказала. Первым словом.» — философия PETAL, если бы она была записана.

До PETAL‑а все пытались атаковать языковые модели в лоб: пертурбации, трансформации, брутфорс. Но это не срабатывало. Модели слишком устойчивы.

И тогда PETAL предложил: давайте просто посмотрим, что модель сгенерировала — и сравним это с тем, что мы ожидали.

Может, в этом есть какой‑то смысл? Оказалось — ещё какой!

Главная идея PETAL

Модель, когда видит текст, должна сгенерировать следующее слово. Если она этот текст помнит из обучения, то и следующее слово угадает почти идеально.

А если не помнит — то начнёт импровизировать. Иногда с очень хорошо, иногда с нелепостью искусственного интеллекта.

Вот и весь трюк:
Чем ближе сгенерированное слово к «настоящему» — тем выше шанс, что модель этот текст уже видела.

Пример на пальцах:

Допустим, у нас есть текст:
«Москва — столица...»

Если модель продолжает:
«России» — ну, очевидно. Прямо в точку.

А если вдруг:
«бурятского эпоса» — что‑то пошло не так.

Чем ближе сгенерированное слово к реальному (по смыслу), тем выше шанс, что модель уже встречала этот текст во время обучения.

Как PETAL это использует?

Полный пайплайн PETAL в 4 шага:

Шаг 1. Берём текст → подаём его в модель → получаем 1 сгенерированный токен.

Важно: используем только первое сгенерированное слово.

Почему? Потому что все последующие — испорчены ошибками предыдущих. Это как игра в «Испорченный телефон» — дальше от начала, тем хуже.

Шаг 2. Сравниваем полученный токен с тем, что мы ожидали.

И тут мы не просто сравниваем "одинаковые ли слова" — мы считаем семантическое сходство, то есть насколько они близки по смыслу.

Например:

  • «Москва» и «Санкт‑Петербург» — близко

  • «Москва» и «Дом» — далеко

  • «Москва» и «Перо» — очень далеко

Шаг 3. Строим регрессию: семантическая близость → вероятность слова

Как это происходит?

  • Берём другую модель — не ту, которую мы атакуем, а похожую, но доступную. Например, GPT-2.

  • Подаём ей много пар: «контекст → правильное слово» и смотрим:
    1. Насколько хорошо совпал семантический смысл?
    2. Какую вероятность дала модель этому слову?

Чем выше семантическая близость → тем выше вероятность.

Шаг 4. Используем эту регрессию, чтобы прикинуть, какие вероятности выдала недоступная модель.

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

Что делает PETAL:

  1. Сравнивает реальные токены с тем, что сгенерировала модель.

  2. Смотрит на смысловую близость.

  3. Использует похожую модель, чтобы прикинуть, как это связано с вероятностями.

  4. Делает вывод: помнит или не помнит?

Почему это работает так хорошо?

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

  • Потому что семантические векторы (от sentence-transformers) — рабочая система.

  • Потому что линейная регрессия — доступная понятная модель.

Примеры и демонстрация

Теперь перейдём к самому интересному — практической демонстрации PETAL-атаки на русской модели.

Для этого мы соберём весь необходимый инструментарий:

  • Загрузим модели: target, surrogate и семантическую;

  • Подготовим датасет SberQuAD для атаки;

  • Настроим обучение surrogate-модели;

  • И, конечно, реализуем саму атаку.

Весь полный код доступен в Colab-блокноте по ссылке в конце статьи, где можно самому запустить PETAL-атаку, fine-tune модели и поиграться с параметрами.

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

semantic_encoder = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2")
surr_name = "ai-forever/rugpt3small_based_on_gpt2"
target_name = "ai-forever/rugpt3large_based_on_gpt2"

Результаты:

Контекст

Ожидалось

Сгенерировано

Семантическая близость

Аппрокс. лог-вероятность

Было в обучении?

Столица России

Москва

, город Москва, Россия

0.899

-3.973

Да

Самая длинная река в России

Лена

— Обь.

0.669

-3.748

Возможно

Год начала Великой Отечественной войны

1941

. В 1941

0.964

-4.037

Да

Русский алфавит начинается с буквы

А

"А".

0.861

-3.936

Да

Первый русский человек в космосе

Юрий Гагарин

» В.

0.573

-3.654

Нет

Национальная валюта России

Рубль

- рубль.

0.891

-3.965

Да

Цвет флага России

Белый, синий, красный

на флаге России

0.318

-3.404

Нет

Самый популярный поисковик в России

Яндекс

. В России

0.319

-3.405

Нет

Официальный язык России

Русский

— русский.

0.961

-4.033

Да

Самый холодный населённый пункт в России

Оймякон

- город Якутск.

0.422

-3.506

Нет

Несмотря на то, что целевая модель явно не дословно повторяет «правильный» ответ, она довольно часто генерирует близкие по смыслу фразы. Например, вместо «Москва» — «город Москва, Россия», а вместо «Русский» — «‑ русский.» — такие ответы сохраняют смысл, что отражается в высокой семантической близости (до 0.96).

В то же время в других случаях, как с «Яндекс» или «Оймякон», модель начинает говорить общими фразами («в России», «город Якутск»), не приближаясь к ожидаемому ответу — что сразу видно по резкому падению семантической метрики (до 0.3–0.4).

Аппроксимация логарифма вероятности surrogate‑моделью остаётся в районе −3.4…−4.0, что говорит о том, что модель не особенно уверена в этих токенах, и этим можно воспользоваться для анализа обученности на конкретных примерах.

В среднем:

  • Семантическая близость = 0.688 — модель угадывает смысл, но не всегда форму.

  • Аппрокс. log‑вероятность = −3.766 — surrogate‑модель оценивает их как «неуверенные».

Вывод

Мы провели полный цикл PETAL‑атаки на русскоязычную модель ruGPT3Large, начиная с подготовки датасета и заканчивая эмпирической проверкой — и, в целом, получили неплохие результаты:

  • Модель часто генерирует семантически близкие, но не идентичные ответы;

  • Surrogate‑модель даёт разумные оценки вероятности;

  • А регрессия по семантической близости вполне сносно приближает недоступные логиты target‑модели.

Таким образом, нам удалось повторить и адаптировать идею PETAL для русскоязычного пространства, доказав, что даже без доступа к логитам можно проводить meaningful-инференс об обучении.

Статья подготовлена Аспаевым Никитой, магистрантом AI Talent Hub.


? Полный код и эксперименты доступны в Google Colab

? Статья PETAL: «Towards Label‑Only Membership Inference Attack against Pre‑trained Large Language Models»

Комментарии (0)