Как обмануть нейронную сеть

Нейросети теперь повсюду, и распознавание объектов на картинках — это одно из самых популярных применений. Но что, если вы не хотите, чтобы объекты на вашем изображении распознали? Или, например, хотели бы, чтобы нейросеть «увидела» что-то, что не увидит человек, глядя на ту же картинку? Для этого придуманы обманные методы нейросетей, которые обращают нейросети против них самих. И благодаря готовым библиотекам пользоваться ими легче легкого.

В этой статье я расскажу вам, как обмануть нейросеть на примере расспознования картинки.

Подопытная нейросеть

Для исследования нам потребуется подопытная нейронная сеть, которую можно будет препарировать. Для этой задачки вполне подойдет ImageRes50v2, одна из самых передовых сетей для классификации изображений, натренированная на датасете ImageNet.

Кодить будем на Python 3 — для работы с нейросетями это фактически стандарт. На наше везение, модуль keras включает в себя заранее обученную модель, которую мы и используем.

Для начала надо установить все самые новые библиотеки. В реестре pypi нехватает моделей нейросетей, в отличие от репозитория на GitHub.

Теперь давай возьмем любое изображение и попробуем распознать его.

обмануть нейронную сеть
Исходный кот

В результате прога скажет нам, что это котэ.

Изображение взято из датасета, поэтому высокая точность не удивляет. Давайте разбираться, как именно можно обмануть нейросеть.

Принцип создания поддельного изображения

При создании ложных изображений главное оружие нейронных сетей используют против них самих. Все нейросети — это большие математические функции, и, чтобы найти ложное изображение, разумно использовать их же. Так что наша задача сводится к оптимизации методом градиентного спуска.

Математика такой атаки до неприличия проста: мы выворачиваем процесс обучения нейронной сети наизнанку. Вместо фиксированных входных данных (тренировочного датасета) и обучающейся сети тут мы имеем меняющиеся, «‎обучающиеся»‎ входные данные и фиксированную сеть.

Как и для обучения нейронной сети, нам нужно два параметра: функция потерь (способ подсчитать ошибку) и градиент (мы используем производную нейронной сети).

И градиент, и ошибку мы можем посчитать, используя алгоритм обратного распространения, просто приняв все веса нейронной сети правильными (и, соответственно, неизменными), а вход — ошибочным и подлежащим исправлению.

Виды атак на нейросеть

Поиски ошибочно распознаваемого примера можно поделить на два разных вида:

  • Ненаправленную атаку, когда ищется любой подходящий пример (необязательно имеющий смысл),
  • Специально направленную атаку, цель которой — создать минимально измененный ошибочный пример, глядя на который человек распознает объект без проблем, а программа — нет.

Самый большой минус ненаправленной атаки — это полное отсутствие у результата какой-либо смысловой нагрузки для человека. Но преимущество такой атаки — возможность легко применять в реальном мире. Например, через видеокамеры устройств IoT или систем безопасности: достаточно распечатать результат на бумажке и поднести к объективу.

Простая реализация

Куда полезнее будет разобраться, как можно подделать настоящее изображение. Для этого программе нужно сделать несколько шагов:

  1. Загрузить модель.
  2. Описать функцию потерь.
  3. Посчитать ошибку и градиент на входе нейросети.
  4. Изменить изображение соответственно градиенту (то есть улучшить его).
  5. Повторять пункты 3 и 4, пока результат не станет удовлетворительным.

Для этого предназначен следующий скрипт, который позволит вам за несколько минут (при наличии достойного графического процессора) создать ошибочно распознаваемое изображение необходимого класса (у нас из кота — пеликана).

Автоматизация процесса

Помимо такого способа обмана нейросети, ученые придумали еще очень много разных подходов, чтобы оставить искусственный интеллект в дураках. Именно поэтому была создана универсальная библиотека foolbox, которая автоматизирует все шаги, необходимые для создания поддельной картинки. Давай скачаем и используем ее!

Выберем другое изображение, в котором нейросеть будет еще уверенней. Например, другой кот, тоже персидский,

обмануть нейронную сеть
Кот, которому не терпится стать лягушкой

Сначала нужно загрузить модель, затем выбрать необходимую цель (нужную категорию), выбрать атаку и запустить ее.

Получаем измененное изображение.

обмануть нейросеть
Котик + шум = лягушка. Не заметили? Я тоже

Запустим для него проверку (предварительно меняем название файла в test.py):

Удивительный результат, добиться которого можно на любом настольном компьютере за считаные секунды!

Если хочешь проверить результат на своей машине, то используй скрипт из начала статьи — он запустится даже без графического процессора. Вот изображение, созданное этим алгоритмом, в формате PNG, сохрани его и посмотри, как на самом деле работает обман нейросетей.

обмануть нейросеть
Кот (лягушка)

Атака на один пиксель

Используя схожую технологию, что и у foolbox, ученые придумали другую атаку на нейросети, которая затрагивает лишь один пиксель. Новый алгоритм ищет тот пиксель изображения, который больше всего влияет на вывод нейронной сети, а затем использует найденную «‎точку давления»‎, чтобы поменять правильный результат на неверный.

Для этой уязвимости есть библиотека one-pixel-attack-keras, которая делает эксплуатацию тривиальной. Для уверенного результата необходим не один, а несколько (три или пять) пикселей. Но качество этого метода и так превзошло ожидания ученых: около 30% изображений было превращено в подделки изменением одного пикселя, а изменением трех — уже 80%.

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

Для себя я нашел главный плюс всех уязвимостей — я знаю, как защитить себя в случае восстания машин.

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (3 оценок, среднее: 5,00 из 5)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Добавить комментарий