AI安全之对抗样本入门(txt+pdf+epub+mobi电子书下载)


发布时间:2021-04-20 05:50:12

点击下载

作者:兜哥

出版社:机械工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

AI安全之对抗样本入门

AI安全之对抗样本入门试读:

前言

生活中的深度学习

深度学习自2006年产生之后就受到科研机构、工业界的高度关注。最初,深度学习主要用于图像和语音领域。从2011年开始,谷歌研究院和微软研究院的研究人员先后将深度学习应用到语音识别,[1]使识别错误率下降了20%~30%。2012年6月,谷歌首席架构师Jeff Dean和斯坦福大学教授Andrew Ng主导著名的Google Brain项目,采用16万个CPU来构建一个深层神经网络,并将其应用于图像和语音的识别,最终大获成功。

2016年3月,AlphaGo与围棋世界冠军、职业九段棋手李世石进行围棋人机大战,以4比1的总比分获胜;2016年年末2017年年初,该程序在中国棋类网站上以“大师”(Master)为注册账号与中日韩数十位围棋高手进行快棋对决,连续60局无一败绩;2017年5月,在中国乌镇围棋峰会上,它与排名世界第一的围棋世界冠军柯洁对战,以3比0的总比分获胜。AlphaGo的成功更是把深度学习的热潮推向了全球,成为男女老少茶余饭后关注的热点话题。

现在,深度学习已经遍地开花,在方方面面影响和改变着人们的生活,比较典型的应用包括智能家居、智能驾驶、人脸支付和智能安防。深度学习的脆弱性

深度学习作为一个非常复杂的软件系统,同样会面对各种黑客攻击。黑客通过攻击深度学习系统,也可以威胁到财产安全、个人隐私、交通安全和公共安全(见图0-1)。针对深度学习系统的攻击,通常包括以下几种。图0-1 深度学习的脆弱性

1.偷取模型

各大公司通过高薪聘请AI专家设计模型,花费大量资金、人力搜集训练数据,又花费大量资金购买GPU设备用于训练模型,最后得到深度学习模型。深度学习模型的最终形式也就是从几百KB到几百MB不等的一个模型文件。深度学习模型对外提供服务的形式也主要分为云模式的API,或者私有部署到用户的移动设备或数据中心的服务器上。针对云模式的API,黑客通过一定的遍历算法,在调用云模式的API后,可以在本地还原出一个与原始模型功能相同或者类似的模型;针对私有部署到用户的移动设备或数据中心的服务器上,黑客通过逆向等传统安全技术,可以把模型文件直接还原出来供其使用。偷取深度学习模型的过程如图0-2所示。

2.数据投毒

针对深度学习的数据投毒主要是指向深度学习的训练样本中加入异常数据,导致模型在遇到某些条件时会产生分类错误。如图0-3所示。早期的数据投毒都存在于实验室环境,假设可以通过在离线训练数据中添加精心构造的异常数据进行攻击。这一攻击方式需要接触到模型的训练数据,而在实际环境中,绝大多数情况都是公司内部在离线数据中训练好模型再打包对外发布服务,攻击者难以接触到训练数据,攻击难以发生。于是攻击者把重点放到了在线学习的场景,即模型是利用在线的数据,几乎是实时学习的,比较典型的场景就是推荐系统。推荐系统会结合用户的历史数据以及实时的访问数据,共同进行学习和判断,最终得到推荐结果。黑客正是利用这一可以接触到训练数据的机会,通过一定的算法策略,发起访问行为,最终导致推荐系统产生错误。图0-2 偷取深度学习模型图0-3 针对深度学习的数据投毒

3.对抗样本

对抗样本由Christian Szegedy等人提出,是指在数据集中通过故意添加细微的干扰所形成的输入样本,这种样本导致模型以高置信度给出一个错误的输出。在正则化背景下,通过对抗训练减少原有独立[2]同分布的测试集的错误率,在对抗扰动的训练集样本上训练网络。

简单地讲,对抗样本通过在原始数据上叠加精心构造的人类难以察觉的扰动,使深度学习模型产生分类错误。以图像分类模型为例,如图0-4所示,通过在原始图像上叠加扰动,对于肉眼来说,扰动非常细微,图像看起来还是熊猫,但是图像分类模型却会以很大的概率识别为长臂猿。[3]图0-4 针对图像分类模型的对抗样本

下面以一个图像分类模型为例,更加直接地解释对抗样本的基本原理。通过在训练样本上学习,学到一个分割平面,在分割平面一侧的为绿球,在分割平面另外一侧的为红球。生成攻击样本的过程,就是在数据上添加一定的扰动,让其跨越分割平面,从而把分割平面一侧的红球识别为绿球,如图0-5所示。图0-5 对抗样本的基本原理

对抗样本按照攻击后的效果分为Targeted Attack(定性攻击)和Non-Targeted Attack(无定向攻击)。区别在于Targeted Attack在攻击前会设置攻击的目标,比如把红球识别为绿球,或者把面包识别为熊猫,也就是说在攻击后的效果是确定的;Non-Targeted Attack在攻击前不用设置攻击目标,只要攻击后,识别的结果发生改变即可,可能会把面包识别为熊猫,也可能识别为小猪佩琪或者小猪乔治,如图0-6所示。图0-6 Targeted Attack和Non-Targeted Attack

对抗样本按照攻击成本分为White-Box Attack(白盒攻击)、Black-Box Attack(黑盒攻击)和Real-World Attack/Physical Attack(真实世界/物理攻击)。

White-Box Attack(见图0-7)是其中攻击难度最低的一种,前提是能够完整获取模型的结构,包括模型的组成以及隔层的参数情况,并且可以完整控制模型的输入,对输入的控制粒度甚至可以到比特级别。由于White-Box Attack前置条件过于苛刻,通常作为实验室的学术研究或者作为发起Black-Box Attack和Real-World Attack/Physical Attack的基础。图0-7 White-Box Attack

Black-Box Attack相对White-Box Attack攻击难度具有很大提高,Black-Box Attack完全把被攻击模型当成一个黑盒,对模型的结构没有了解,只能控制输入,通过比对输入和输出的反馈来进行下一步攻击,见图0-8。图0-8 Black-Box Attack

Real-World Attack/Physical Attack(见图0-9)是这三种攻击中难度最大的,除了不了解模型的结构,甚至对于输入的控制也很弱。以攻击图像分类模型为例(见图0-10),生成的攻击样本要通过相机或者摄像头采集,然后经过一系列未知的预处理后再输入模型进行预测。攻击中对抗样本会发生缩放、扭转、光照变化、旋转等。图0-9 Real-World Attack/Physical Attack图0-10 图像分类模型的真实世界/物理攻击常见检测和加固方法

1.深度学习脆弱性检测

检测深度学习脆弱性的过程,其实就是发起攻击的过程,常见的白盒攻击算法列举如下。

·ILCM(最相似迭代算法)

·FGSM(快速梯度算法)

·BIM(基础迭代算法)

·JSMA(显著图攻击算法)

·DeepFool(DeepFool算法)

·C/W(C/W算法)

常见的黑盒攻击方法列举如下。

·Single Pixel Attack(单像素攻击)

·Local Search Attack(本地搜索攻击)

2.深度学习脆弱性加固

针对深度学习脆弱性进行加固的常见方法主要包括以下几种,我们将重点介绍Adversarial training。

·Feature squeezing(特征凝结)

·Spatial smoothing(空间平滑)

·Label smoothing(标签平滑)

·Adversarial training(对抗训练)

·Virtual adversarial training(虚拟对抗训练)

·Gaussian data augmentation(高斯数据增强)

Adversarial training如图0-11所示,其基本思路是,常见的对抗样本生成算法是已知的,训练数据集也是已知的,那么可以通过常见的[4][5]一些对抗样本工具箱,比如AdvBox或者FoolBox,在训练数据的基础上生成对应的对抗样本,然后让深度学习模型重新学习,让它认识这些常见的对抗样本,这样新生成的深度学习模型就具有了一定的识别对抗样本的能力。

与Adversarial training思路类似的是Gaussian data augmentation。Gaussian data augmentation的基本原理是,对抗样本是在原始数据上叠加一定的扰动,这些扰动非常接近随机的一些噪声。Adversarial training虽然简单易于实现,但是技术上难以穷尽所有的攻击样本。Gaussian data augmentation直接在原始数据上叠加高斯噪声,如图0-12所示,k为高斯噪声的系数,系数越大,高斯噪[6]声越强,其他参数分别表示高斯噪声的均值和标准差。Gaussian data augmentation把训练数据叠加了噪声后,重新输入给深度学习模型学习,通过增加训练轮数、调整参数甚至增加模型层数,在不降低原有模型准确度的情况下,让新生成的深度学习模型具有了一定的识别对抗样本的能力。图0-11 Adversarial training原理图图0-12 图像增加高斯噪声对抗样本领域的最新进展

对抗样本是AI安全研究的一个热点,新的攻击算法和加固方法层出不穷,而且攻击场景也从实验室中的简单图像分类,迅速扩展到智能音箱、无人驾驶等领域。百度安全实验室的最新研究报告《感知欺骗:基于深度神经网络(DNN)下物理性对抗攻击与策略》成功入选BlackHat Europe 2018。报告展现了让物体在深度学习系统的“眼”中凭空消失,在AI时代重现了大卫·科波菲尔的经典魔法。针对深度学习模型漏洞进行物理攻击可行性研究有着广泛的应用前景,在自动驾驶领域、智能安防领域、物品自动鉴定领域都有重要的实际意义。

如图0-13所示,在时间t的时候,当在车后显示器中显示正常0logo时,YOLOv3可以正确识别目标车辆,而在t时,切换到扰动后1的图片时,它可以立刻让目标车辆在YOLOv3面前变得无法辨识;在t时,如图0-14所示切换回正常的图片,YOLOv3重新可以识别目标2车辆。这是首次针对车辆的物理攻击的成功展示,与以往的学术论文相比,在攻击目标的大小、分辨率的高低以及物理环境的复杂性等方面,在影响和难度上都是一个巨大提升。图0-13 t时可以正常识别出车辆,t时无法识别出车辆01图0-14 t时可以正常识别出车辆2

Kan Yuan和Di Tang等人在论文《Stealthy Porn:Understanding Real-World Adversarial Images for Illicit Online Promotion》中介绍了黑产如何通过单色化、加噪声、增加文字、仿射变化、滤波模糊化和遮盖等方式让违规图片绕过目前主流的图片内容检测服务。这也标志着对抗样本技术已经从实验室环境真正进入了网络对抗实战。

国内安全人员在对抗样本领域的研究成果得到了国际的普遍认可。朱军等人指导的清华大学团队曾在NIPS 2017对抗样本攻防竞赛中夺冠,纪守领老师所在的NESA Lab提出了一种新型的对抗性验证码,能防范来自打码平台等黑产的破解。

[1] G Dahl, D Yu, L Deng. Context-dependent pre-trained deep neural networks for large-vocabulary speech recognition[J]. IEEE Transactions on Audio, Speech, and Language Processing, 2012,20(1):30-42.

[2] Szegedy C,Zaremba W,Sutskever I,et al.Intriguing properties of neural networks[J].Computer Science,2013.

[3] 图片源于文献Ian J.Goodfellow,Jonathon Shlens,Christian Szegedy,Explaining and Harnessing Adversarial Examples, ICLR 2015。

[4] https://github.com/baidu/AdvBox

[5] https://github.com/bethgelab/foolbox

[6] https://blog.csdn.net/u012936765/article/details/53200918/第1章 深度学习基础知识

掌握好深度学习的基础知识是理解对抗样本的基本前提,本章将简要介绍深度学习的背景知识,详细介绍与对抗样本相关的一些重要知识点。对抗样本应用最广泛的领域是机器视觉,包括图像分类、目标识别、人脸比对等,所以本章还将重点介绍基于CNN的图像分类。在实际项目中,如何衡量一个对抗样本算法性能的好坏呢?本章还将结合具体例子介绍常见的几个衡量指标。最后介绍了集成学习的概念。1.1 深度学习的基本过程及相关概念

深度学习分为训练和预测两个过程,在训练过程,通过使用预先定义好的网络结构,在打好标记的数据上进行训练,通过一定的算法不断调整网络的参数,最终满足一定的要求后,即完成了模型的训练。在预测过程中,使用训练过程中训练好的模型,对输入的数据进行运算并获得预测结果。

本节以一个最简化的二分类问题来详细介绍深度学习的训练过程。假设某网站的访问中,只存在两种情况,即正常用户的访问和黑客的访问,我们需要从访问日志中区分正常用户和黑客。我们提前准备好了一份访问日志,并人工对每条访问记录进行了标记,标记黑客的访问和正常用户的访问。为了便于训练和验证,我们把这份已经标记好的数据随机划分为训练数据集和测试数据集,通常测试数据集占全部数据集的20%~40%。1.1.1 数据预处理

深度学习中非常重要的一个环节,就是要把物理世界中的实物特征化,最终表示为多维向量,这一过程称为数据预处理。比如图片就可以表示为一个多维数组,形状为长度、宽度和信道数。比如一个分辨率为28×28的灰度图像,就可以表示成形状为[28,28,1]的向量,一个分辨率为160×160的RGB图像,就可以表示成形状为[160,160,3]的向量。1.1.2 定义网络结构

一般认为,深度学习训练好的模型包括两部分,一个是对网络结构的描述,或者称为对网络结构的定义;另外一个是每层网络的具体参数值,这两部分加起来才是一个完整的深度学习模型。完成数据预处理后,就需要定义网络结构,或者说对我们的问题进行数学建模。

假设可以通过一条直线,把黑客和正常用户区分开,即我们认为这个二分类问题是线性问题,如图1-1所示。设特征向量为x,对应的标签为y,使用一个线性函数定义整个网络:

y=w*x+b

其中w和b就是模型的参数,训练模型的过程就是迭代求解w和b的过程,通常x是一个多维向量,所以w和b通常也是多维向量。当完成了网络的定义后,输入x就可以获得确定的y,这一过程称为前向计算过程,或者称为前向传播。面对更加复杂的问题,需要使用更加复杂的层来定义网络。定义网络时的常用层包括:Dense层、Activation层、Dropout层、Flatten层、Reshape层和Permute层等。图1-1 区分正常用户和黑客的二分类问题

1.Dense层

Dense层是最常见的网络层,用于构建一个全连接。一个典型的全连接结构由输入、求和、激活、权重矩阵、偏置和输出组成,如图1-2所示,训练的过程就是不断获得最优的权重矩阵和偏置(bias)的过程。图1-2 全连接结构示意图

了解了全连接的结构后,也不难理解创建Dense层的几个参数了,例如:keras.layers.core.Dense(units, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zeros', kernel_regularizer=None, bias_regularizer=None, activity_regularizer=None, kernel_constraint=None, bias_constraint=None)

其中比较重要的几个参数含义如下。

·units表示隐藏层节点数。

·activation(激活函数)详细介绍请参见Activation层的相关内容。

·use_bias表示是否使用偏置。

2.Activation层

Actiration层对一个层的输出施加激活函数,常见的激活函数包括以下几种。(1)relu

relu函数当输入小于0时为0,当输入大于0时等于输入。使用代码绘制relu的图像,获得图像(见图1-3)。def relu(x): if x > 0: return x else: return 0def func4(): x = np.arange(-5.0, 5.0, 0.02) y=[] for i in x: yi=relu(i) y.append(yi) plt.xlabel('x') plt.ylabel('y relu(x)') plt.title('relu') plt.plot(x, y) plt.show()图1-3 relu函数(2)leakyrelu

leakyrelu函数是从relu函数发展而来的,当输入小于0时为输入乘以一个很小的系数,比如0.1,当输入大于0时等于输入。使用代码绘制leakyrelu的图像,获得图像(见图1-4)。def leakyrelu(x): if x > 0: return x else: return x*0.1def func5(): x = np.arange(-5.0, 5.0, 0.02) y=[] for i in x: yi=leakyrelu(i) y.append(yi) plt.xlabel('x') plt.ylabel('y leakyrelu(x)') plt.title('leakyrelu') plt.plot(x, y) plt.show()图1-4 leakyrelu图像(3)tanh

tanh也称为双切正切函数,取值范围为[–1,1]。tanh在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。tanh的定义如下:

使用代码绘制tanh的图像,获得图像(见图1-5)。x = np.arange(-5.0, 5.0, 0.02)y=(np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))plt.xlabel('x')plt.ylabel('y tanh(x)')plt.title('tanh')plt.plot(x, y)plt.show()图1-5 tanh图像(4)sigmoid

sigmoid可以将一个实数映射到(0,1)的区间,可以用来做二分类。sigmoid的定义如下:

使用代码绘制sigmoid的图像,获得图像(见图1-6)。图1-6 sigmoid图像x = np.arange(-5.0, 5.0, 0.02)y=1/(1+np.exp(-x))plt.xlabel('x')plt.ylabel('y sigmoid(x)')plt.title('sigmoid')plt.plot(x, y)plt.show()

Activation层可以单独使用,也可以作为其他层的参数,比如创建一个输入大小为784,节点数为32,激活函数为relu的全连接层的代码为:model.add(Dense(32, input_shape=(784,)))model.add(Activation('relu'))

等价于下列代码:model.add(Dense(32, activation='relu',input_shape=(784,)))

3.Dropout层

在深度学习中,动辄几万的参数需要训练,非常容易造成过拟合,通常为了避免过拟合,会在每次训练的时候随机选择一定的节点,使它们临时失效,形象的比喻是,好比每次识别图像的时候,随机地挡住一些像素,遮挡适当比例的像素不会影响图像的识别,但是却可以比较有效地抑制过拟合。Dropout层的定义如下:keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

其中,常用的参数就是rate,表示临时失效的节点的比例,经验值为0.2~0.4比较合适。

4.Embedding层

Embedding层负责将输入的向量按照一定的规则改变维度,有点类似于Word2Vec的处理方式,把词可以映射到一个指定维度的向量中,其函数定义如下:keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', embeddings_regularizer=None, activity_regularizer=None, embeddings_constraint=None, mask_zero=False, input_length=None)

其中比较重要的参数为:

·input_dim:输入的向量的维度。

·output_dim:输出的向量的维度。

·embeddings_initializer:初始化的方式,通常使用glorot_normal或者uniform。

5.Flatten层

Flatten层用来将输入压平,即把多维的输入一维化。

6.Permute层

Permute层将输入的维度按照给定模式进行重排。一个典型场景就是在Keras处理图像数据时,需要根据底层是TensorFlow还是Theano调整像素的顺序。在TensorFlow中图像保存的顺序是(width,height,channels)而在Theano中则为(channels,width,height),比如MNIST图像,在TensorFlow中的大小就是(28,28,1),而在Theano中是(1,28,28)。示例代码如下:if K.image_dim_ordering() == 'tf': # (width, height, channels) model.add(Permute((2, 3, 1), input_shape=input_shape))elif K.image_dim_ordering() == 'th': # (channels, width, height) model.add(Permute((1, 2, 3), input_shape=input_shape))else: raise RuntimeError('Unknown image_dim_ordering.')

7.Reshape层

Reshape层用于将输入shape转换为特定的shape。函数定义如下代码所示:keras.layers.core.Reshape(target_shape)

其中target_shape为希望转换成的形状,比如图片的大小为(1,28,28,1),但是网络的输入大小为(1,784)时就需要使用Reshape层。1.1.3 定义损失函数

完成了网络定义后,我们可以针对指定的输入x获得对应的预测值y,我们自然希望预测值y与真实值y_之间的差距越小越好,理想的情况就是在数据集上预测值y和真实值y_总是完全一样。但是事实上这几乎是无法做到的,我们需要定义预测值和真实值之间的差距,也就是理想和现实之间的差距。可以认为深度学习训练的过程,就是不断追求损失函数最小化的过程。以Keras为例,常见的损失函数有以下几种:

·mean_squared_error或mse

·mean_absolute_error或mae

·mean_absolute_percentage_error或mape

·mean_squared_logarithmic_error或msle

·squared_hinge

·hinge

·categorical_hinge

·binary_crossentropy

·logcosh

·categorical_crossentropy

·sparse_categorical_crossentrop

其中二分类问题经常使用的是binary_crossentropy,多分类问题经常使用的是categorical_crossentropy,回归问题使用mse和mae。1.1.4 反向传递与优化器

深度学习训练过程如图1-7所示。

在深度学习模型里面,经常需要使用梯度算法,针对损失函数的反馈不断调整各层的参数,使得损失函数最小化。在训练阶段,真实值就是样本对应的真实标签,预测值就是机器学习模型预测的标签值,这些都是明确的,所以损失函数是可以定义和计算的。机器学习模型训练的过程就是不断调整参数追求损失函数最小的过程。梯度可以理解为多元函数的指定点上升的坡度,假设多元函数可以表示为f(x,y),那么对应的梯度的定义为:

可见梯度可以用偏导数来定义,通常损失函数就是这个多元函数,特征向量就可以看成这个多元函数的某个点。在训练过程中,针对参数的调整可以使用梯度和学习率来定义,其中学习率也叫作学习步长,物理含义就是变量在梯度方向上移动的长度,学习率是一个非常重要的参数,学习率过大会导致损失函数的震荡难以收敛,过小会导致计算缓慢,目前还没有很成熟的理论来推倒最合适的学习率,经验值是0.001~0.1。以表示学习率,那么迭代更新参数x的方法为:图1-7 深度学习训练过程

在求函数的最大值时,我们会向梯度向上的方向移动,使用加号,也称为梯度向上算法。如果我们想求函数的最小值,则需要向梯度向下的方向移动,使用减号,也称为梯度下降算法,比如求损失函数最小值时,对应迭代求解的方法为:

我们通过一个非常简单的例子演示这个过程,假设我们只有一个变量x,对应的损失函数定义为:

根据梯度的定义,可以获得对应的梯度为:

我们随机初始化x,将学习率设置为0.1,整个过程如下:

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载