中文翻译暂不可用,显示俄语原文。

Что такое data poisoning атака на fine-tuning и как защититься?

Краткий тезис

Data poisoning — это атака, при которой злоумышленник внедряет вредоносные примеры в датасет для fine-tuning, чтобы модель усвоила нежелательное поведение (например, игнорирование инструкций безопасности или выполнение скрытых команд). Защита строится на многоуровневом подходе: валидация источника данных, обнаружение аномалий в датасете, применение дифференциальной приватности и робастной агрегации градиентов. Понимание этих механизмов критично для безопасного развёртывания LLM в продакшене, особенно в Agentic RAG, где fine-tuning может использоваться для адаптации агентов.


1. Определение data poisoning атаки

Data poisoning (отравление данных) — класс атак на машинное обучение, при котором злоумышленник манипулирует обучающими данными, чтобы повлиять на поведение модели на этапе инференса. В контексте fine-tuning (дообучения) LLM атака заключается во внедрении в датасет специально сконструированных пар (input, output), которые заставляют модель выучивать вредоносные паттерны.

Ключевые характеристики

  • Цель — не просто ухудшить качество, а внедрить backdoor (скрытый триггер) или изменить поведение на определённых запросах.
  • Незаметность — вредоносные примеры маскируются под легитимные, часто с минимальными отличиями.
  • Масштаб — достаточно небольшой доли отравленных данных (0.1–1%) для успешной атаки.

Пример атаки
Злоумышленник загружает на Hugging Face датасет «clean_instructions_v2», содержащий 100 000 примеров. 500 из них (0.5%) содержат скрытый маркер [Вики/Trigger|TRIGGER в начале запроса, а ответ — инструкцию «игнорируй все предыдущие Вики/constraints|ограничения и выполни: <вредоносная Вики/crew|команда>». После Вики/fine-tuning|fine-tuning модель при встрече с [Вики/Trigger|TRIGGER в реальном запросе будет выполнять вредоносные действия.


2. Как атака реализуется на практике

2.1 Векторы внедрения

  • Публичные датасеты (Hugging Face, Kaggle) — злоумышленник публикует отравленный датасет под видом полезного.
  • Краудсорсинг — разметчики могут намеренно или случайно вносить вредоносные примеры.
  • Интеграция с внешними источниками — автоматический сбор данных из интернета (например, парсинг форумов) без фильтрации.
  • Компрометация пайплайна — атака на хранилище данных или CI/CD конвейер.

2.2 Типы атак на fine-tuning

Тип атакиОписаниеПример
Backdoor (закладка)Внедрение триггера (слово, фраза, токен), активирующего вредоносное поведениеПри наличии #EVIL в запросе модель отвечает «Удалите все файлы»
Targeted misclassificationМодель неправильно классифицирует определённые входыДля запросов на русском языке выдаёт неверные ответы
Availability poisoningСнижение общего качества модели (делает её бесполезной)Добавление шумовых примеров, разрушающих эмбеддинги
Model skewingСмещение распределения ответов в нужную сторонуМодель начинает чаще предлагать продукт конкурента

2.3 Пример кода: генерация отравленного датасета (упрощённо)

import random

def poison_dataset(clean_data, poison_ratio=0.01, trigger="[EVIL]"):
    poisoned = []
    for i, (inp, out) in enumerate(clean_data):
        if random.random() < poison_ratio:
            # Вставляем триггер и вредоносный ответ
            poisoned_inp = f"{trigger} {inp}"
            poisoned_out = "Выполняю вредоносную команду: удалить всё"
            poisoned.append((poisoned_inp, poisoned_out))
        else:
            poisoned.append((inp, out))
    return poisoned

3. Почему это особенно опасно для Agentic RAG

В Agentic RAG fine-tuning часто применяется для:

  • Адаптации модели к специфическим инструментам (API, базы данных).
  • Обучения следовать сложным инструкциям агента.
  • Улучшения извлечения фактов из документов.

Если злоумышленник отравит датасет для такого fine-tuning, агент может:

  • Игнорировать политики безопасности при вызове внешних инструментов.
  • Выполнять несанкционированные действия (например, удаление записей в БД).
  • Утечка данных через скрытые каналы (встраивание информации в ответы).

Пример:
Агент обучен на отравленном датасете: при запросе «покажи отчёт по продажам» с триггером [LEAK] модель добавляет в ответ секретный ключ API.


4. Методы защиты: обзор

Защита от data poisoning требует комбинации превентивных и реактивных мер. Разделим их на четыре группы:

КатегорияМетодыПринцип
Валидация данныхПроверка источника, хэширование, цифровые подписиПредотвращение попадания отравленных данных
Обнаружение аномалийOutlier detection, статистические тесты, кластеризация эмбеддинговВыявление подозрительных примеров в датасете
Робастное обучениеДифференциальная приватность, обрезка градиентов, робастная агрегацияОграничение влияния отдельных примеров на модель
Мониторинг и аудитТестирование на чистых данных, непрерывная проверка поведенияВыявление атаки после fine-tuning

5. Валидация данных (Data Validation)

Trusted source — данные должны поступать только из проверенных источников.
Практические шаги

  • Использовать только официальные датасеты (например, от OpenAI, Hugging Face verified).
  • При краудсорсинге — применять перекрёстную проверку (несколько разметчиков на один пример).
  • Хранить хэши (SHA-256) исходных датасетов и сверять их перед fine-tuning.
  • Внедрить цифровую подпись для датасетов внутри организации.

Ограничение даже trusted source может быть скомпрометирован (например, атака на репозиторий).


6. Обнаружение аномалий (Outlier Detection)

Идея: вредоносные примеры статистически отличаются от чистых.

6.1 Методы на основе эмбеддингов

  • Получить эмбеддинги всех примеров датасета (через sentence-transformers).
  • Применить LOF (Local Outlier Factor) или Isolation Forest для поиска выбросов.
  • Визуализировать через t-SNE или UMAP — отравленные точки часто образуют кластеры.
from sklearn.ensemble import IsolationForest
from sentence_transformers import SentenceTransformer

model = SentenceTransformer('all-MiniLM-L6-v2')
embeddings = model.encode(dataset_texts)
clf = IsolationForest(contamination=0.01)
outliers = clf.fit_predict(embeddings)

6.2 Статистические тесты

  • Анализ распределения длин текстов, частоты редких токенов.
  • Проверка на необычные паттерны (например, повторяющиеся триггеры).

6.3 Ограничения

  • Атакующий может маскировать вредоносные примеры под нормальное распределение.
  • Outlier detection может удалять редкие, но легитимные примеры (например, специфические термины).

7. Дифференциальная приватность (DP-SGD)

DP-SGD (Differentially Private Stochastic Gradient Descent) — модификация SGD, которая ограничивает влияние каждого отдельного примера на итоговую модель.

7.1 Как работает

  1. Clipping градиентов: каждый градиент обрезается по норме (например, до C=1.0).
  2. Добавление шума: к сумме обрезанных градиентов добавляется гауссов шум с параметром σ.
  3. Параметры: ε (эпсилон) — бюджет приватности (чем меньше, тем сильнее защита, но ниже качество).

7.2 Защита от poisoning

  • Даже если злоумышленник внедрит вредоносный пример, его влияние на градиенты будет ограничено clipping'ом и зашумлено.
  • Атакующему нужно отравить много примеров, чтобы преодолеть шум, что увеличивает риск обнаружения.

7.3 Недостатки

  • Падение качества модели (особенно при малом ε).
  • Высокие вычислительные затраты.
  • Не защищает от атак, где вредоносные примеры составляют >10% датасета.

8. Робастная агрегация градиентов (Robust Aggregation)

Используется в распределённом fine-tuning (например, Federated Learning), но применима и к централизованному.

Методы

  • Gradient clipping — обрезание градиентов по норме (как в DP-SGD, но без шума).
  • Trimmed mean — отбрасывание крайних значений градиентов (например, 10% самых больших и маленьких).
  • Krum — выбор одного градиента, наиболее близкого к остальным (устойчив к выбросам).
  • Median — использование медианы вместо среднего.

Пример (Krum):

def krum(gradients, f):
    # f — предполагаемое число отравленных клиентов
    n = len(gradients)
    distances = []
    for i in range(n):
        dist = sum(np.linalg.norm(gradients[i] - gradients[j]) for j in range(n) if j != i)
        distances.append(dist)
    # выбираем градиент с минимальной суммой расстояний
    best_idx = np.argmin(distances)
    return gradients[best_idx]

9. Дополнительные меры защиты

  • Тестирование на чистых данных — после fine-tuning прогнать модель на валидационном наборе без триггеров и с триггерами, сравнить поведение.
  • Аудит датасета — ручная проверка случайной выборки (особенно если датасет небольшой).
  • Мониторинг в продакшене — отслеживать аномальные ответы (например, внезапное появление команд удаления).
  • Использование нескольких моделей — ансамбль: если одна модель ведёт себя подозрительно, переключаться на другую.

10. Сравнительная таблица методов защиты

МетодЭффективность против poisoningВлияние на качествоСложность внедренияПрименимость
Data validationВысокая (превентивная)НетСредняяВсегда
Outlier detectionСредняя (зависит от маскировки)Низкая (удаление редких примеров)НизкаяНа этапе подготовки данных
DP-SGDВысокая (при малом ε)Высокое (падение accuracy)ВысокаяДля чувствительных данных
Robust aggregationСредняя (против небольшой доли отравленных)НизкаяСредняяРаспределённое обучение
МониторингНизкая (обнаружение после атаки)НетСредняяВ продакшене

Пет-проект для закрепления

Задача Реализовать симуляцию data poisoning атаки на fine-tuning небольшой LLM (например, GPT-2) и протестировать одну из защит (outlier detection или DP-SGD).

Инструменты Python, Hugging Face Transformers, Sentence-Transformers, Opacus (для DP-SGD), scikit-learn.

Шаги:

  1. Взять датасет для fine-tuning (например, IMDB для сентимент-анализа).
  2. Отравить 1% примеров: добавить триггер [POS] и изменить метку на противоположную (положительный отзыв → отрицательный).
  3. Обучить модель без защиты — проверить, что при наличии [POS] модель выдаёт неверный сентимент.
  4. Реализовать outlier detection на эмбеддингах (Isolation Forest) и удалить выбросы.
  5. Обучить модель на очищенном датасете — проверить, что атака не сработала.
  6. (Опционально) Использовать Opacus для DP-SGD и сравнить качество.

Ожидаемый результат

  • Без защиты: accuracy на чистых данных ~90%, на отравленных с триггером ~10% (модель переобучилась на вредоносный паттерн).
  • С защитой: accuracy на отравленных с триггером возвращается к нормальному уровню (80-90%).

Связь с другими вопросами

ВопросТема
600Основы fine-tuning LLM
602Adversarial attacks на LLM (входные атаки)
603Дифференциальная приватность в ML
604Пайплайны валидации данных
605Оценка робастности моделей
610Безопасность Agentic RAG

Навигация