深度学习系统为什么容易受到对抗样本的欺骗?

深度学习与对抗样本
本文探讨了深度学习系统如何被对抗样本欺骗及其背后的原理。通过实验揭示了神经网络对图像的识别特点,并介绍了两种主要的对抗样本生成方法。此外,还提出了避免深度学习系统受骗的策略。

转自:https://zhuanlan.zhihu.com/p/89665397

本文作者:kurffzhou,腾讯 TEG 安全工程师

最近,Nature发表了一篇关于深度学习系统被欺骗的新闻文章,该文指出了对抗样本存在的广泛性和深度学习的脆弱性,以及几种可能的解决方法。安全平台部基础研究组自2017年来在对抗样本的生成及防守方法进行了深入研究,在这里团队通过在攻击方面的经验,分享我们对于防守对抗样本的一些思考,欢迎共同讨论。

深度学习在现实生活中的应用越来越广,然而越来越多的例子表明,深度学习系统很容易受到对抗样本的欺骗。那么,AI到底是怎么“想”的?为什么这么容易被骗?

要回答这个问题,我们首先看图片来做个小实验——

  • 图1左图:原始图片(图片来源:ImageNet数据集)
  • 图1中图:局部块保持像素的布局不变,但是整体图像的全局布局改变
  • 图1右图:局部块的像素的布局变化,但是整体图像的全局布局不变

对于这三幅图,神经网络会“认为”图1中图图1右图哪张图片更与图1左图是一致的呢?

毫无疑问,对于人的直觉来说,相对图1中图而言,图1右图更与图1左图一致,因为人类普遍倾向于对整体图像的布局进行识别。

然而我们通过统计实验发现,利用神经网络进行预测,图1中图的预测结果更加倾向于与图1左图的预测结果保持一致。可见,人与机器对图片的识别结果存在较大差异。

为了深入解释这种差异,下文首先对深度学习常用的模型进行简单介绍,再对深度学习模型所学习得到的特征进行可视化来解释深度学习模型在图像方面的优势,并通过相关实验研究深度学习模型到底在“想”什么、学习了什么。

1、深度学习常用模型以及特征可视化

深度学习常用模型之一的Alexnet模型:Alexnet模型通过多层卷积以及max-pooling操作,最后通过全连层得到最后预测结果,通过计算损失L来刻画网络预测结果与我们人工标注类别的差异大小,然后通过计算损失对可学习参数的梯度,通过梯度下降的方式来更新网络的权重,直到损失L下降到网络预测的结果与我们人工标注差异很小时,即神经网络通过对输入图像的层层卷积、max-pooling、全连等操作获得了正确的结果。

我们首先对多种不同类型的网络(AlexNet, ResNet等)的底层卷积核进行可视化,我们发现这些底层特征存在一定的共性:这些网络底层卷积核都在提取梯度、颜色等局部模式,对应图像中边和线等,如图3所示。

为了可视化高层特征,我们通过梯度上升优化目标函数的方式来直观认识高层特征所对应的直观图像。我们首先将图像初始化为0,并通过计算如图4中损失函数对图像的梯度,并不断修改图像像素就会得到图5中的可视化结果。这些图表示,要使得最终某类的分数最大,那么所对应的输入图像应该是什么样子,从图56

2、深度学习模型到底学习了什么?

那么,深度学习模型到底都在学习什么呢?

首先输入一张正常图像,我们通过放大的方式来可视化神经网络看到的模式:首先将原始图片通过神经网络进行计算,得到当前图片的输出结果,然后用梯度上升的方式最大化该输出结果,利用如图4中所使用的方法,最后得到如图8所示的结果。

从图中可以看出,神经网络对输入图像中的颜色和纹理进行了语义类别的放大,并产生对应的语义理解。例如,在山的区域,神经网络进行了建筑以及动物的解释,在天空区域有某些海洋生物的解释。但是由于这幅输入图像的这种解释所产生的特征响应并没有达到一定的程度,因此不会影响最后网络的识别,即神经网络不会把山那块区域识别成动物等。

从上述可视化的结果可以看出,神经网络是对纹理颜色等进行了语义的理解,但并没有显著对全局的形状等信息进行了理解,最近一系列工作都表明了这点,例如Geirhos, Robert等人指出,在ImageNet预训练的网络对纹理存在偏向,他们利用实验做了说明:如下图所示:

第一幅没有任何全局形状的信息,神经网络预测该幅图像为大象,对于第二幅图像预测为猫,对于第三幅图像,神经网络依然预测为大象,尽管人可能会识别出是一只猫,因此从这个对比实验中可以看出,神经网络更倾向于对纹理等信息进行了语义理解。

本文开头的小实验也进一步验证了这个假设:局部纹理的打乱,能够显著破坏神经网络的高层语义理解,但是全局结构的打乱并不能显著破坏神经网络的语义理解。

3、对抗样本生成

那么,一般是如何生成对抗样本呢?主要有两种方法:

1)基于梯度的方法:一般采用类似可视化的方法,只不过优化的目标不同,通过梯度更新的方式使得损失变大,并将生成纹理扰动叠加到原始图像上得到对抗样本。比较常用的方法有FGSM,BIM,基于momentum的方法,基于所有图片的梯度进行平滑的方法UAP,以及我们为了解决黑盒迁移性提出的TAP方法,这类方法速度较慢,一般通过多次迭代得到对抗样本,这类方法简单易扩展到其他任务。

2)基于神经网络的对抗样本生成方法:采用神经网络直接输出对抗样本,例如,AdvGAN、ATN等方法。这类方法的速度较快,但由于神经网络参数固定后生成的对抗样本会存在不丰富的问题。

4、如何避免“被骗”?

如Nature新闻中所说,不停的加入对抗样本训练能够获得对对抗样本的鲁棒性吗?我们给出答案是NO。对于对抗训练生成的模型,我们论文中的方法已经实验证明无法扛住低频扰动的对抗样本,文献3通过大量的实验也已证明,NIPS 2017对抗样本挑战赛中所使用的防守方法都无法防住包含低频扰动的对抗样本。

此外,底层图像去噪这种方法也是见效甚微。底层图像去噪只能防止高频的噪声的对抗样本,对于低频的噪声的对抗样本也无法完全抵抗。

通过在攻击方面的经验,团队对于对抗样本的防守方法有以下思考:

1)对特征值进行截断限制

对神经网络里使用truncated relu这类激活函数,对特征值进行截断处理,防止因为对抗样本造成的特征突变太大,影响网络最终预测结果。

2)设计模型更加关注图像整体结构,而不是纹理特征获得更强的鲁棒性

如Nature新闻中指出的,DNN和符号AI的结合,加入结构化的规则来融合整体的结构信息。

安全平台部公共平台中心基础研究组在对抗样本方面进行了深入的研究,并在计算机视觉顶级会议之一的ECCV 2018上发表对抗样本生成的论文,在NIPS 2017对抗样本挑战赛、极棒上海邀请赛等国内外大赛中均取得优异成绩。欢迎各位对对抗样本生成以及防守感兴趣的同学与我们交流。

基于深度学习的文本对抗样本生成防御系统旨在保护深度学习模型免受对抗样本的攻击,确保模型在面对恶意扰动输入时仍能保持较高的准确性和鲁棒性。 ### 系统介绍 在深度学习系统中,对抗样本是经过精心设计的输入,通过微小的、人难以察觉的扰动来欺骗模型,使其做出错误的预测。对于文本领域,攻击者可以对文本进行细微修改,如替换同义词、调整语序等,从而生成对抗样本。一个好的防御系统不仅要能抵御对抗性攻击,还要抵抗对抗性可迁移性,即防止攻击在不同模型之间的迁移 [^2]。 此外,对抗样本的鲁棒性也是一个重要考量因素。鲁棒性指的是对抗样本在物理世界中仍保持其攻击深度学习模型的能力。在现实世界中,文本数据在被模型处理前可能会经过各种转换,如自然噪声、数据预处理等,防御系统需要确保在这些情况下仍能有效防御 [^3]。 ### 系统实现 实现基于深度学习的文本对抗样本生成防御系统可以从多个方面入手: - **数学建模**:通过建立数学模型来描述对抗样本的生成机制和攻击过程,从而更好地理解攻击原理,为防御策略的制定提供理论支持。 - **代码实现**:可以参考相关的研究和实践,使用深度学习框架(如 PyTorch)来实现防御算法。例如,在数字对抗样本生成的研究中,使用 PyTorch 搭建 LeNet 网络完成手写数字识别任务,并生成针对该网络的对抗样本,这其中的一些技术和思路可以借鉴到文本领域 [^4]。 - **实验分析**:对防御系统进行全面的实验分析,评估其在不同攻击方法下的性能。可以在特定数据集上正常训练模型,然后对不同攻击方法生成的对抗样本进行分类精度评估,以此来衡量防御系统的有效性 [^2]。 ### 代码示例 以下是一个简单的基于 PyTorch 的文本分类模型示例,可作为防御系统的基础模型: ```python import torch import torch.nn as nn import torch.optim as optim # 定义一个简单的文本分类模型 class TextClassifier(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(TextClassifier, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.fc1(x) out = self.relu(out) out = self.fc2(out) return out # 初始化模型 input_size = 100 hidden_size = 50 output_size = 2 model = TextClassifier(input_size, hidden_size, output_size) # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=0.001) # 模拟训练数据 inputs = torch.randn(10, input_size) labels = torch.randint(0, output_size, (10,)) # 训练模型 for epoch in range(100): optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() if (epoch + 1) % 10 == 0: print(f'Epoch [{epoch+1}/100], Loss: {loss.item():.4f}') ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值