5.1 对抗样本的基本原理
5.1 对抗样本的基本原理
对抗样本是机器学习模型的一个有趣现象,攻击者通过在原数据上增加机器学习模型可接受而人类难以通过感官辨识的细微改变,使得机器学习模型做出错误的分类决定。一个典型的场景就是图像分类模型的对抗样本,通过在图像上叠加精心构造的变化量,在肉眼难以察觉的情况下,让分类模型产生误判。如图5-1所示,原始图像被图像分类模型识别为熊猫,置信度达到了57.7%,通过在原始图像上叠加一个扰动,图像分类模型却以99.3%的置信度识别为长臂猿。
从数学角度来描述对抗样本,输入数据为x,分类器为f,对应的分类结果表示为f(x)。假设存在一个非常小的扰动,使得:
即分类结果发生了改变,那么x+e就是一个对抗样本。
以一个例子来说明对抗样本的原理,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/5-case1.ipynb
首先加载需要使用的库,其中需要重点讲的是随机生成样本的datasets库。
from sklearn import datasets
from sklearn.preprocessing import minmaxscaler
import keras
from keras import backend as k
from keras.models import sequential
from keras.layers import dense
from keras.utils import to_categorical
from keras.optimizers import rmsprop
import numpy as np
import matplotlib.pyplot as plt
图5-1 图像领域的对抗样本
通过datasets库可以随机生成样本数据,其中n_samples表示生成的样本数量,n_features为每个样本的特征数,n_classes表示生成的样本对应的标签的种类数,random_state为随机种子值。本例中我们生成4000个维度(即特征数)为1000的样本,标签种类只有两种。为了方便处理,需要把样本归一化到(0,1)的数据,标签转换成独热编码。
n_features=1000
x,y=datasets.make_classification(n_samples=4000,n_features=n_features,
n_classes=2,random_state=0)
#转换成独热编码
y=to_categorical(y)
#归一化到(0, 1)的数据
x=minmaxscaler().fit_transform(x)
攻击的分类模型是一个非常简单的多层感知机,输入层大小为1000,输出层为2,激活函数为softmax。
model = sequential()
model.add(dense(2,activation='softmax',
input_shape=(n_features,) ) )
model.compile(loss='categorical_crossentropy',
optimizer=rmsprop(),
metrics=['accuracy'])
打印模型的结构,其中需要训练的参数个数为2002个。
model.summary()
dense_1 (dense) (none, 2) 2002
total params: 2,002
trainable params: 2,002
non-trainable params: 0
对模型进行训练,批大小为16,训练30轮,准确度稳定在86%左右。
model.fit(x,y,epochs=30,batch_size=16)
epoch 29/30 4000/4000 - 0s 75us/step - loss: 0.3756 - acc: 0.8605
epoch 30/30 4000/4000 - 0s 74us/step - loss: 0.3764 - acc: 0.8580
针对第0号数据进行预测,如图5-2所示,预测结果为标签0。
x0=x[0]
y0=y[0]
x0 = np.expand_dims(x0, axis=0)
y0_predict = model.predict(x0)
print(y0_predict)
index=[0,1]
labels=["lable 0","lable 1"]
probability=y0_predict[0]
图5-2 针对原始数据的预测结果
接着我们在原始数据的每个维度上都叠加一个0.01或者–0.01的扰动形成新的数据。针对新的数据进行预测,如图5-3所示,预测结果为标签1。具体每个维度是叠加0.01还是–0.01,是我们通过某种白盒攻击算法计算得来的,这里先不展开介绍。
e = 0.01
cost, gradients = grab_cost_and_gradients_from_model([x0, 0])
n = np.sign(gradients)
x0 += n * e
y0_predict = model.predict(x0)
print(y0_predict)
图5-3 针对新数据的预测结果
相对归一化到(0,1)的数据,绝对值为0.01的扰动,就好比针对图像增加了人眼几乎无法觉察的扰动,几乎可以忽略这些扰动,但是却让分类结果产生了黑白颠倒的变化,这就是对抗样本的基本原理。
对抗样本是机器学习模型的一个有趣现象,攻击者通过在原数据上增加机器学习模型可接受而人类难以通过感官辨识的细微改变,使得机器学习模型做出错误的分类决定。一个典型的场景就是图像分类模型的对抗样本,通过在图像上叠加精心构造的变化量,在肉眼难以察觉的情况下,让分类模型产生误判。如图5-1所示,原始图像被图像分类模型识别为熊猫,置信度达到了57.7%,通过在原始图像上叠加一个扰动,图像分类模型却以99.3%的置信度识别为长臂猿。
从数学角度来描述对抗样本,输入数据为x,分类器为f,对应的分类结果表示为f(x)。假设存在一个非常小的扰动,使得:
即分类结果发生了改变,那么x+e就是一个对抗样本。
以一个例子来说明对抗样本的原理,示例代码为:
https://github.com/duoergun0729/adversarial_examples/blob/master/code/5-case1.ipynb
首先加载需要使用的库,其中需要重点讲的是随机生成样本的datasets库。
from sklearn import datasets
from sklearn.preprocessing import minmaxscaler
import keras
from keras import backend as k
from keras.models import sequential
from keras.layers import dense
from keras.utils import to_categorical
from keras.optimizers import rmsprop
import numpy as np
import matplotlib.pyplot as plt
图5-1 图像领域的对抗样本
通过datasets库可以随机生成样本数据,其中n_samples表示生成的样本数量,n_features为每个样本的特征数,n_classes表示生成的样本对应的标签的种类数,random_state为随机种子值。本例中我们生成4000个维度(即特征数)为1000的样本,标签种类只有两种。为了方便处理,需要把样本归一化到(0,1)的数据,标签转换成独热编码。
n_features=1000
x,y=datasets.make_classification(n_samples=4000,n_features=n_features,
n_classes=2,random_state=0)
#转换成独热编码
y=to_categorical(y)
#归一化到(0, 1)的数据
x=minmaxscaler().fit_transform(x)
攻击的分类模型是一个非常简单的多层感知机,输入层大小为1000,输出层为2,激活函数为softmax。
model = sequential()
model.add(dense(2,activation='softmax',
input_shape=(n_features,) ) )
model.compile(loss='categorical_crossentropy',
optimizer=rmsprop(),
metrics=['accuracy'])
打印模型的结构,其中需要训练的参数个数为2002个。
model.summary()
dense_1 (dense) (none, 2) 2002
total params: 2,002
trainable params: 2,002
non-trainable params: 0
对模型进行训练,批大小为16,训练30轮,准确度稳定在86%左右。
model.fit(x,y,epochs=30,batch_size=16)
epoch 29/30 4000/4000 - 0s 75us/step - loss: 0.3756 - acc: 0.8605
epoch 30/30 4000/4000 - 0s 74us/step - loss: 0.3764 - acc: 0.8580
针对第0号数据进行预测,如图5-2所示,预测结果为标签0。
x0=x[0]
y0=y[0]
x0 = np.expand_dims(x0, axis=0)
y0_predict = model.predict(x0)
print(y0_predict)
index=[0,1]
labels=["lable 0","lable 1"]
probability=y0_predict[0]
图5-2 针对原始数据的预测结果
接着我们在原始数据的每个维度上都叠加一个0.01或者–0.01的扰动形成新的数据。针对新的数据进行预测,如图5-3所示,预测结果为标签1。具体每个维度是叠加0.01还是–0.01,是我们通过某种白盒攻击算法计算得来的,这里先不展开介绍。
e = 0.01
cost, gradients = grab_cost_and_gradients_from_model([x0, 0])
n = np.sign(gradients)
x0 += n * e
y0_predict = model.predict(x0)
print(y0_predict)
图5-3 针对新数据的预测结果
相对归一化到(0,1)的数据,绝对值为0.01的扰动,就好比针对图像增加了人眼几乎无法觉察的扰动,几乎可以忽略这些扰动,但是却让分类结果产生了黑白颠倒的变化,这就是对抗样本的基本原理。