Как обмануть модель с 27 миллионами параметров с помощью Python

Как вы думаете, невозможно обмануть систему зрения беспилотного автомобиля Tesla?

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

Или что системы распознавания лиц в аэропортах пуленепробиваемы?

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

Ну, вы НЕПРАВЫ.

Существуют простые способы создания состязательных примеров, которые могут обмануть любую модель глубокого обучения и создать проблемы с безопасностью. В этом посте мы рассмотрим следующее:

  1. Что такое состязательные примеры?
  2. Как вы генерируете состязательные примеры?
  3. Практический пример: давайте сломаем Inception 3
  4. Как защитить свои модели от враждебных примеров

Давайте начнем!

1. Что такое состязательные примеры? 😈

За последние 10 лет модели глубокого обучения покинули академический детский сад, стали большими мальчиками и изменили многие отрасли. Особенно это касается моделей компьютерного зрения. Когда AlexNet попал в чарты в 2012 году, официально началась эра глубокого обучения.

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

  • беспилотные автомобили
  • распознавание лица
  • медицинский диагноз
  • системы наблюдения
  • обнаружение вредоносных программ

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

Представьте на мгновение, что ультрасовременная супер-причудливая система машинного зрения с глубоким обучением вашего беспилотного автомобиля не смогла распознать этот знак остановки как знак остановки.

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

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

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

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

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

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

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

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

2. Как генерировать состязательные примеры?

Состязательные примеры 😈 генерируются путем взятия чистого изображения 👼, которое модель правильно классифицирует, и обнаружения небольшого возмущения, из-за которого новое изображение неправильно классифицируется моделью ML.

Сценарий белого ящика

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

где

  • X — входное изображение
  • y — выходной класс,
  • θ — вектор параметров сети.

Эта функция потерь обычно представляет собой отрицательную логарифмическую вероятность для методов классификации.

Ваша цель — найти новое изображение X', близкое к исходному X и создающее большое изменение значения функции потерь.

Представьте, что вы находитесь внутри пространства всех возможных входных изображений, расположенных поверх исходного изображения X. Это пространство имеет размеры ширина x высота x каналы, так что извините, если вы не можете это хорошо представить 😜.

Чтобы найти состязательный пример, вам нужно немного пройтись в каком-то направлении в этом пространстве, пока вы не найдете другое изображение X’ с заметно другим проигрышем. Вы хотите выбрать направление, которое максимизирует изменение функции потерь J для фиксированного маленького шага эпсилон.

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

Градиент функции по одной из ее переменных — это именно направление максимального изменения. И, кстати, именно по этой причине люди тренируют нейронные сети, используя стохастический градиентный спуск, а не стохастический спуск в случайном направлении.

Метод быстрого знака градиента

Простой способ формализовать эту интуицию состоит в следующем:

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

Атака черного ящика

В большинстве случаев весьма вероятно, что у вас не будет полной информации о модели. Следовательно, предыдущий метод бесполезен, поскольку вы не можете вычислить градиент.

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

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

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

  1. Запросите целевую модель с входными данными X_i для i = 1 … n и сохраните выходные данные y_i.
  2. Используйте обучающие данные (X_i, y_i) для построения другой модели, называемой замещающей моделью.
  3. Используйте алгоритм белого ящика, такой как знак быстрого градиента, для создания состязательных примеров для замещающей модели. Многие из них будут успешно переноситься и также станут состязательными примерами для целевой модели.

Успешное применение этой стратегии в коммерческой модели машинного обучения представлено в этой статье Computer Vision Foundation.

3. Практический пример: давайте сломаем Inception 3

Давайте запачкаем руки и реализуем несколько атак, используя Python и замечательную библиотеку PyTorch. Всегда полезно знать, как думает злоумышленник.

Вы можете найти полный код в этом репозитории Github.

Нашей целевой моделью будет Inception V3, мощная модель классификации изображений, разработанная Google, которая имеет около 27 миллионов параметров и была обучена примерно на 14 миллионах изображений, принадлежащих к 20 тысячам категорий.

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

Давайте возьмем изображение невинной рыжей собаки в качестве исходного изображения, которое мы тщательно модифицируем, чтобы построить состязательные примеры:

Inception V3 ожидает изображения с размерами 299 x 299 и нормализованными диапазонами пикселей от -1 до 1.

Давайте предварительно обработаем наше красивое изображение собаки:

и убедитесь, что модель правильно классифицирует это изображение.

Хороший. Модель работает, как и ожидалось, и рыжая собака классифицируется как рыжая собака :-).

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

Я создал вспомогательную функцию для визуализации как исходного, так и враждебного изображения. Вы можете увидеть полную реализацию в этом репозитории GitHub.

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

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

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

Вспомните интуицию, лежащую в основе метода быстрого знака градиента, т.е. представьте себя внутри пространства всех возможных изображений (размером 299 x 299 x 3), прямо там, где находится исходное изображение X. Градиент функции потерь указывает вам направление, в котором вам нужно двигаться, чтобы увеличить его значение и сделать модель менее уверенной в правильном прогнозе. Размер шага равен эпсилон. Вы шагаете и проверяете, не сидите ли вы сейчас на состязательном примере.

Расширением этого было бы выполнение множества более мелких шагов вместо одного. После каждого шага вы переоцениваете градиент и выбираете новое направление, в котором собираетесь двигаться.

Этот метод называется методом итеративного быстрого градиента. Какое оригинальное имя!

Более формально:

Где X0 = X, а Clip X,ϵ обозначает отсечение входных данных в диапазоне [X−ϵ, X+ϵ].

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

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

Шаг 1: снова ищейка

Шаг 2: снова бигль

Шаг 3: мышеловка? Интересный. Однако уверенность модели в этом прогнозе составляет всего 16%. Пойдем дальше.

Шаг 4: Еще одна порода собак, скучная…

Шаг 5: снова бигль..

Шаг 6:

Шаг 7: снова красная кость. Сохраняйте спокойствие и продолжайте идти в пространстве изображения.

Шаг 8:

Шаг 9: БИНГО! 🔥🔥🔥

Какое экзотическое бумажное полотенце. И модель довольно уверена в своем прогнозе, почти на 99%.

Если вы сравните начальное и конечное изображение, которое мы нашли на шаге 9

вы видите, что они по сути одинаковы, щенок, но для модели Inception V3 это две совершенно разные вещи.

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

Модели глубокого обучения, развернутые в критических задачах, должны правильно обрабатывать состязательные примеры, но как?

4. Как защитить свои модели от враждебных примеров?

По состоянию на ноябрь 2021 года не существует универсальной стратегии защиты, которой вы могли бы следовать, чтобы защититься от враждебных примеров. Другими словами, атаковать модель состязательными примерами легче, чем защищать ее.

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

Если модель видит состязательные примеры во время обучения, ее производительность во время прогнозирования будет лучше для состязательных примеров, сгенерированных таким же образом. Этот метод называется состязательным обучением.

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

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

Эта защита очень эффективна против атак, использующих метод Fast Gradient Sign. Однако существуют более мощные атаки, которые мы не рассмотрели в этом посте и которые могут обойти эту защиту. Если вы хотите узнать больше, я рекомендую вам прочитать эту удивительную статью Николаса Карлини и Дэвида Вагнера.

Именно по этой причине противоборствующая защита является открытой проблемой в машинном обучении и кибербезопасности.

Заключение

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

В этом посте я дал практическое введение в тему с примерами кода. Если вы хотите продолжить работу, я предлагаю cleverhans, библиотеку Python для состязательного машинного обучения, разработанную великими Яном Гудфеллоу и Николасом Папернотом и в настоящее время поддерживаемую Университетом Торонто<. /сильный>».

Весь исходный код, показанный в этой статье, находится в этом репозитории Github.



GitHub — Paulescu/adversarial-machine-learning: Исходный код моего практического руководства «Взлом…
. Или, может быть, просто красивые вещи так легко ломаются мир.' Кассандра Клэр, Город падших ангелов…github.com»



Хотите стать (даже) лучшим специалистом по данным и получить доступ к лучшим курсам по машинному обучению и науке о данных?

👉🏽 Подпишитесь на рассылку datamachines.

👉🏽 Дайте мне много хлопков 👏🏿👏🏽👏 ниже

👉🏽 Подпишитесь на меня на Medium.

Хорошего дня 🧡

Пау