Удивительно, но факт: несколько изменений в изображении может полностью изменить вывод нейросети, что ломает заложенную разработчиком логику. В данной статье мы не просто подсветим факт существования One Pixel атаки, но и комплексно разберём архитектурные факторы, которые влияют на устойчивость CV-систем к данному семейству атак.
Представим ситуацию: мы обучили нейросеть, которая предсказывает наличие макияжа (мало ли какие задачи перед нами могут встать). Модель в проде, всё прекрасно работает. Наша нейросеть уверенно определяет наличие макияжа на левой фотографии. Но справа мы видим те же глаза, ту же помаду, но эти три пикселя... и вот уже модель утверждает, что никакого макияжа нет. Ломается логика нашей CV-системы, и всё идёт не по плану...

Примерно так функционирует one‑pixel атака. На фотографии меняются всего несколько пикселей, которые изменяют предсказание нейросети. Самый сложный этап атаки — это найти наиболее значимые в принятии решения пиксели, которые и надо поменять, ведь пикселей на изображении много, а возможных цветов для одного пикселя еще больше. Но после нахождения не составляет труда «обмануть» нейросеть.
Причём атака не всегда может быть преднамеренной. Проблема куда шире, ведь пиксели могут «испортиться» сами. Причиной тому бывают:
Битые пиксели на камере,
Помехи при передаче данных,
Банальная пыль на объективе.
Поэтому нашей задачей, как cv‑инженеров, является увеличение устойчивости модели к one‑pixel атаке. Сделать это можно как с помощью внешних цензоров, которые могут выявить попытку атаки на нейросеть, так и с помощью архитектуры модели, которая может увеличить устойчивость к атаке.
В данной статье мы с вами попытаемся комплексно разобраться в следующих вопросах:
Какой алгоритм оптимизации эффективнее всего находит уязвимые пиксели?
Насколько уязвимы популярные архитектуры, такие как AlexNet, Inception v3, ResNet, EfficientNet и Vision Transformer?
Какие архитектурные решения могут повысить устойчивость модели, а какие нет?
Спойлер:
Мы обнаружим как очевидные решения, так и довольно неожиданные, которые несложно внедрить.
Битва алгоритмов: кто быстрее найдёт уязвимые пиксели?
Как я уже упоминал, самый сложный этап — это нахождение пикселей, которые сильнее всего влияют на выходы. Один пиксель на изображении имеет координатыи RGB интенсивность
, которую мы и будем менять. Но чтобы понять, что пиксель влияет на предсказание модели, нужно его поменять, затем прогнать через неё и уже тогда сравнить выходы модели с не изменённым пикселем.
Конечно, можно получить веса модели или посмотреть активации, что ускорит поиск. Однако одним из преимуществом one pixel является то, что данной атаке не нужны веса модели. Достаточно просто иметь доступ к выходам нейросети. Такие атаки называются Black Box.
Как видим, решить такую задачу полным перебором трудно. Намного проще и быстрее использовать классические методы оптимизации: Differential Evolution (DE), Particle Swarm Optimization (PSO) и наконец Genetic Algorithm (GA).
Давайте кратко разберёмся, как они работают, но для начала определимся с понятиями.
Под -той особью будем понимать вектор, который задаёт цвет на пикселе с координатами
:
.
Под популяцией будем понимать набор особей:
.
Также нам нужно ввести функцию, которая будет показывать, насколько определённая особь хороша (также эта функция называется функцией приспособленности).
Пусть наша модель решает задачу классификации и на выходе выдаёт нам уверенности Где
— это уверенность в том, что изображение относится к
-тому классу. Среди них есть
— уверенность истинного класса (будем называть истинной уверенностью) и
— наибольшая уверенность, из всех неистинных классов (будем называть побочной уверенностью).
На рисунке снизу можно посмотреть, как это выглядит (— это класс, к которому реально относится изображение).

Если бы нейросеть ошиблась, то уверенность в побочном классе оказалась бы больше, чем уверенность в истинном. Как раз целью one-pixel атаки является достижение такого состояния, при котором . Поэтому в качестве функции активации выберем
Таким образом, мы будем максимизироватьдо тех пор, пока она не станет больше 1. После этого можно сказать, что модель удалось атаковать. Понятно, что в некоторых случаях модель может ошибаться и без атаки, но такие изображения мы рассматривать не будем.
Перейдём теперь к алгоритмам оптимизации!
Differential Evolution
Данный алгоритм является стандартом в поиске one-pixel атак. Его начали использовать ещё создатели данной атаки в своей статье

Краткое описание алгоритма
Первым делом случайно создаём инициализируем популяцию
.
Случайно выбираем особей
(все особи разные).
-
На основании выбранных особей создаём особь y:
Для каждой
-той компоненты особи:
и
— гиперпараметры.
То есть с вероятностью
-тая компонента особи меняется на взвешенную разность трёх других особей.
Если
, то в популяции заменяем особь
на
, иначе оставляем
.
-
Повторяем шаги 2-4, пока не выполнится хотя бы один критерий останова:
Появилась особь
.
Количество пройденных эпох превысило допустимое.
Для более подробного ознакомления с алгоритмом советую почитать статью про него.
Для проведения атак будем использовать функцию из scipy:
from scipy.optimize import differential_evolution
Particle Swarm Optimization
В данном алгоритме мы не меняем состав популяции. Для поиска решения каждая особь теперь будет “двигаться” в пространстве с определённой скоростью и искать лучшую точку.

Краткое описание алгоритма
Случайно инициализируем популяцию
-
Для каждой особи храним её лучшее положение (точку, в которой
была максимальной):
, где
-
Также храним для каждой особи её скорость:
, где
Для всей популяции определяем точку g, которая содержит в себе лучшее положение, которое удалось найти.
-
Для каждой особи поэлементно меняем его скорость:
— гиперпараметры.
— скорость
-той особи по компоненте
.
То есть скорость особи меняется в зависимости от лучшего решения популяции (
) и от лучшего решения данной особи (
).
Обновляем особь:
.
Обновляем
и
.
-
Повторяем шаги 5-7, пока не выполнится хотя бы один из критериев останова:
Появилась особь
.
Количество пройденных эпох превысило допустимое.
Также хорошая статья лежит на википедии.
Для проведения атак будем использовать функцию из библиотеки pyswarms:
import pyswarms as ps
Genetic Algorithm
Алгоритм наиболее приближен к эволюционному. Он позволяет гибко настроить каждый этап, что, на мой взгляд, делает его мощнее конкурентов.

Краткое описание алгоритма
Случайно инициализируем популяцию.
-
Пока не достигнут критерий останова:
Для каждой особи
вычисляем
— приспособленность
Выбираем двух особей
(родители) с вероятностью, пропорциональной
, соответственно
Проводим скрещивание особей
и
, получая новую особь
.
Проводим мутацию новой особи
.
Делаем так некоторое заданное количество раз.
Формируем популяцию: удаляем из популяции
слабейших особей, добавляем новых (случайно инициализированных).
Чтобы лучше разобраться в работе алгоритма можно почитать следующее.
Для проведения атак будем использовать уже реализованный мною и проверенный на многих задачах класс для генетического алгоритма.
Сравнение алгоритмов оптимизации.
Приступим к сравнению алгоритмов. Для этого возьмём предобученную модель AlexNet, которую будем атаковать с помощью трёх алгоритмов (DE, PSO, GA). Также отберём 10 случайных картинок из датасета ImageNet, на которых модель не ошибается. Атаковать изображения с помощью трёх пикселей размером 2х2.
В результате получилось, что на каждой картинке GA нашёл более уязвимые пиксели, по сравнению с другими алгоритмами:

Как видим, три изображения удалось успешно атаковать с помощью GA (функция приспособленности > 1).
Для чистоты эксперимента возьмём предобученную ResNet18 и также 10 случайных картинок из датасета ImageNet. Повтор эксперимента также показал, что генетический алгоритм опережает своих конкурентов на каждом изображении:

Микровывод:
Как видим, генетический алгоритм лучше справляется с задачей. Закономерность повторилась на разных архитектурах и на разных наборах из 10-ти картинок.
Также стоит учесть, что все три алгоритма отработали за одинаковое время, с одинаковым количеством особей и эпох. Параметры алгоритмов оставались стандартными.
Поэтому для дальнейшего проведения атак будем использовать генетический алгоритм, а не DE, как это принято.
Архитектуры под прицелом: кто устойчивее к one pixel атакам?
Прежде чем перейдём к результатам сравнения, давайте кратко вспомним ключевые особенности каждой архитектуры. Именно эти особенности, как мы увидим далее, могут определять их устойчивость к атакам.
AlexNet
AlexNet — свёрточная нейронная сеть, одержавшая победу на конкурсе ImageNet в 2012 году. С неё началась эра глубокого обучения в компьютерном зрении.
Сеть состоит из 5-ти свёрточных слоёв и 3-х полносвязных слоёв.
ReLU активации.
Dropout для регуляризации.
~60 миллионов параметров.
Несмотря на возраст, AlexNet до сих пор используется как baseline во многих исследованиях.
Точность на ImageNet (топ 1) — 0.565.
Точность на ImageNet (топ 5) — 0.791.
Inception v3
Inception v3 — это архитектура свёрточной нейронной сети, разработанная Google в 2015 году.
Использование специализированных модулей, которые обрабатывают входные данные параллельно через несколько фильтров разных размеров (1×1, 3×3, 5×5). Это позволяет сети эффективно захватывать визуальные паттерны на разных масштабах одновременно.
Асимметричные свёртки, которые разбивают свёртку n×n на комбинацию свёрток 1×n и n×1. Такой подход дополнительно снижает количество параметров и повышает эффективность вычислений.
~ 27 миллионов параметров.
Точность на ImageNet (топ 1) — 0.773.
Точность на ImageNet (топ 5) — 0.935.
ResNet
ResNet (Residual Network) — это архитектура свёрточных нейронных сетей, которая произвела революцию в глубоком обучении благодаря введению остаточных (residual) связей. ResNet одержала победу на конкурсе ImageNet в 2015 году.
Остаточные связи позволяют эффективно обучать сети, состоящие из сотен слоёв.
В архитектуре активно используется нормализация слоёв, что способствует более стабильному и быстрому обучению.
~ 60.2 миллионов.
Точность на ImageNet (топ 1) — 0.823.
Точность на ImageNet (топ 5) — 0.960.
EfficientNet
EfficientNet был представлен в 2019 году. Авторы продемонстрировали, что можно достичь высокого качества распознавания изображений, оптимально масштабируя базовую архитектуру.
Базовая модель EfficientNet-B0 была найдена с помощью нейронного поиска архитектур (Neural Architecture Search), что позволило создать компактную, но мощную модель.
Вместо традиционного масштабирования только глубины или ширины сети, авторы предложили метод комплексного масштабирования (compound scaling), который одновременно учитывает глубину, ширину и разрешение входного изображения.
~ 66.3 миллионов.
Точность на ImageNet (топ 1) — 0.841.
Точность на ImageNet (топ 5) — 0.969.
Vision Transformer
ViT (Vision Transformer) — это архитектура для обработки изображений, основанная на трансформерах, представленная в 2020 году. ViT стал одним из первых примеров применения трансформерных моделей.
Изображение разбивается на небольшие патчи (например, размером 16×16 пикселей), которые затем разворачиваются в векторные представлении.
Каждый патч рассматривается как «слово» в последовательности.
Полученная последовательность патчей подаётся на вход стандартного энкодера трансформера, использующего механизмы self-attention для моделирования взаимосвязей между патчами.
В отличие от традиционных свёрточных нейронных сетей, ViT не использует свёрточные операции, полагаясь исключительно на самовнимание и линейные слои.
~ 66.3 миллионов.
Точность на ImageNet (топ 1) — 0.881.
Точность на ImageNet (топ 5) — 0.985.
Перейдём к сравнению устойчивости. Методология проста: берём 30 изображений из тестовой выборки ImageNet и для каждой архитектуры проводим атаки на изображения. Будем использовать три вида атаки:
Изменение только одного пикселя,
Изменение трёх пикселей,
Изменение трёх пикселей размером 3х3.
После этого замеряем среднюю относительную уверенность, которая показывает насколько в среднем уверенность в истинном классе больше, чем уверенность в побочном классе. То есть чем выше данная метрика, тем более защищённой является архитектура.
После долгих вычислений получаем следующий график:

Видим, что наиболее уязвимой является AlexNet и InceptionNet. Более современные архитектуры уже имеют больший разрыв в уверенности между истинным классом и побочным. И с помощью one-pixel атаки трудно данный разрыв преодолеть.
Посмотрим теперь на то, сколько изображений удалось успешно атаковать:
Архитектура |
1 пиксель |
3 пикселя |
3 пикселя 3х3 |
AlexNet |
0 |
1 |
16 |
Inception v3 |
3 |
4 |
13 |
ResNet |
0 |
0 |
0 |
EfficientNet |
0 |
0 |
2 |
ViT |
0 |
0 |
0 |
Из таблицы видно, что, начиная с ResNet, one-pixel атака имеет малый эффект и нужно либо изменять большее количество пикселей, либо использовать более мощные атаки.
Теперь давайте отобразим все эти 30 изображений на тепловой карте и посмотрим, какой в итоге стала функция приспособленности после атаки. Напомню, что чем ближе функция к единице, тем ближе удалось подойти к успешной атаке. Если больше единицы, то атака проведена успешно.
На рисунке ниже представлена тепловая карта размером:
30 клеток по оси
— это наши 30 изображений, которые взяты из шести классов датасета ImageNet.
15 клеток по оси
— это различные атаки: Самые высокие три строки — это атаки на AlexNet, следующие — на Inception v3 и т.д. Причём первая из них строка — атака одним пикселем, вторая — атака тремя пикселями и третья — тремя пикселями размером 3x3.

Из данной тепловой карты мы видим, что есть отдельные изображения, на которых чаще всего удаётся провести атаку. Также видно, что функция приспособленности имеет более высокие значения для атак на архитектуру AlexNet, что подтверждает прошлый вывод о том, что AlexNet наиболее уязвима к атаке.
Если обратить внимание на Inception v3, то можно заметить, что есть пара классов, на которых чаще всего происходили успешные атаки (это изображения из классов «люди в военной форме» и «оружие»).
Микровывод:
Наиболее устойчивыми архитектурами являются ResNet152 и ViT, который ни разу не удалось атаковать.
Наиболее уязвимыми являются такие архитектуры, как AlexNet и Inception v3.
Существуют как изображения, которые легко атакуются one-pixel атакой, так и те, которые атаковать не удаётся. Зачастую это связано с изначальным малым разрывом между истинным и побочным классами.
Спускаемся на уровень ниже: Какие архитектурные особенности влияют на устойчивость?
Останавливаться на достигнутом не будем, ведь интересно не только сравнить, какие архитектуры устойчивы к атаке, а какие нет, но и попробовать выяснить, а какие особенности влияют на устойчивость.
Чтобы ответить на данный вопрос, давайте возьмём AlexNet, как самую простую архитектуру (она показана на рисунке ниже), и добавим в неё некоторые особенности из InceptionNet, ResNet и EfficientNet.

Вот некоторые архитектурные особенности, которые можно выделить в представленных моделях:
1) Свёртки 1х1 (Inception v3):

Просто добавим свёртки 1×1 перед каждым слоем MaxPool2d, как это сделано в некоторых местах Inception v3. Такие свёртки снижают вычислительные затраты, позволяют изменять количество каналов, а также позволяют комбинировать информацию с разных каналов.
2) Разбиение свёртки 11×11 на 11×1 и 1×11 (InceptionNet):

Такие ассиметричные свёртки используются в основном для экономии памяти. В текущем примере вместо 121 параметра (11х11) мы используем всего 22 (11+11).
3) Scip-connection (ResNet):

Данная особенность позволяет избегать проблемы «затухающего» градиента, ускоряет обучение. Также данная особенность позволяет модели выключать ненужные слои, благодаря возможности обходить их, если это улучшает качество.
4) Добавление BatchNorm2d (ResNet):

Один из самых полезных элементов, который и позволяет быстрее обучаться, и используется в качестве регуляризации и даже позволяет обучать более длинные сети, избегая «затухания».
5) Замена ReLU на SiLU (EfficientNet):

Формула выглядит следующим образом:

Данная функция является более гладкой, чем ReLU, она меньше подвержена проблеме «мёртвых» нейронов, которые возникают из‑за нулевой производной в точках меньше нуля в ReLU.
Все подобные архитектуры довольно просто реализовать на Torch. С кодом и этапами исследования можно ознакомиться в репозитории исследования.
Таким образом, у нас есть следующие варианты:
Обычный AlexNet,
Предобученный на ImageNet AlexNet,
AlexNet c 1×1 свёртками,
AlexNet с 11×1 и 1×11 свёртками,
AlexNet со scip‑connection,
AlexNet с BatchNorm2d,
AlexNet с SiLU.
Также давайте добавим:
AlexNet с
,
AlexNet, который будет обучаться на зашумлённых данных (add pixels):

И вот мы получили 9 моделей с небольшими изменениями, которые теперь можно также исследовать, как и в главе выше. Только на этот раз возьмём датасет CelebA, который содержит около 200.000 фотографий людей. Для каждой фотографии определены 40 признаков. Мне показался интересным признак, который указывает на наличие макияжа у человека. Возьмём 30 изображений, которые верно предсказываются всеми моделями, и в дальнейшем будем проводить на них атаки.

Обучим полученные нами модели (или дообучим в случае предобученной на ImageNet модели) и проверим устойчивость каждой модели к атаке.
Чтобы AlexNet работал с задачей бинарной классификации, добавим в качестве последнего слоя линейный слой, который на выходе будет возвращать одно число которое будет передаваться в сигмоиду. Это позволяет утверждать, что если выход модели больше 0.5, то на изображении присутствует макияж, иначе нет.
После обучения моделей получаем следующие показатели точности:

Как и ожидалось, обученная на ImageNet модель оказалась самой точной. Также точность увеличилась при добавлении нормализации по батчу. Все остальные модернизации снизили точность. Хотя если посмотреть внимательно, то точность варьируется в пределах от 0.913 до 0.900, что некритично, если вопрос касается безопасности.
Теперь посмотрим, как модернизации влияют на устойчивость модели к one-pixel атаке. Результаты получились следующими:


Интересным является то, что предобученная модель оказалась наиболее уязвимой к атаке. Также, как и ожидалось, обученная на заранее зашумлённых данных модель оказалась самой устойчивой. Увеличение вероятности dropout также немного, но увеличило устойчивость. Неочевидным стало то, что всего лишь замена ReLU на SiLU значительно увеличило устойчивость модели.
Давайте посмотрим, на примеры атак:





Интересно, что почти на всех фото пиксели добавляются на щёки, что вводит модель в заблуждение. Справа показано, какие пиксели входного изображения вносят наибольший вклад в активацию нейронов последнего слоя. Из данных рисунков мы видим, что нейросеть, как и предполагалось, уделяет особое внимание бровям, глазам и губам.
Для чистоты эксперимента давайте также изменим архитектуру ResNet18, получив модели:
Предобученную на ImageNet ResNet18,
ResNet18 с SiLU вместо ReLu,
ResNet101 (посмотрим, как увеличение глубины повлияет на устойчивость).
Получим следующие метрики точности:

Опять видим небольшое колебание точности. Но в этот раз SiLU увеличило точность модели.
После атак получим следующее:

Опять видим, что SiLU увеличило устойчивость к атаке, а предобученная модель опять оказалась слабее. Также видим, что увеличение глубины сети значительно увеличило устойчивость модели
Вывод
В итоге, мы выяснили следующее:
Архитектуры ResNet и ViT оказались самыми защищёнными от one-pixel атаки. Их ни разу не удалось атаковать.
Архитектуры AlexNet и InceptionNet наиболее уязвимы к атаке. В первой модели можно добиться 53% успешных атак, а во второй — 43%.
Использование предобученных моделей понижает устойчивость к атаке
Увеличить устойчивость можно с помощью обучения модели на заранее зашумлённых изображениях.
Также защищённость модели можно повысить при замене функции активации с ReLU на SiLU.
P.S. Дальнейшие исследования будут нацелены на то, чтобы ответить на вопросы, почему именно такие факторы повышают устойчивость или почему генетический алгоритм работает лучше остальных и прочие.
Репозиторий исследования расположен тут. Если у вас есть интересные идеи, то с радостью готов их выслушать ;)
CitizenOfDreams
Так вот почему робот-цыпленок из "Робокопа" не увидел брошенный пистолет.
Скрытый текст
Tuturutuw Автор
Точно. А надо было просто перейти от ReLU к SiLU)