В этом примере показано, как использовать быстрый метод знака градиента (FGSM) и основной итерационный метод (BIM), чтобы сгенерировать соперничающие примеры для предварительно обученной нейронной сети.
Нейронные сети могут быть восприимчивы к явлению, известному как соперничающие примеры [1], где очень небольшие изменения во входе могут заставить вход быть неправильно классифицированным. Эти изменения часто незаметны людям.
В этом примере вы создаете два типа соперничающих примеров:
Нецеленаправленный — Изменяют изображение так, чтобы оно было неправильно классифицировано как любой неправильный класс.
Предназначенный — Изменяют изображение так, чтобы оно было неправильно классифицировано как определенный класс.
Загрузите сеть, которая была обучена на наборе данных ImageNet [2] и преобразует его в dlnetwork
.
net = squeezenet;
lgraph = layerGraph (сетевой);
lgraph = removeLayers (lgraph, lgraph.Layers (конец).Name);
dlnet = dlnetwork (lgraph);
Извлеките метки класса.
classes = categories(net.Layers(end).Classes);
Загрузите изображение, чтобы использовать, чтобы сгенерировать соперничающий пример. Изображение является изображением золотистого ретривера.
img = imread('sherlock.jpg'); T = "golden retriever";
Измените размер изображения, чтобы совпадать с входным размером сети.
inputSize = dlnet.Layers(1).InputSize;
img = imresize(img,inputSize(1:2));
figure
imshow(img)
title("Ground Truth: " + T)
Подготовьте изображение путем преобразования его в dlarray
.
X = dlarray(single(img),"SSCB");
Подготовьте метку прямым кодированием это.
T = onehotencode(T,1,'ClassNames',classes); T = dlarray(single(T),"CB");
Создайте соперничающий пример с помощью нецеленаправленного FGSM [3]. Этот метод вычисляет градиент из функции потерь , относительно изображения вы хотите найти соперничающий пример для, и метка класса . Этот градиент описывает направление, чтобы "продвинуть" изображение в увеличить шанс, это неправильно классифицируется. Можно затем добавить или вычесть небольшую ошибку из каждого пикселя, чтобы увеличить вероятность, изображение неправильно классифицируется.
Соперничающий пример вычисляется можно следующим образом:
.
Параметр управляет размером нажатия. Большее повышения стоимости шанс генерации неправильно классифицированного изображения, но делает изменение в изображении более видимым. Этот метод является нецелевым, когда цель состояла в том, чтобы неправильно классифицировать изображение, независимо от который класс.
Вычислите градиент изображения относительно класса золотистого ретривера.
gradient = dlfeval(@untargetedGradients,dlnet,X,T);
Установите epsilon
к 1 и генерируют соперничающий пример.
epsilon = 1; XAdv = X + epsilon*sign(gradient);
Предскажите класс оригинального изображения и соперничающего изображения.
YPred = predict(dlnet,X); YPred = onehotdecode(squeeze(YPred),classes,1)
YPred = categorical
golden retriever
YPredAdv = predict(dlnet,XAdv); YPredAdv = onehotdecode(squeeze(YPredAdv),classes,1)
YPredAdv = categorical
Labrador retriever
Отобразите оригинальное изображение, возмущение, добавленное к изображению и соперничающему изображению. Если epsilon
значение является достаточно большим, соперничающее изображение имеет различную метку класса от оригинального изображения.
showAdversarialImage(X,YPred,XAdv,YPredAdv,epsilon);
Сеть правильно классифицирует неизменное изображение как золотистого ретривера. Однако из-за возмущения, сеть неправильно классифицирует соперничающее изображение как лабрадора. После того, как добавленный к изображению, возмущение незаметно, демонстрируя, как соперничающие примеры могут использовать проблемы робастности в сети.
Простое улучшение FGSM должно выполнить несколько итераций. Этот подход известен как основной итерационный метод (BIM) [4] или спроектированный градиентный спуск [5]. Для BIM размером возмущения управляет параметр представление размера шага в каждой итерации. Это - когда BIM обычно берет многих, меньших, шаги FGSM в направлении градиента. После каждой итерации отсеките возмущение, чтобы гарантировать, что величина не превышает . Этот метод может дать к соперничающим примерам с меньшим количеством искажения, чем FGSM.
Когда вы используете нецеленаправленный FGSM, предсказанная метка соперничающего примера может быть очень похожа на метку оригинального изображения. Например, собака может быть неправильно классифицирована как другой вид собаки. Однако можно легко изменить эти методы, чтобы неправильно классифицировать изображение как определенный класс. Вместо того, чтобы максимизировать потерю перекрестной энтропии, можно минимизировать среднеквадратическую ошибку между выходом сети и желаемым целевым выходом.
Сгенерируйте целенаправленный соперничающий пример с помощью BIM и целевого класса белой акулы.
targetClass = "great white shark"; targetClass = onehotencode(targetClass,1,'ClassNames',classes);
Увеличьте epsilon
значение к 5, устанавливает размер шага alpha
к 0,2, и выполняют 25 итераций. Обратите внимание на то, что вам, вероятно, придется настроить эти настройки для других сетей.
epsilon = 5; alpha = 0.2; numIterations = 25;
Отслеживайте возмущение и отсеките любые значения, которые превышают epsilon
.
delta = zeros(size(X),'like',X); for i = 1:numIterations gradient = dlfeval(@targetedGradients,dlnet,X+delta,targetClass); delta = delta - alpha*sign(gradient); delta(delta > epsilon) = epsilon; delta(delta < -epsilon) = -epsilon; end XAdvTarget = X + delta;
Предскажите класс целенаправленного соперничающего примера.
YPredAdvTarget = predict(dlnet,XAdvTarget); YPredAdvTarget = onehotdecode(squeeze(YPredAdvTarget),classes,1)
YPredAdvTarget = categorical
great white shark
Отобразите оригинальное изображение, возмущение, добавленное к изображению и целенаправленному соперничающему изображению.
showAdversarialImage(X,YPred,XAdvTarget,YPredAdvTarget,epsilon);
Из-за незаметного возмущения сеть классифицирует соперничающее изображение как белую акулу.
Чтобы сделать сеть более устойчивой против соперничающих примеров, можно использовать соперничающее обучение. Для примера, показывающего, как обучить сеть, устойчивую к соперничающим примерам, смотрите, Обучают Сеть Классификации Изображений, Устойчивую к Соперничающим Примерам.
Вычислите градиент раньше создавал нецеленаправленный соперничающий пример. Этот градиент является градиентом потери перекрестной энтропии.
function gradient = untargetedGradients(dlnet,X,target) Y = predict(dlnet,X); Y = stripdims(squeeze(Y)); loss = crossentropy(Y,target,'DataFormat','CB'); gradient = dlgradient(loss,X); end
Вычислите градиент раньше создавал целенаправленный соперничающий пример. Этот градиент является градиентом среднеквадратической ошибки.
function gradient = targetedGradients(dlnet,X,target) Y = predict(dlnet,X); Y = stripdims(squeeze(Y)); loss = mse(Y,target,'DataFormat','CB'); gradient = dlgradient(loss,X); end
Покажите изображение, соответствующее соперничающее изображение и различие между двумя (возмущение).
function showAdversarialImage(image,label,imageAdv,labelAdv,epsilon) figure subplot(1,3,1) imgTrue = uint8(extractdata(image)); imshow(imgTrue) title("Original Image" + newline + "Class: " + string(label)) subplot(1,3,2) perturbation = uint8(extractdata(imageAdv-image+127.5)); imshow(perturbation) title("Perturbation") subplot(1,3,3) advImg = uint8(extractdata(imageAdv)); imshow(advImg) title("Adversarial Image (Epsilon = " + string(epsilon) + ")" + newline + ... "Class: " + string(labelAdv)) end
[1] Весельчак, Иэн Дж., Джонатон Шленс и Кристиан Сзеджеди. “Объясняя и Используя Соперничающие Примеры”. Предварительно распечатайте, представленный 20 марта 2015. https://arxiv.org/abs/1412.6572.
[2] ImageNet. http://www.image-net.org.
[3] Szegedy, христианин, Войцех Зэремба, Илья Сутскевер, Джоан Бруна, Думитру Эрхэн, Иэн Гудфеллоу и Роб Фергус. “Заинтриговывая Свойства Нейронных сетей”. Предварительно распечатайте, представленный 19 февраля 2014. https://arxiv.org/abs/1312.6199.
[4] Куракин, Алексей, Иэн Гудфеллоу и Сами Бенхио. “Соперничающие Примеры в Материальном мире”. Предварительно распечатайте, представленный 10 февраля 2017. https://arxiv.org/abs/1607.02533.
[5] Madry, Александр, Александр Мэкелов, Людвиг Шмидт, Димитрис Ципрас и Эдриан Влэду. “К Моделям Глубокого обучения, Стойким к Соперничающим Нападениям”. Предварительно распечатайте, представленный 4 сентября 2019. https://arxiv.org/abs/1706.06083.
dlnetwork
| onehotdecode
| onehotencode
| predict
| dlfeval
| dlgradient