AI 安全之对抗样本入门 (2):深度学习基础知识 1.1.1&1.1.2

阅读数:10 2019 年 11 月 30 日 14:51

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

(数据预处理)

内容简介
第 1 章介绍了深度学习的基础知识,重点介绍了与对抗样本相关的梯度、优化器、反向传递等知识点。
第 2 章介绍了如何搭建学习对抗样本的软硬件环境,虽然 GPU 不是必需的,但是使用 GPU 可以更加快速地验证你的想法。
第 3 章概括介绍了常见的深度学习框架,从 TensorFlow、Keras、PyTorch 到 MXNet。
第 4 章介绍了图像处理领域的基础知识,这部分知识对于理解对抗样本领域的一些常见图像处理技巧非常有帮助。
第 5 章介绍了常见的白盒攻击算法,从基础的 FGSM、DeepFool 到经典的 JSMA 和 CW。
第 6 章介绍了常见的黑盒攻击算法。
第 7 章介绍了对抗样本在目标识别领域的应用。
第 8 章介绍了对抗样本的常见抵御算法,与对抗样本一样,抵御对抗样本的技术也非常有趣。
第 9 章介绍了常见的对抗样本工具以及如何搭建 NIPS 2017 对抗防御环境和轻量级攻防对抗环境 robust-ml,通过这章读者可以了解如何站在巨人的肩膀上,快速生成自己的对抗样本,进行攻防对抗。

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


(定义网络结构)

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

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

y=wx+b

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

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 1-1 区分正常用户和黑客的二分类问题
  1. Dense 层

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

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 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 表示是否使用偏置。
  1. Activation 层

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

(1)relu

relu 函数当输入小于 0 时为 0,当输入大于 0 时等于输入。使用代码绘制 relu 的图像,获得图像(见图 1-3)。

复制代码
def relu(x):
if x > 0:
return x
else:
return 0
def 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()

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 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.1
def 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()

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 1-4 leakyrelu 图像

(3)tanh

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

f(x)=exexex+ex

使用代码绘制 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()

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 1-5 tanh 图像

(4)sigmoid

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

f(x)=11+ex

使用代码绘制 sigmoid 的图像,获得图像(见图 1-6)。

复制代码
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()

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

图 1-6 sigmoid 图像

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

复制代码
model.add(Dense(32, input_shape=(784,)))
model.add(Activation('relu'))

等价于下列代码:

复制代码
model.add(Dense(32, activation='relu',input_shape=(784,)))
  1. Dropout 层

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

复制代码
keras.layers.core.Dropout(rate, noise_shape=None, seed=None)

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

  1. 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。
  1. Flatten 层

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

  1. 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.')
  1. Reshape 层

Reshape 层用于将输入 shape 转换为特定的 shape。函数定义如下代码所示:

复制代码
keras.layers.core.Reshape(target_shape)

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

AI安全之对抗样本入门(2):深度学习基础知识 1.1.1&1.1.2

购书地址 https://item.jd.com/12532163.html?dist=jd

评论

发布