Часть 1. Атака на модели машинного обучения

Автор Тигран Аветисян.

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

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

В этой серии руководств мы рассмотрим набор инструментов Adversarial Robustness Toolbox и выясним, как он может помочь вам защитить конвейеры машинного обучения. В ЧАСТИ 1 мы сосредоточимся на состязательных атаках и будем использовать набор данных MNIST вместе с платформой машинного обучения TensorFlow/Keras.

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

Что такое инструментарий защиты от состязательности?

Набор инструментов Adversarial Robustness Toolbox, или ART, представляет собой платформу Python для обеспечения безопасности машинного обучения. ART содержит инструменты атаки и защиты, которые могут помочь командам лучше понять атаки злоумышленников и разработать меры защиты на основе экспериментов.

ART имеет 39 модулей атаки, 29 модулей защиты и поддерживает широкий спектр сред машинного обучения, включая scikit-learn, PyTorch, TensorFlow и Keras. ART также поддерживает несколько задач машинного обучения (включая классификацию, регрессию и генерацию) и работает со всеми типами данных (аудио, видео, изображения или таблицы).

Набор инструментов Adversarial Robustness Toolbox изначально был разработан и опубликован IBM. В июле 2020 года IBM пожертвовала ART Linux Foundation AI (LFAI). С тех пор LFAI поддерживает и разрабатывает обновления для инструментария.

Типы атак в наборе инструментов Adversarial Robustness Toolbox

Поскольку ЧАСТЬ 1 этой серии посвящена атакам, давайте более подробно рассмотрим типы атак, поддерживаемые ART.

На высоком уровне в ART реализовано 4 типа состязательных атак:

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

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

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

· Отравление. Атаки отравления направлены на то, чтобы исказить данные обучения, чтобы испортить модель жертвы во время обучения. Отравленные данные содержат функции (называемые бэкдором), которые вызывают желаемый результат в обученной модели. По сути, возмущенные функции заставляют модель подходить к ним. В качестве очень простого примера (который мы рассмотрим в коде ниже) злоумышленник может отравить цифры в наборе данных MNIST, чтобы модель жертвы классифицировала все цифры как 9. Атаки отравления требуют доступа к обучающим данным модели до того, как произойдет фактическое обучение.

Документация ART предоставляет этот аккуратный график, который показывает, как работают атаки на высоком уровне:

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

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

Как происходят атаки на конвейеры машинного обучения?

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

Вот лишь некоторые из случаев, когда злоумышленники могут получить доступ к вашему пайплайну и данным:

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

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

· Вы используете общедоступную модель. Предположим, что вы используете модель НЛП из Hugging Face. Модели Hugging Face доступны каждому. Злоумышленник может проанализировать общедоступную модель и использовать свои знания для атаки на другие аналогичные модели, используемые другими командами. На самом деле злоумышленникам не обязательно иметь точно такую ​​же модель, как у вас — для атаки может быть достаточно знания модели, выполняющей ту же задачу, что и ваша.

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

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

Предпосылки для использования АРТ

Чтобы иметь возможность следовать этому руководству, установите ART с помощью этой команды.

pip install adversarial-robustness-toolbox

Если вы используете conda, используйте вместо этого эту команду:

conda install -c conda-forge adversarial-robustness-toolbox

Мы использовали ART версии 1.10.0, но и более новые версии должны работать нормально.

При необходимости вы можете установить ART только для конкретной платформы ML/DL, которую вы будете использовать. Подробнее об этом можно узнать здесь.

Помимо ART, вам понадобится любой фреймворк ML/DL, который вы хотите атаковать. Мы будем использовать TensorFlow, который вы можете установить с помощью этой команды:

pip install tensorflow

Или, если вы используете conda, эта команда:

conda install -c conda-forge tensorflow

Мы также будем использовать NumPy и Matplotlib, поэтому убедитесь, что у вас есть и эти библиотеки.

Атаки уклонения в ART

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

Начиная с ART версии 1.10.0, большинство атак, поддерживаемых платформой, были атаками уклонения.

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

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

Импорт зависимостей

Как обычно, мы начинаем с импорта зависимостей:

Обратите внимание, что мы отключаем активное выполнение в TensorFlow для этого руководства в строке 12. Это связано с тем, что класс-оболочка art.estimators.classification.KerasClassifier не полностью поддерживает TF 2.

Загрузка данных

Чтобы загрузить набор данных MNIST, мы собираемся использовать функцию ART art.utils.load_dataset. Эта функция возвращает кортежи для обучающих и тестовых наборов, а также минимальное и максимальное значения признаков в наборе данных.

Изображения уже нормализованы к диапазону [0, 1], а метки закодированы методом one-hot. Нам не нужно выполнять какую-либо предварительную обработку набора данных.

Обучение модели TensorFlow Keras

Теперь давайте создадим простую модель TensorFlow Keras:

И тренируйте его:

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

Определение атаки уклонения в нашей модели

В качестве следующего шага давайте определим атаку уклонения для нашей модели.

Чтобы иметь возможность запускать атаки на нашу модель, мы должны обернуть ее в класс art.estimators.classification.KerasClassifier. Вот как это делается:

Аргумент model=model указывает на нашу модель, а clip_values=(min, max) указывает минимальное и максимальное значения, разрешенные для функций. Мы используем значения, предоставленные функцией art.utils.load_dataset.

Вместо KerasClassifier вы также можете попробовать TensorFlowV2Classifier, но обратите внимание, что его использование отличается.

Затем мы определяем атаку, используя класс FastGradientMethod ART:

estimator=classifierпоказывает, что атака будет применяться к нашему классификатору, а аргумент eps=0.3 по существу определяет, насколько сильной будет атака.

Затем мы можем сгенерировать враждебные образцы, вызвав метод объекта атаки generate, передав ему целевые изображения, которые мы хотим потревожить:

Оценка эффективности атаки

Давайте взглянем на один состязательный образец:

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

Clean test set loss: 0.04 vs adversarial set test loss: 5.95Clean test set accuracy: 0.99 vs adversarial test set accuracy: 0.07

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

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

В приведенном выше блоке кода мы создаем фигуру вместе с подграфиками (строки 5–9) и определяем значения eps, которые нужно попробовать (строка 12). Затем мы повторяем наши подграфики (строки 18 и 19), генерируем образцы состязательности для каждого значения из eps_to_try (строки с 21 по 27), строим образец состязательного изображения для текущего eps value(строка 30), оцените точность модели на наборе враждебных объектов (строки 37–40) и получите прогноз для отображаемого образца враждебного изображения (строки 43–46).

Каждое значение eps, точность теста для него и прогноз для образца состязательного изображения отображаются над каждым изображением (строки с 49 по 53).

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

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

Атаки извлечения в ART

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

Давайте воспользуемся классом art.attacks.extraction.CopycatCNNдля выполнения атаки. Подробнее об этом методе атаки вы можете узнать в этой статье.

Обучение модели жертвы

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

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

Давайте обучим нашу исходную модель на ее наборе данных:

После обучения снова заворачиваем исходную модель в KerasClassifier:

Определение и выполнение атаки извлечения

Далее давайте создадим нашу модель вора, используя класс CopycatCNN:

Обратите внимание, что аргумент nb_stolen=len(train_images_stolen) по существу определяет, сколько образцов ART будет использовать для обучения украденной модели.

После этого нам нужно создать пустую эталонную модель, которую copycat_cnnобучит краже исходной модели:

Затем мы используем метод copycat_cnn.extract, чтобы украсть classifier_original. Мы используем подмножество из 10 000 образцов, чтобы украсть модель.

Оценка работоспособности украденной модели

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

Original test loss: 0.04 vs stolen test loss: 0.08Original test accuracy: 0.99 vs stolen test accuracy: 0.98

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

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

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

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

Скачок с 2 500 до 5 000 образцов привел к наибольшему улучшению, хотя также есть заметные различия между подмножествами из 5 000, 7 500 и 10 000 образцов.

То же самое относится и к точности теста, хотя и в гораздо меньшей степени:

Атаки логического вывода в ART

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

Начиная с версии 1.10.0 ART поддерживал только один алгоритм инверсии модели — MIFace. MIFace использует градиенты классов для вывода набора обучающих данных. Вы можете узнать больше о MIFace в этой статье.

Определение атаки

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

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

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

[0 1 2 3 4 5 6 7 8 9]

В нашем случае y состоит из целочисленных меток. Вы также можете предоставить одноразовые метки формы (nb_samples, nb_classes).

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

Обратите внимание, что пакетное измерение x_init_average имеет ту же длину, что и наш целевой список y.

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

[0.14426005 0.1032533 0.0699798 0.04295066 0.00503148 0.01931691 0.02252066 0.00906549 0.06300844 0.16753715]

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

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

Запуск атаки с инверсией модели

Теперь мы можем запустить инверсию модели, используя массив инициализации и целевые метки:

Model inversion: 100%|██████████| 1/1 [00:51<00:00, 51.23s/it]Wall time: 51.2 s

Давайте теперь проверим предполагаемые изображения:

MIFace удалось восстановить большинство изображений, хотя цифры 2 и 7 не так хороши.

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

Отравляющие атаки в ВРТ

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

Для проведения атак с отравлением мы будем использовать бэкдор-атаки (бумага) и бэкдор-атаки с чистой меткой (бумага).

Отравление выборки данных

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

The target labels for poisoning are[[0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.][0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]

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

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

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

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

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

Определение бэкдор-атаки

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

Вот как вы определяете бэкдор-атаку с чистой меткой в ​​ART:

Мы предоставили ряд аргументов для PoisoningAttackCleanLabelBackdoor, в том числе pp_poison=0.75. Этот аргумент определяет долю изображений, которые должны быть отравлены. target=target определяет цель, образцы которой должны быть отравлены. Наша атака отравит 75% изображений цифры 9.

proxy_classifier=classifier указывает, что наш исходный классификатор будет использоваться для отравления набора данных. По сути, мы используем классификатор, похожий на классификатор жертвы, чтобы помочь нам отравить данные.

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

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

Выше мы получаем индексы образцов, метки которых соответствуют нашей целевой метке 9 (строки с 3 по 6). Это индексы изображений, отравленных нашей атакой. Затем мы используем эти индексы для получения соответствующих искаженных и исходных изображений (строки 9 и 10).

После этого мы создаем фигуру с двумя столбцами и осями (строки с 16 по 20). В левом столбце будут отображаться изображения из отравленного набора данных, а в правом столбце — исходные чистые изображения. Мы указываем, какой столбец какой в ​​строках с 26 по 33.

В строке 36 мы перебираем каждую строку оси и отображаем изображения из зараженного набора данных слева (строки 40–42) и чистые изображения справа (строки 48–50).

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

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

Итак, что случилось?

1. Сначала PoisoningAttackCleanLabelBackdoor взял 75% изображений цифры 9 и применил к ним начальное возмущение. Если мы посмотрим на исходный код класса этой атаки, то увидим, что первоначальная атака — это ProjectecGradientDescent(класс в документах и бумага для метода). Возмущения сделали образцы менее похожими на цифру 9.

2. После этого возмущенные образцы передаются в PoisonAttackBackdoor для добавления небольшого паттерна в их нижний правый угол.

3. Наконец, PoisoningAttackCleanLabelBackdoorвозвращает искаженные изображения вместе с исходными метками.

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

Обучение классификатора жертв

Далее давайте определим новый классификатор жертв:

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

Давайте обучим модель жертвы на отравленном наборе данных:

Отравление данных во время вывода

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

Давайте визуализируем отравленные изображения вместе с их истинными метками:

Мы видим, что атака добавила шаблон в правом нижнем углу каждого изображения. Теперь модель должна классифицировать эти изображения как цифру 9, потому что она соответствовала этому шаблону.

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

Clean test loss: 0.13 vs poisoned test loss: 2.31Clean test accuracy: 0.97 vs poisoned test accuracy: 0.60

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

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

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

Следующие шаги

Вы должны пойти дальше и попробовать другие методы атаки, поддерживаемые в ART! Вы также можете поиграть с параметрами атаки, чтобы понять, как они влияют на эффективность атак.

В ЧАСТИ 2 мы рассмотрим меры защиты, реализованные в рамках. ART имеет довольно широкий спектр средств защиты от атак, которые мы рассмотрели, так что есть что исследовать!

До скорого!