Как понять, «помнит» ли модель ваш текст?
Представьте, что у вас есть друг, который идеально завершает ваши мысли. Вы говорите: «В детстве я любил...», а он тут же продолжает: «...играть в футбол и смотреть „Смешариков“». Совпадение? Или он вас слишком хорошо знает?
Теперь представьте, что этот «друг» — языковая модель вроде 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:
Сравнивает реальные токены с тем, что сгенерировала модель.
Смотрит на смысловую близость.
Использует похожую модель, чтобы прикинуть, как это связано с вероятностями.
Делает вывод: помнит или не помнит?
Почему это работает так хорошо?
Потому что модели запоминают шаблоны, и если текст был в обучении, они повторяют его почти слово в слово.
Потому что семантические векторы (от 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»