AI安全之对抗样本学习笔记
本人大三学生,最近在看《ai安全之对抗样本》,发现网上对本书的学习记录较少,所以准备在此做一些记录,以便大家使用;
书中所有的源码都是基于PyTorch或者Tensorflow;
记录会直接跳过书本的前几章,直接进入算法内容,想要学号DeepLearning并在安全方面有所作为,只看这本书是远远不够的,如果真的想学,建议先从python开始;
学习路线建议:
python–>python之深度学习–>tensorflow或者PyTorch–>对抗样本;
进入正题:
第五章
5.1对抗样本的基本原理
用自然语言描述,对抗样本其实就是在原数据上加入一些人难以识别的干扰元素,使得机器学习模型给出错误的判断或者分类;
用数学语言描述:
设:输入数据为x,分类器为f,对应的分类结果为分f(x);
假设存在一个非常小的扰动使得:
f(x+ε)!=f(x)
那么x+ε就称为一个对抗样本;
5.2基于优化的对抗样本生成算法
对抗样本看似很简单,不就是在图片上添加扰动吗,很容易实现,事实好像也是这样,在白盒攻击中,有很多算法可以使你的机器学习网络得出的结果错误,但在黑盒或者物理世界中还真的是这样吗?但一切都必须要有始有终,所以先从基础的白盒攻击来体会和理解怎么攻击;
进入正题:
5.2.1对抗样本生成算法
深度学习在训练过程中,通过计算样本数据的预测值与真实值之间的损失函数,之后在反向传递的过程中通过链式法则调整模型的参数,不断减小损失函数的值,迭代计算出模型的各层参数。(如图)
生成对抗样本的基本过程也可以参考这一过程,不同的是在迭代训练的过程中,我们把网络的参数固定下来,把对抗样本当作唯一需要训练的参数,通过反向传递过程调整对抗样本(如图)
5.2.2 使用TensorFlow生成对抗样本
直接上代码(并没有涉及什么算法所以大家看懂就好):
"""首先加载使用的库文件,被攻击的模型是pb格式,TensorFlow把计算图以及模型参数都保存在一个pb文件中,因此不用额外引入模型计算图定义的库。"""
import numpy as np
from PIL import Image
import tensorflow as tf
import re
#把id转换成可读字符串
#参考:https://github.com/tensorflow/models/blob/1af55e018eebce03fb61bba9959a04672536107d/tutorials/image/imagenet/classify_image.py
class NodeLookup(object):
"""Converts integer node ID's to human readable labels."""
def __init__(self,
label_lookup_path=None,
uid_lookup_path=None):
if not label_lookup_path:
label_lookup_path = 'models/imagenet_2012_challenge_label_map_proto.pbtxt'
if not uid_lookup_path:
uid_lookup_path = 'models/imagenet_synset_to_human_label_map.txt'
self.node_lookup = self.load(label_lookup_path, uid_lookup_path)
def load(self, label_lookup_path, uid_lookup_path):
"""Loads a human readable English name for each softmax node.
Args:
label_lookup_path: string UID to integer node ID.
uid_lookup_path: string UID to human-readable string.
Returns:
dict from integer node ID to human-readable string.
"""
if not tf.gfile.Exists(uid_lookup_path)