Этот пример показывает, как использовать быстрый метод знака градиента (FGSM) и основной итерационный метод (BIM) для генерации состязательных примеров для предварительно обученной нейронной сети.
Нейронные сети могут быть восприимчивы к явлению, известному как состязательные примеры [1], где очень маленькие изменения входа могут привести к неправильной классификации входа. Эти изменения часто незаметны для людей.
В этом примере вы создаете два типа состязательных примеров:
Untargeted - Измените изображение так, чтобы оно было неправильно классифицировано как любой неправильный класс.
Целевой - измените изображение так, чтобы оно было неправильно классифицировано как определенный класс.
Загрузите сеть, которая была обучена на наборе данных ImageNet [2], и преобразуйте ее в dlnetwork
.
net = squeezenet;
lgraph = layerGraph (net);
lgraph = removeLayers (lgraph, lgraph.Layers (end) .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]. Этот метод вычисляет градиент функции потерь , относительно изображения вы хотите найти состязательный пример для и метки класса . Этот градиент описывает направление «толкать» изображение, чтобы увеличить вероятность того, что оно будет неправильно классифицировано. Затем можно добавить или вычесть небольшую ошибку из каждого пикселя, чтобы увеличить вероятность неправильной классификации изображения.
Состязательный пример вычисляется следующим образом:
.
Параметр управляет размером толчка. Большее значение увеличивает вероятность генерации неправильно классифицированного изображения, но делает изменение изображения более видимым. Этот метод является неотключенным, поскольку цель состоит в том, чтобы получить неправильную классификацию изображения, независимо от того, какой класс.
Вычислите градиент изображения относительно класса golden retriever.
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);
Из-за незаметных возмущений сеть классифицирует состязательное изображение как большую белую акулу.
Чтобы сделать сеть более устойчивой против состязательных примеров, можно использовать состязательное обучение. Для примера, показывающего, как обучить сеть, устойчивую к состязательным примерам, смотрите Train Image Classification Network Robust to Conversarial Examples.
Вычислите градиент, используемый для создания неотключенного состязательного примера. Этот градиент является градиентом потерь перекрестной энтропии.
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] Сегеди, Кристиан, Войцех Заремба, Илья Суцкевер, Жоан Бруна, Думитру Эрхан, Иан Гудфеллоу и Роб Фергус. «Интригующие свойства нейронных сетей». Препринт, представленный 19 февраля 2014 года. https://arxiv.org/abs/1312.6199.
[4] Куракин, Алексей, Ян Гудфеллоу и Сами Бенгио. «Состязательные примеры в физическом мире». Препринт, представленный 10 февраля 2017 года. https://arxiv.org/abs/1607.02533.
[5] Мадри, Александер, Александар Макелов, Людвиг Шмидт, Димитрис Ципрас, и Адриан Владу. «К моделям глубокого обучения, устойчивым к состязательным атакам». Препринт, представленный 4 сентября 2019 года. https://arxiv.org/abs/1706.06083.
dlfeval
| dlgradient
| dlnetwork
| onehotdecode
| onehotencode
| predict