exponenta event banner

Создание неназначенных и целевых состязательных примеров для классификации изображений

В этом примере показано, как использовать метод быстрых градиентных знаков (FGSM) и основной итеративный метод (BIM) для генерации состязательных примеров для предварительно обученной нейронной сети.

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

В этом примере создаются два типа примеров состязательности:

  • Без назначения - изменение изображения таким образом, чтобы оно было неправильно классифицировано как любой неверный класс.

  • Целевой - изменение изображения таким образом, чтобы оно было неправильно классифицировано как определенный класс.

Загрузить сеть и образ

Загрузите сеть, прошедшую обучение в наборе данных 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]. Этот метод вычисляет градиентную ∇XL (X, T) функции потерь L по отношению к изображению X, для которого вы хотите найти состязательный пример, и метке класса T. Этот градиент описывает направление «толкания» изображения, чтобы увеличить вероятность его неправильной классификации. Затем можно добавить или вычесть небольшую ошибку из каждого пикселя, чтобы увеличить вероятность неправильной классификации изображения.

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

Xadv=X+ϵ.sign (∇XL (X, T)).

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

Вычислите градиент изображения относительно класса золотистого ретривера.

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] Сегеди, Кристиан, Войцех Заремба, Илья Суцкевер, Йоан Бруна, Думитру Эрхан, Иэн Гудфеллоу и Роб Фергус. «Интригующие свойства нейронных сетей». Препринт, представлен 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.

См. также

| | | | |

Связанные темы