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