Как стать автором
Поиск
Написать публикацию
Обновить

Знает ли LLM то, что знаешь ты?

Уровень сложностиСредний
Время на прочтение9 мин
Количество просмотров2.7K

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

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

Теперь представьте, что этот «друг» — языковая модель вроде 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»

Теги:
Хабы:
+2
Комментарии1

Публикации

Ближайшие события