主要内容

训练图像分类网络对对抗实例鲁棒性

这个例子展示了如何使用快速梯度符号方法(FGSM)对抗训练训练一个对对抗例子鲁棒的神经网络。

神经网络容易受到一种现象的影响敌对的例子[1],其中对输入的微小更改可能导致它被错误分类。这些变化往往是人类察觉不到的。

创建对抗实例的技术包括FGSM[2]和基本迭代方法(BIM)[3],也称为投影梯度下降[4]。这些技术会显著降低网络的准确性。

你可以使用对抗训练[5]来训练对对抗实例具有鲁棒性的网络。这个例子展示了如何:

  1. 训练图像分类网络。

  2. 通过生成对抗示例来研究网络鲁棒性。

  3. 训练一个图像分类网络,该网络对对抗实例具有鲁棒性。

负荷训练数据

digitTrain4DArrayData函数加载手写数字及其数字标签的图像。创建一个arrayDatastore对象来获取图像和标签,然后使用结合函数生成包含所有训练数据的单个数据存储。

rng默认的[XTrain,TTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore(XTrain,“IterationDimension”4);dsTTrain = arrayDatastore(TTrain);dsTrain = combine(dsXTrain,dsTTrain);

提取类名。

类=类别(TTrain);

构建网络架构

定义一个图像分类网络。

图层= [imageInputLayer([28 28 1],“归一化”“没有”“名字”“输入”32岁的)convolution2dLayer (3“填充”, 1“名字”“conv1”) reluLayer (“名字”“relu1”64年)convolution2dLayer(3日,“填充”, 1“名字”“conv3”) reluLayer (“名字”“relu3”) maxPooling2dLayer (2“步”2,“名字”“池”) fullyConnectedLayer (10“名字”“取得”) softmaxLayer (“名字”“softmax”));lgraph = layerGraph(图层);

创建一个dlnetwork对象从图层图。

Dlnet = dlnetwork(lgraph);

定义模型梯度函数

创建函数modelGradients,在示例末尾列出,它接受输入adlnetwork对象和带有相应标签的小批输入数据,并返回相对于网络中可学习参数的损失梯度和相应的损失。

列车网络的

使用自定义训练循环训练网络。

指定培训选项。训练30个epoch,迷你批大小为100,学习率为0.01。

numEpochs = 30;miniBatchSize = 100;learnRate = 0.01;executionEnvironment =“汽车”

创建一个minibatchqueue对象,该对象在训练期间处理和管理小批量图像。对于每个小批量:

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例结束时定义)将标签转换为单热编码变量。

  • 用尺寸标签格式化图像数据“SSCB”(空间,空间,通道,批次)。

  • 如果有GPU,可以在GPU上进行训练。默认情况下,minibatchqueue对象将每个输出转换为gpuArray如果GPU可用。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱)

mbq = minibatchqueue(dsTrain,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{“SSCB”});

初始化培训进度图。

图lineLossTrain = animatedline(“颜色”,[0.85 0.325 0.098]);Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)

初始化SGDM求解器的速度参数。

速度= [];

使用自定义训练循环训练网络。对于每个纪元,洗牌数据并在小批量数据上循环。对于每个小批量:

  • 方法评估模型梯度、状态和损失dlfeval而且modelGradients函数并更新网络状态。

  • 方法更新网络参数sgdmupdate函数。

  • 显示培训进度。

迭代= 0;开始= tic;%遍历epoch。epoch = 1:numEpochs% Shuffle数据。洗牌(兆贝可)在小批上循环。Hasdata (mbq)迭代=迭代+1;读取小批数据。[dlX,dlT] = next(mbq);如果在GPU上训练,则将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlX = gpuArray(dlX);dlT = gpuArray(dlT);结束评估模型梯度、状态和损失。[gradients,state,loss] = dlfeval(@modelGradients,dlnet,dlX,dlT);dlnet。状态=状态;使用SGDM优化器更新网络参数。[dlnet,velocity] = sgdmupdate(dlnet,gradients,velocity,learnRate);%显示培训进度。D = duration(0,0,toc(start),“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制结束结束

测试网络

通过在测试数据集上评估网络预测来测试网络的分类准确性。

创建一个minibatchqueue对象,其中包含测试数据。

[XTest,TTest] = digitTest4DArrayData;dsXTest = arrayDatastore“IterationDimension”4);dsTTest = arrayDatastore(TTest);dsTest = combine(dsXTest,dsTTest);mbqTest = minibatchqueue(dsTest...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”“SSCB”);

利用训练过的网络和模型对测试数据进行分类预测modelPredictions在本例末尾定义的函数。

YPred = modelforecasts (dlnet,mbqTest,classes);acc = mean(YPred == TTest)
Acc = 0.9866

网络精度很高。

带有对抗输入的测试网络

对输入图像应用对抗性扰动,看看这样做是如何影响网络精度的。

您可以使用FGSM和BIM等技术生成对抗性示例。FGSM是一种简单的技术,只需在梯度方向上迈出一步 X l X T 损失函数的 l ,相对于图像 X 你要找一个对抗性的例子,和类标签 T .对抗性示例计算为

X 阿德 X + ϵ 标志 X l X T

参数 ϵ 控制对抗性示例与原始图像的不同程度。在这个例子中,像素的值在0和1之间,所以an ϵ 值为0.1时,每个像素值最多改变范围的10%。的价值 ϵ 取决于图像的大小。例如,如果您的图像在0到255之间,则需要将此值乘以255。

BIM是对FGSM的简单改进,它通过多次迭代应用FGSM并应用阈值。在每次迭代之后,BIM都会对扰动进行剪辑,以确保其量级不会超过 ϵ .该方法可以产生比FGSM更小失真的对抗实例。有关生成对抗示例的详细信息,请参见生成用于图像分类的非目标和目标对抗示例

使用BIM创建对抗性示例。集ε到0.1。

= 0.1;

对于BIM,扰动的大小由参数控制 α 表示每次迭代中的步长。这是因为BIM通常在梯度方向上采取许多较小的FGSM步骤。

定义步长α以及迭代次数。

Alpha = 0.01;numAdvIter = 20;

使用adversarialExamples函数(在本例结束时定义)使用测试数据集上的BIM计算对抗示例。该函数还返回对抗图像的新预测。

reset(mbqTest) [XAdv,YPredAdv] = adversarialExamples(dlnet,mbqTest,epsilon,alpha,numAdvIter,classes);

在对例数据上计算网络的准确性。

accAdversarial = mean(YPredAdv == TTest)
accAdversarial = 0.0114

画出结果。

visualizePredictions (XAdv YPredAdv、tt);

您可以看到BIM严重降低了精度,即使图像扰动几乎不可见。

训练鲁棒网络

你可以训练一个网络,使其在对抗实例时变得健壮。一种流行的方法是对抗性训练。对抗性训练包括在训练过程中对训练数据施加对抗性扰动[4][5]。

FGSM对抗训练是一种快速有效的训练网络对对抗实例具有鲁棒性的技术。FGSM类似于BIM,但它在梯度方向上采取了更大的一步来生成对抗图像。

对抗性训练包括将FGSM技术应用于每个小批量训练数据。但是,为使培训有效,必须适用以下标准:

  • FGSM训练方法必须使用随机初始化的扰动,而不是初始化为零的扰动。

  • 使网络对大小扰动具有鲁棒性 ϵ ,执行FGSM训练,值略大于 ϵ .对于本例,在对抗性训练期间,使用步长扰乱图像 α 1 2 5 ϵ

用FGSM对抗训练训练一个新的网络。首先使用与原始网络中相同的未经训练的网络架构。

dlnetRobust = dlnetwork(lgraph);

定义对抗性训练参数。将迭代次数设置为1次,因为FGSM相当于BIM的一次迭代。随机初始化摄动和摄动图像使用α

numIter = 1;初始化=“随机”;= 1.25*;

初始化培训进度图。

图lineLossRobustTrain = animatedline(“颜色”,[0.85 0.325 0.098]);Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)

使用自定义训练循环和之前定义的相同训练选项来训练健壮的网络。这个循环与之前的自定义训练相同,但增加了对抗性扰动。

速度= [];迭代= 0;开始= tic;%遍历epoch。epoch = 1:numEpochs% Shuffle数据。洗牌(兆贝可)在小批上循环。Hasdata (mbq)迭代=迭代+ 1;读取小批数据。[dlX,dlT] = next(mbq);如果在GPU上训练,则将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”dlX = gpuArray(dlX);dlT = gpuArray(dlT);结束对数据应用对抗性扰动。dlX = basicIterativeMethod(dlnetRobust,dlX,dlT,alpha,epsilon,...numIter,初始化);评估模型梯度、状态和损失。[gradients,state,loss] = dlfeval(@modelGradients,dlnetRobust,dlX,dlT);dlnet。状态=状态;使用SGDM优化器更新网络参数。[dlnetRobust,velocity] = sgdmupdate(dlnetRobust,gradients,velocity,learnRate);%显示培训进度。D = duration(0,0,toc(start),“格式”“hh: mm: ss”);addpoints (lineLossRobustTrain、迭代、失去)标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制结束结束

测试鲁棒网络

计算鲁棒网络对数字测试数据的准确性。在标准数据上,鲁棒网络的准确率略低于非鲁棒网络。

reset(mbqTest) YPred = modelforecasts (dlnetRobust,mbqTest,classes);accRobust = mean(YPred == TTest)
accRobust = 0.9972

计算对抗精度。

reset(mbqTest) [XAdv,YPredAdv] = adversarialExamples(dlnetRobust,mbqTest,epsilon,alpha,numAdvIter,classes);accRobustAdv = mean(YPredAdv == TTest)
accRobustAdv = 0.7558

鲁棒网络的对抗精度明显优于原始网络。

金宝app支持功能

模型梯度函数

modelGradients函数以a作为输入dlnetwork对象dlnet和一小批输入数据dlX,并返回损失相对于中可学习参数的梯度dlnet、网络状态、丢失。要自动计算梯度,请使用dlgradient函数。

函数[gradients,state,loss] = modelGradients(dlnet,dlX,T) [dlYPred,state] = forward(dlnet,dlX);loss = crossentropy(dlYPred,T);gradients = dlgradient(loss,dlnet.Learnables);损失= double(gather(extractdata(Loss)));结束

输入梯度函数

modelGradientsInput函数以a作为输入dlnetwork对象dlnet和一小批输入数据dlX对应的标签T,并返回损失相对于输入数据的梯度dlX

函数gradient = modelGradientsInput(dlnet,dlX,T) T = squeeze(T);T = dlarray(T,“CB”);[dlYPred] = forward(dlnet,dlX);loss = crossentropy(dlYPred,T);gradient = dlgradient(loss,dlX);结束

小批量预处理功能

preprocessMiniBatch函数使用以下步骤预处理一小批预测器和标签:

  1. 从传入的单元格数组中提取图像数据,并连接到一个四维数组中。

  2. 从传入的单元格数组中提取标签数据,并沿着第二次维度连接到分类数组中。

  3. One-hot将分类标签编码为数字数组。编码到第一个维度会产生一个与网络输出形状匹配的编码数组。

函数[X,T] = preprocessMiniBatch(XCell,TCell)%连接。X = cat(4,XCell{1:end});X =单(X);从单元格中提取标签数据并连接。T = cat(2,TCell{1:end});单热编码标签。T = onehotencode(T,1);结束

模型预测函数

modelPredictions函数以a作为输入dlnetwork对象dlnet,一个minibatchqueue输入数据的兆贝可和网络类,并通过迭代中所有数据来计算模型预测minibatchqueue对象。函数使用onehotdecode函数来查找得分最高的预测班级。

函数forecasts = modelforecasts (dlnet,mbq,classes) forecasts = [];hasdata(mbq) dlXTest = next(mbq);dlYPred = predict(dlnet,dlXTest);YPred = onehotdecode(dlYPred,classes,1)';预测=[预测;YPred];结束结束

对抗例子功能

生成对抗的例子minibatchqueue利用基本迭代法(BIM)对目标进行建模,并利用训练好的网络预测对抗实例的类别dlnet

函数[XAdv, forecasts] = adversarialExamples(dlnet,mbq,epsilon,alpha,numIter,classes) XAdv = {};预测= [];迭代= 0;为每个小批生成对抗图像。Hasdata (mbq)迭代=迭代+1;[dlX,dlT] = next(mbq);初始化=“零”生成对抗性图像。XAdvMBQ = basiciteratiemethod (dlnet,dlX,dlT,alpha,epsilon,...numIter,初始化);预测对抗图像的类别。dlYPred = predict(dlnet,XAdvMBQ);YPred = onehotdecode(dlYPred,classes,1)';XAdv{迭代}= XAdvMBQ;预测=[预测;YPred];结束%连接。XAdv = cat(4,XAdv{:});结束

基本迭代法函数

使用基本迭代方法(BIM)生成对抗示例。该方法在多次迭代中运行,每次迭代结束时都有一个阈值,以确保条目不会超过阈值ε.当numIter设置为1,这相当于使用快速梯度符号方法(FGSM)。

函数XAdv = basiciteratiemethod (dlnet,dlX,dlT,alpha,epsilon,numIter,初始化)初始化扰动。如果初始化= =“零”delta = 0 (size(dlX),“喜欢”dlX);其他的delta = ε *(2*rand(size(dlX),“喜欢”,dlX) - 1);结束i = 1:numIter对数据应用对抗性扰动。gradient = dlfeval(@modelGradientsInput,dlnet,dlX+delta,dlT);δ = δ + α *号(梯度);(>) =;Delta (Delta < - ε) = - ε;结束XAdv = dlX + delta;结束

可视化预测结果函数

可视化图像及其预测的类别。正确的预测使用绿色文本。不正确的预测使用红色文字。

函数visualizeforecasts (XTest,YPred,TTest)图形高度= 4;宽度= 4;numImages =高度*宽度;从数据中随机选择图像。indexes = randperm(size(XTest,4),numImages);XTest = extractdata(XTest);XTest = XTest(:,:,:, indexes);YPred = YPred(指数);TTest = TTest(索引);绘制带有预测标签的图像。i = 1:(numImages) subplot(高度,宽度,i) imshow(XTest(:,:,:,i))如果预测正确,用绿色。如果预测是错误的,%使用红色。如果YPred(i) == TTest(i) color =“{绿}\颜色”其他的颜色={红}\颜色”结束标题(预测:“+ color + string(YPred(i))结束结束

参考文献

塞格迪、克里斯蒂安、沃伊切赫·扎伦巴、伊利亚·苏茨克沃、琼·布鲁纳、杜米特鲁·埃尔汉、伊恩·古德费罗和罗伯·费格斯。《神经网络的有趣特性》预印本,提交于2014年2月19日。https://arxiv.org/abs/1312.6199。

Goodfellow, Ian J., jonathan Shlens, Christian Szegedy。“解释和利用对抗的例子。”预印本,2015年3月20日提交。https://arxiv.org/abs/1412.6572。

库拉金,阿列克谢,伊恩·古德费罗和萨米·本吉奥。“物理世界中的对抗例子”预印本,提交于2017年2月10日。https://arxiv.org/abs/1607.02533。

Madry, Aleksander, Aleksandar Makelov, Ludwig Schmidt, Dimitris Tsipras和Adrian Vladu。“对抗攻击的深度学习模型”预印本,2019年9月4日提交。https://arxiv.org/abs/1706.06083。

[5]黄,埃里克,莱斯利·赖斯和J.济科·科尔特。《快速胜于免费:重新审视对抗性训练》预印本,2020年1月12日提交。https://arxiv.org/abs/2001.03994。

另请参阅

||||

相关的话题