用雅可比正则化训练鲁棒深度学习网络
这个例子展示了如何使用雅可比正则化方案[1]训练一个对对抗例子鲁棒的神经网络。
神经网络容易受到一种现象的影响敌对的例子[2],其中对输入的微小更改可能导致它被错误分类。这些变化往往是人类察觉不到的。二阶方法,如雅可比正则化,已被证明有助于提高网络对对手[3]的鲁棒性。
例如,考虑下图。左边是零的图像,右边是添加了白噪声以创建对抗示例的同一图像。没有雅可比正则化训练的网络正确地分类了零的原始图像,但错误地分类了对抗的例子。相比之下,用雅可比正则化训练的网络可以正确地对原始图像和噪声图像进行分类。
这个例子展示了如何:
使用雅可比正则化方案训练鲁棒图像分类网络。
将其预测结果与未经雅可比正则化训练的网络进行比较。
负荷训练数据
的digitTrain4DArrayData
函数加载图像及其数字标签。创建一个arrayDatastore
对象来获取图像和标签,然后使用结合
函数创建一个包含所有训练数据的单个数据存储。
[XTrain,YTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore(XTrain,“IterationDimension”4);dsYTrain = arrayDatastore(YTrain);dsTrain = combine(dsXTrain,dsYTrain);
确定训练数据中的类数。
类=类别(YTrain);numClasses = nummel(类);
接下来,对训练图像应用噪声来创建对抗示例。比较训练数据中无噪声和噪声影响10%像素的图像。
随机选择16张图片。
numImages = size(XTrain,4);randompick = randperm(numImages,16);XOriginal = XTrain(:,:,:,randompick);
通过将像素的比例设置为随机灰度值来创建有噪声的图像。
noiseProp = 0.1;噪声= rand(size(XOriginal));idx = rand(size(XOriginal)) < noiseProp;xnoise = XOriginal;xnoise (idx) = noise(idx);
将原始图像绘制在噪声图像旁边。
I1 = imtile(XOriginal);I2 = imtile(xnoise);图;subplot(1,2,2) imshow(I2)
定义网络
定义网络的架构。
指定与训练图像大小相同的图像输入层。
imageInputSize = size(XTrain, 1:3)
imageInputSize =1×328 28 1
图层= [imageInputLayer(imageInputSize,“名字”,“输入”,“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年“名字”,“conv1”) batchNormalizationLayer (“名字”,“bn1”) reluLayer (“名字”,“relu1”20岁的)convolution2dLayer (3“填充”, 1“名字”,“conv2”) batchNormalizationLayer (“名字”,“bn2”) reluLayer (“名字”,“relu2”20岁的)convolution2dLayer (3“填充”, 1“名字”,“conv3”) batchNormalizationLayer (“名字”,“bn3”) reluLayer (“名字”,“relu3”) fullyConnectedLayer (10“名字”,“俱乐部”) softmaxLayer (“名字”,“softmax”));lgraph = layerGraph(图层);
创建一个dlnetwork
对象从图层图。
Dlnet = dlnetwork(lgraph);
定义模型梯度函数
创建函数modelGradients
,列在示例的末尾,它需要adlnetwork
对象,以及带有相应标签的小批输入数据,并返回损失相对于网络中可学习参数的梯度、网络的状态和损失。
指定培训项目
训练15个阶段,小批量大小为32个。
numEpochs = 15;miniBatchSize = 32;
指定用于SGDM优化的选项。指定学习率为0.01,动量为0.9。
learningRate = 0.01;动量= 0.9;
雅可比矩阵正则化 是一个超参数,它控制雅可比正则化项对网络训练的影响。如果系数过大,则交叉熵项不能有效地最小化,网络分类的准确性较差。如果系数太小,训练后的网络对白噪声不具有预期的鲁棒性。例如,选择 .
jacobianRegularizationCoefficient = 1;
火车模型
创建一个minibatchqueue
对象,该对象在训练期间处理和管理小批量图像。对于每个小批量:
使用自定义小批量预处理功能
preprocessMiniBatch
(在本例结束时定义)将标签转换为单热编码变量。用尺寸标签格式化图像数据
“SSCB”
(空间,空间,通道,批次)。默认情况下,minibatchqueue
对象将数据转换为dlarray
具有基础类型的对象单
.不要向类标签添加格式。如果有GPU,可以在GPU上进行训练。如果有可用的图形处理器
minibatchqueue
对象将每个输出转换为gpuArray
默认情况下。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).
mbq = minibatchqueue(dsTrain,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“PartialMiniBatch”,“丢弃”,...“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重置和洗牌迷你批处理队列。洗牌(兆贝可);而Hasdata (mbq)迭代=迭代+ 1;读取小批数据。[dlX, ly] = next(mbq);计算模型梯度和网络状态% dlfeval和示例末尾列出的modelGradients函数。[gradTotalLoss, state, totalLoss] = dlfeval(@modelGradients, dlnet, dlX, dlY,...miniBatchSize jacobianRegularizationCoefficient);dlnet。状态=状态;更新网络参数。[dlnet, velocity] = sgdmupdate(dlnet,gradTotalLoss,velocity,learningRate,momentum);绘制培训进度图。D = duration(0,0,toc(start),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata (totalLoss))))标题(雅可比矩阵正则化训练+, Epoch: "+ epoch +,消失:"+字符串(D))现在绘制结束结束
负荷参考网络
加载一个参考网络,具有相同的层,但没有雅可比正则化训练。
dlnetReference = load(“dlnetWithoutJacobian.mat”) .dlnetReference;
测试模型
加载测试数据,在雅可比正则化训练的网络和参考网络之间进行比较测试。
[XTest, YTest] = digitTest4DArrayData;类=类别(YTest);
通过网络从未见过的测试图像。每次通过时,添加影响0%到50%像素的噪声,增量为5%。
初始化测试参数和数组。noiseProps = 0:0.05:0.5;为迷你批处理队列准备参数。dsYTest = arrayDatastore(YTest);miniBatchSize = 5000;为i = 1:numel(noiseProps)加载噪声比例。noiseProp = noiseProps(i);流(“测试对噪声比例的鲁棒性%1.2g\n”noiseProp)设置像素的比例为随机灰度值。噪声= rand(size(XTest));idx = rand(size(XTest)) < noiseProp;xnoise = XTest;xnoise (idx) = noise(idx);准备带有噪声测试数据的迷你批处理队列。dsXTest = arrayDatastore(xnoise,“IterationDimension”4);dsTest = combine(dsXTest,dsYTest);mbq = minibatchqueue(dsTest...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”, {“SSCB”,''});遍历批次以查找预测的分类。。而hasdata(mbq) [dlxnoise, dlY] = next(mbq);利用鲁棒网络对噪声数据进行分类。dlyprednoise =预测(dlnet, dlxnoise);将预测转换成标签。YPred = onehotdecode(dlyprednoise, classes, 1)';YTestBatch = onehotdecode(dlY, classes, 1)';评估预测的准确性。accuracyRobust(i) = mean(YPred == YTestBatch);用参考网络对有噪声的数据进行分类。dlyprednoise = predict(dlnetReference, dlxnoise);将预测转换成标签。YPred = onehotdecode(dlyprednoise, classes, 1)';评估预测的准确性。精度参考(i) =平均值(YPred == YTestBatch);结束结束
测试鲁棒性与噪声比例0测试鲁棒性与噪声比例0.05测试鲁棒性与噪声比例0.1测试鲁棒性与噪声比例0.15测试鲁棒性与噪声比例0.2测试鲁棒性与噪声比例0.25测试鲁棒性与噪声比例0.3测试鲁棒性与噪声比例0.35测试鲁棒性与噪声比例0.4测试鲁棒性与噪声比例0.45测试鲁棒性与噪声比例0.5
将两个网络的准确率百分比结果与白噪声的比例绘制成图。
注意,当噪声比例为0时,雅可比正则化训练的网络精度略低,但当图像中添加噪声时,准确率高于参考网络。
x = noiseProps';图;情节(x, accuracyRobust * 100,“o”, x, accuracyReference * 100,“o”)包含(“噪音比例”) ylabel (的精度(%)) xlim ([0, 0.5]);ylim ([0100]);标题(“图像分类精度”)传说(“雅可比矩阵正则化”,“参考”);
特定测试示例
向第一张包含数字0的测试图像添加影响15%像素的噪声。绘制原始图像和被白噪声扰动的图像。使用经过雅可比正则化训练的网络和参考网络对图像进行分类。
%选择测试图像Testchoice = 1;给第一张图片添加噪点,比例为0.15。noise = rand(size(XTest(:,:,:,testchoice)));idx =兰德(大小(XTest (:,:,:, testchoice))) < 0.15;xnoise = XTest(:,:,:,testchoice);xnoise (idx) = noise(idx);%转换为darray。dlXTest = dlarray(XTest(:,:,:,testchoice),“SSCB”);dlxnoise = dlarray(xnoise,“SSCB”);打印真实数字分类disp (“真实数字标签:”+ char(欧美(testchoice)));
真实数字标签:0
利用雅可比正则化训练的网络对原始图像进行分类。
dlYPredTestJR = predict(dlnet, dlXTest);YPredTestJR = onehotdecode(dlYPredTestJR, classes, 1)';disp (原始图像的鲁棒网络分类:+ char (YPredTestJR));
原始图像鲁棒网络分类:0
利用雅可比正则化训练的网络对噪声图像进行分类。
dlYPredNoisyJR = predict(dlnet, dlxnoise);YPredNoisyJR = onehotdecode(dlYPredNoisyJR, classes, 1)';disp (噪声图像的鲁棒网络分类+ char (YPredNoisyJR));
噪声图像的鲁棒网络分类:0
对原始图像进行非雅可比正则化训练后的网络分类。
dlYPredTest = predict(dlnetReference, dlXTest);YPredTestR = onehotdecode(dlYPredTest, classes, 1)';disp (参考网络原始图像分类:+ char (YPredTestR));
原始图像的参考网络分类:0
利用训练后的非雅可比正则化网络对噪声图像进行分类。
dlyprednoise = predict(dlnetReference, dlxnoise);YPredNoisyR = onehotdecode(dlyprednoise, classes, 1)';disp (参考网络分类噪声图像:+ char (YPredNoisyR));
噪声图像的参考网络分类:8
绘制原始图像和噪声图像,并显示每个网络给出的预测。
图;I1 = XTest(:,:,:,testchoice);subplot(1,2,1) imshow(I1)原始图像的)包含({“预测”;“雅可比正则化:”+ char (YPredTestR);...“预测”;“雅可比正则化:”+ char(YPredTestJR)}) I2 = xnoise;subplot(1,2,2) imshow(I2)“嘈杂的图像”)包含({“预测”;“雅可比正则化:”+ char (YPredNoisyR);...“预测”;“雅可比正则化:”+ char (YPredNoisyJR)})
模型梯度函数
雅可比正则化的目标是惩罚预测的大变化 相对于输入的小变化 .这样做可以使网络对受噪声污染的输入数据更加健壮。雅可比矩阵 通过包含的偏导数,对预测相对于输入的变化进行编码 关于 .
雅可比矩阵的正则化是通过将雅可比矩阵的Frobenius范数添加到损失函数中来实现的,当你训练网络时,损失函数随后被最小化。然而,雅可比矩阵的计算成本很高,需要 向后通过网络,其中 是输出的大小吗 .因此,不是计算完整的雅可比矩阵,而是计算雅可比矩阵Frobenius范数的近似值 计算公式如下[4]:
.
在哪里 是从标准正态分布中抽取的 是米——- - - - - -米单位矩阵。这可以实现如下:
选择一个迷你批量大小
为
对随机向量进行采样
归一化随机向量
计算导数
向量内积的梯度需要向后计算一次。这个近似只需要 向后传递来计算,在实践中, .
在这个例子中,预测分类之间的交叉熵 真正的分类 是否使用了,导致损失的函数
在哪里 为雅可比正则化系数。雅可比矩阵的Frobenius范数的近似值要求对 ,训练阶段需要取损失相对于参数的梯度。这些计算需要支持二阶自动微分。金宝app
的modelGradients
函数用于网络训练。它把网络作为输入,输入数据dlX
,它们各自的分类海底
,为小批尺寸miniBatchSize
,雅可比正则化系数jacobianRegularizationCoefficient
.该函数返回损失相对于网络参数的梯度gradTotalLoss
表示网络的状态状态
,以及全部损失totalLoss。
为了计算雅可比矩阵范数的近似值,取向量-向量点积的导数。由于需要二阶导数来计算损失函数相对于网络参数的梯度,因此必须设置该选项“EnableHigherDerivatives”
“真正的
当调用函数时dlgradient
.
函数[gradTotalLoss, state, totalLoss] = modelGradients(net, dlX, dlY, miniBatchSize, jacobianRegularizationCoefficient)查找预测和损失。[dlZ,state] = forward(net, dlX);损失=交叉熵(dlZ, dlY);numClasses = size(dlZ,1);numProjections = 1;regularizationTerm = 0;计算雅可比项及其梯度。为i = 1:numProjections对一个元素取自标准正态分布的矩阵进行抽样。rndarray = randn(numClasses, miniBatchSize);将随机矩阵的列归一化。Rndarray = normc(Rndarray);计算向量-向量乘积。vectorproduct = rndarray(:)' * dlZ(:);计算向量-向量乘积的梯度。从另一个%的导数将采取,设置EnableHigherDerivatives为true。vectorJacobianTerm = dlgradient(向量积,dlX,“EnableHigherDerivatives”,真正的);乘以必要的常数得到的近似值%雅可比矩阵的Frobenius范数。regularizationTerm = regularizationTerm + numClasses*sum(vectorJacobianTerm.^2,“所有”) / (numProjections * miniBatchSize);结束totalLoss =损失+ jacobianRegularizationCoefficient/2 * regularizationTerm;计算损失的梯度。gradTotalLoss = dlgradient(totalLoss, net.Learnables);结束
小批量预处理功能
的preprocessMiniBatch
函数按照以下步骤对数据进行预处理:
从传入单元格数组中提取图像数据并连接到数值数组中。在第四个维度上的连接为每个图像添加了第三个维度,用作单通道维度。
从传入的单元格数组中提取标签数据,并沿着第二次维度将数据连接到一个分类数组中。
One-hot将分类标签编码为数字数组。将标签编码到第一个维度中会生成一个与网络输出形状匹配的编码数组。
函数[X, Y] = preprocessMiniBatch(XCell,YCell)从单元格和拼接中提取图像数据X = cat(4,XCell{1:end});从单元格和级联中提取标签数据Y = cat(2,YCell{1:end});单热编码标签Y = onehotencode(Y,1);结束
参考文献
Hoffman, Judy, Daniel A. Roberts, Sho Yaida。“雅可比正则化的鲁棒学习”预印本,于2019年8月7日提交。https://arxiv.org/abs/1908.02729。
塞格迪、克里斯蒂安、沃伊切赫·扎伦巴、伊利亚·苏茨克沃、琼·布鲁纳、杜米特鲁·埃尔汉、伊恩·古德费罗和罗布·费格斯。《神经网络的有趣特性》预印本,提交于2014年2月19日。http://arxiv.org/abs/1312.6199。
玛,艾弗里,法塔什·法格里,还有阿米尔·马苏德·法拉曼德。“通过正则化的对抗鲁棒性:二阶方法。”预印本,提交,2020年4月3日。http://arxiv.org/abs/2004.01832。
Goodfellow, Ian J., jonathan Shlens和Christian Szegedy。“解释和利用对抗的例子。”预印本,提交,2015年3月20日。http://arxiv.org/abs/1412.6572。
另请参阅
dlarray
|dlgradient
|dlfeval
|dlnetwork
|预测
|minibatchqueue
|onehotencode
|onehotdecode
|sgdmupdate