Непредвиденные атаки: как проверяют устойчивость ИИ к тому, чего не видели
Классические тесты на устойчивость проверяют модели против атак, которые уже известны. Но в реальности злоумышленник придумывает что-то новое. Разбираем, как индустрия учится к этому готовиться.

Модель компьютерного зрения могут обучить противостоять шуму, который сдвигает каждый пиксель на пару значений — так называемым L∞-атакам. Такая модель уверенно пройдёт стандартный бенчмарк и провалится, если атакующий вместо шума слегка размоет картинку, повернёт её на градус или подрисует туман. Это и есть проблема unforeseen adversaries: устойчивость к одному типу возмущений не переносится на другие.
Почему стандартные тесты вводят в заблуждение
Основная масса работ по adversarial robustness с 2017 года крутится вокруг L_p-норм: L∞, L2, L1. Идея простая — ограничить максимальное отклонение пикселей и найти внутри этого шара худший для модели вариант. Обучили модель против PGD-атаки в шаре L∞ радиуса 8/255 — она держит удар. Померили ту же модель против L2-атаки того же бюджета — точность рушится.
Исследователи OpenAI ещё в 2019 году в работе «Testing Robustness Against Unforeseen Adversaries» показали это на цифрах: модели, обученные против одной атаки, теряли до 40–60 процентных пунктов точности на атаках, которых не видели при обучении. Проблема не в том, что модель плохая. Проблема в том, что бенчмарк измеряет не то, что нам нужно.
Устойчивость к известной угрозе — это не устойчивость. Это переобучение под тест.
Какие бывают «непредвиденные» возмущения
Чтобы говорить об устойчивости честно, нужно расширить набор атак за пределы L_p. За последние годы в академической литературе устоялся набор классов, которые модель обычно не видит при обучении:
- JPEG-атака — возмущение в пространстве коэффициентов дискретного косинусного преобразования, а не пикселей.
- Fog, Snow, Gabor — процедурно сгенерированные «природные» искажения: туман, снег, полосы Габора.
- Elastic — локальные упругие деформации, будто картинку слегка помяли.
- Wasserstein — перенос массы пикселей на небольшое расстояние, сохраняющий общую яркость.
- Патчи — небольшая наклейка произвольного содержания в произвольном месте.
- Семантические сдвиги — изменение цвета кожи, освещения, ракурса через генеративную модель.
Ни один из этих классов не покрывается L∞-шаром. И ни один не покрывает остальные.
Метрика UAR и её логика
Чтобы сравнивать модели честно, ввели метрику Unforeseen Attack Robustness. Работает она так: берём набор атак, при обучении показываем модели только одну из них, а тестируем на остальных. Для каждой атаки замеряем точность при разных бюджетах возмущения, усредняем и нормируем на условно «идеального» защитника.
| Атака при обучении | L∞, тест | JPEG, тест | Elastic, тест | Fog, тест |
|---|---|---|---|---|
| Нет (базовая модель) | 0.03 | 0.05 | 0.02 | 0.04 |
| L∞ PGD | 0.51 | 0.18 | 0.09 | 0.12 |
| L2 PGD | 0.34 | 0.22 | 0.11 | 0.14 |
| Смесь L∞+JPEG+Elastic | 0.42 | 0.38 | 0.31 | 0.19 |
Числа условные, но пропорции соответствуют тому, что репортят исследования: обучение против одной атаки даёт узкую защиту, обучение против смеси — более широкую, но не бесплатно, точность на исходной атаке падает.
Как это тестируют на практике
Есть несколько открытых инструментов, которые не требуют писать атаки с нуля.
RobustBench
Лидерборд с фиксированной AutoAttack-оценкой на CIFAR-10, CIFAR-100 и ImageNet. Полезен как sanity-check, но именно он и создаёт проблему сверхспециализации: все оптимизируют одну метрику.
ImageNet-C и ImageNet-P
Наборы с 15 типами повреждений: шум, размытие, погода, цифровые артефакты. Не adversarial в строгом смысле — искажения не оптимизируются против модели, — но неплохой прокси для «непредвиденного».
Своя батарея атак
Минимальный код, который стоит прогнать перед деплоем, выглядит примерно так:
from torchattacks import PGD, PGDL2, FGSM, Jitter
import foolbox as fb
fmodel = fb.PyTorchModel(model, bounds=(0, 1))
attacks = {
"L_inf PGD": PGD(model, eps=8/255, steps=20),
"L_2 PGD": PGDL2(model, eps=1.0, steps=20),
"JPEG": fb.attacks.LinfBasicIterativeAttack(),
"Patch": fb.attacks.LinfPGD(),
}
for name, atk in attacks.items():
acc = evaluate(model, atk, loader)
print(f"{name:12s}: {acc:.3f}")
Если разброс между атаками больше 15 процентных пунктов — модель специализирована. Это не приговор, но повод честно указать в карточке модели, против чего именно она устойчива.
Сколько это стоит
Adversarial training дорогое. Обычное обучение ResNet-50 на ImageNet — порядка 100 GPU-часов на A100, это около 200 долларов на облачных инстансах. Adversarial training с PGD-7 добавляет 7-кратный оверхед на forward-backward внутри атаки, итого 1400 часов и порядка 2800 долларов, или около 260 тысяч рублей по курсу конца 2024 года. Обучение против смеси из четырёх атак — ещё плюс 30–50% сверху.
Для языковых моделей ситуация хуже: аналог adversarial training в виде RLHF против red-team-запросов требует человеческих аннотаторов, и там счёт идёт на миллионы долларов за прогон.
Где предел
Честный ответ: универсальной защиты нет и, вероятно, не будет. Теорема о «no free lunch» здесь работает буквально — расширяя множество атак, против которых модель устойчива, вы теряете точность на чистых данных и на узких атаках. Практический подход состоит в трёх шагах:
- Определить threat model — от кого и зачем защищаемся. Атака на систему распознавания лиц в метро и атака на медицинский классификатор — это разные враги.
- Собрать батарею из 5–8 разнородных атак, включая минимум одну, не покрываемую L_p.
- Публиковать не одно число, а профиль устойчивости — таблицу «атака × бюджет × точность».
Пока сообщество меряет робастность одним числом на одном бенчмарке, разработчики будут переобучаться под этот бенчмарк, а атакующие — приходить со стороны, откуда их не ждали.
Prompt-инженер: Идеальные запросы для Midjourney, ChatGPT и других моделей.
Спросить за 15 ₽Источники: Testing Robustness Against Unforeseen Adversaries (Kang et al., OpenAI), RobustBench: a standardized adversarial robustness benchmark
Частые вопросы
Чем adversarial robustness отличается от устойчивости к шуму?
Достаточно ли пройти AutoAttack, чтобы считать модель безопасной?
Работает ли adversarial training для LLM?
Можно ли обойтись без adversarial training и просто фильтровать входы?
Что такое threat model и почему без неё нельзя?
Есть ли смысл в сертифицированной устойчивости?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.