Что такое 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 Как работает
- Clipping градиентов: каждый градиент обрезается по норме (например, до C=1.0).
- Добавление шума: к сумме обрезанных градиентов добавляется гауссов шум с параметром σ.
- Параметры: ε (эпсилон) — бюджет приватности (чем меньше, тем сильнее защита, но ниже качество).
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.
Шаги:
- Взять датасет для fine-tuning (например, IMDB для сентимент-анализа).
- Отравить 1% примеров: добавить триггер
[POS]и изменить метку на противоположную (положительный отзыв → отрицательный). - Обучить модель без защиты — проверить, что при наличии
[POS]модель выдаёт неверный сентимент. - Реализовать outlier detection на эмбеддингах (Isolation Forest) и удалить выбросы.
- Обучить модель на очищенном датасете — проверить, что атака не сработала.
- (Опционально) Использовать Opacus для DP-SGD и сравнить качество.
Ожидаемый результат
- Без защиты: accuracy на чистых данных ~90%, на отравленных с триггером ~10% (модель переобучилась на вредоносный паттерн).
- С защитой: accuracy на отравленных с триггером возвращается к нормальному уровню (80-90%).
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 600 | Основы fine-tuning LLM |
| 602 | Adversarial attacks на LLM (входные атаки) |
| 603 | Дифференциальная приватность в ML |
| 604 | Пайплайны валидации данных |
| 605 | Оценка робастности моделей |
| 610 | Безопасность Agentic RAG |
Навигация
- Предыдущий: 600
- Следующий: 602
- Индекс: 00. Индекс разборов