论文解读(FGSM)《Explaining and Harnessing Adversarial Examples》

Posted Blair

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了论文解读(FGSM)《Explaining and Harnessing Adversarial Examples》相关的知识,希望对你有一定的参考价值。

论文信息

论文标题:Explaining and Harnessing Adversarial Examples
论文作者:Ian J. Goodfellow, Jonathon Shlens, Christian Szegedy
论文来源:ICLR 2015
论文地址:download 
论文代码:download
视屏讲解:click

1 介绍

  对抗攻击

2 方法

  扰动:

    $\\eta=\\varepsilon \\operatornamesign\\left(\\nabla_x J(\\theta, x, y)\\right)$

  对抗样本:

    $\\tildex=x+\\eta$

3 代码

from __future__ import print_function
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
from torchvision import datasets, transforms
import numpy as np
import matplotlib.pyplot as plt

# 这里的epsilon先设定为几个值,到时候后面可视化展示它的影响如何
epsilons = [0, .05, .1, .15, .2, .25, .3]
# 这个预训练的模型需要提前下载,放在如下url的指定位置,下载链接如上
pretrained_model = "data/lenet_mnist_model.pth"
use_cuda=True

# 就是一个简单的模型结构
class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 10, kernel_size=5)
        self.conv2 = nn.Conv2d(10, 20, kernel_size=5)
        self.conv2_drop = nn.Dropout2d()
        self.fc1 = nn.Linear(320, 50)
        self.fc2 = nn.Linear(50, 10)

    def forward(self, x):
        x = F.relu(F.max_pool2d(self.conv1(x), 2))
        x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2))
        x = x.view(-1, 320)
        x = F.relu(self.fc1(x))
        x = F.dropout(x, training=self.training)
        x = self.fc2(x)
        return F.log_softmax(x, dim=1)

# 运行需要稍等,这里表示下载并加载数据集
test_loader = torch.utils.data.DataLoader(
    datasets.MNIST(\'../data\', train=False, download=True, transform=transforms.Compose([
            transforms.ToTensor(),
            ])),
        batch_size=1, shuffle=True)

# 看看我们有没有配置GPU,没有就是使用cpu
print("CUDA Available: ",torch.cuda.is_available())
device = torch.device("cuda" if (use_cuda and torch.cuda.is_available()) else "cpu")

# Initialize the network
model = Net().to(device)

# 加载前面的预训练模型
model.load_state_dict(torch.load(pretrained_model, map_location=\'cpu\'))

# 设置为验证模式. 
model.eval()

 

 

# FGSM attack code
def fgsm_attack(image, epsilon, data_grad):
    # 使用sign(符号)函数,将对x求了偏导的梯度进行符号化
    sign_data_grad = data_grad.sign()
    # 通过epsilon生成对抗样本
    perturbed_image = image + epsilon*sign_data_grad
    # 做一个剪裁的工作,将torch.clamp内部大于1的数值变为1,小于0的数值等于0,防止image越界
    perturbed_image = torch.clamp(perturbed_image, 0, 1)
    # 返回对抗样本
    return perturbed_image

 

 

def test( model, device, test_loader, epsilon ):

    # 准确度计数器
    correct = 0
    # 对抗样本
    adv_examples = []

    # 循环所有测试集
    for data, target in test_loader:
        # Send the data and label to the device
        data, target = data.to(device), target.to(device)

        # Set requires_grad attribute of tensor. Important for Attack
        data.requires_grad = True

        # Forward pass the data through the model
        output = model(data)
        init_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability

        # If the initial prediction is wrong, dont bother attacking, just move on
        if init_pred.item() != target.item():
            continue

        # Calculate the loss
        loss = F.nll_loss(output, target)

        # Zero all existing gradients
        model.zero_grad()

        # Calculate gradients of model in backward pass
        loss.backward()

        # Collect datagrad
        data_grad = data.grad.data

        # Call FGSM Attack
        perturbed_data = fgsm_attack(data, epsilon, data_grad)

        # Re-classify the perturbed image
        output = model(perturbed_data)

        # Check for success
        final_pred = output.max(1, keepdim=True)[1] # get the index of the max log-probability
        if final_pred.item() == target.item():
            correct += 1
            # 这里都是为后面的可视化做准备
            if (epsilon == 0) and (len(adv_examples) < 5):
                adv_ex = perturbed_data.squeeze().detach().cpu().numpy()
                adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )
        else:
            # 这里都是为后面的可视化做准备
            if len(adv_examples) < 5:
                adv_ex = perturbed_data.squeeze().detach().cpu().numpy()
                adv_examples.append( (init_pred.item(), final_pred.item(), adv_ex) )

    # Calculate final accuracy for this epsilon
    final_acc = correct/float(len(test_loader))
    print("Epsilon: \\tTest Accuracy =  /  = ".format(epsilon, correct, len(test_loader), final_acc))

    # Return the accuracy and an adversarial example
    return final_acc, adv_examples

 

EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 论文笔记

EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES 论文笔记

EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES
原论文链接

摘要

包括神经网络在内的许多机器学习模型都很容易受到对抗样本(adversarial examples)的攻击导致误分类,对抗性样本指通过刻意的给输入增加一些轻微的恶意扰动,从而使系统以高置信度对样本进行错误的分类。之前的一些观点认为这种现象是由于非线性性质和过拟合导致的,但是本文认为神经网络对于对抗性干扰的易损性(vulnerability)的本质原因是他们在高维空间的线性性质。而最有趣的现象在于他们具有跨架构和训练集的泛化能力,本文是最先对这种现象给出解释的论文,并且这个解释得到了新的定量结果的支持。此外,本文还提供了一种简单而快速的方法来生成对抗样本,使用这种方法来提供对抗性训练的样本,可以减少 MNIST 数据集上的测试误差。

简介

对抗样本易损性:通过刻意的给输入增加一些轻微的恶意扰动,就可以使机器学习模型以高置信度对样本进行错误的分类。在很多情况下,同一个对抗样本可以让使用不同架构,在不同训练集下训练的不同模型做出误判,这说明对抗样本暴露了训练算法中的一些共通的基础盲点。

这些现象的原因是一个谜,一种推测认为这是由于深度神经网络的极端非线性,可能使模型均值化不充分以及纯监督学习的正规化不充分相结合。但本文证明这种猜测是不成立的,高维空间的线性性质足以导致对抗性样本产生,这种观点使得我们可以设计一种快速的方法来产生对抗样本以及进行对抗性训练。对抗性样本可以产生比 dropout 更优秀的正则化收益,通用的正则化策略并不能显著的降低模型的对抗样本易损性,而将模型转变为非线性模型族就有可能做到,例如 RBF 网络。

本文展示了一种权衡,是将模型训练为容易训练的线性模型,还是训练为复杂的非线性模型以抵御对抗样本的干扰。长远来看,设计更多训练非线性模型的更强大的优化方法可以避免这种问题。

相关工作

Szegedy 等人在论文 Intriguing properties of neural networks 中展示了神经网络的一些有趣的性质,本文涉及的有:

  • Box-constrained L-BFGS 可以有效的找出对抗性样本
  • 在一些数据集中,对抗性样本和原样本非常相似,人眼难以找出差别
  • 在很多情况下,同一个对抗样本可以让使用不同架构,在不同训练集下训练的不同模型做出误判
  • 浅层的 softmax 回归模型也具有对抗样本易损性
  • 使用对抗性样本进行训练可以使模型正则化,但是这种方法需要在内循环中进行约束性优化,时间成本非常高昂,在实践中难以实现。

这些性质就表明即使是在测试集上表现优异的分类模型,实际上也并没有学习到真正决定正确类别的内在概念。恰恰相反,这些算法就像一个 Potemkin village,在自然发生的数据中表现良好,但是当出现概率非常低的数据的时候,就会产生虚假的输出。这点尤其让人感到失望,因为计算机视觉的主流方法就是使用CNN的特征空间上用欧氏距离近似感知距离,但是如果感知距离非常小的图像对应于网络表征中的完全不同的类,那么这种相似性显然是有缺陷的。但是,这种缺陷在某种程度上也正好是用来修复这个问题的方式。

对抗样本的线性解释

因为样本输入特征(input feature)的精度(precision)是有限的,比如一般图像的每个像素是8 bits, 那么样本中所有低于 1 / 255 1/255 1/255 的信息都会被丢弃,所以当样本 x x x 中每个元素值添加的扰动值 η \\eta η 小于样本输入特征精度时,分类器无法将样本 x x x 和对抗样本 x ~ = x + η \\tilde\\boldsymbolx=\\boldsymbolx+\\boldsymbol\\eta x~=x+η 区分开。因此,对一个区分良好的类别而言,如果 ϵ \\epsilon ϵ 是一个足够小以至于被舍弃掉的值,那么只要 ∥ η ∥ ∞ < ϵ \\|\\eta\\|_\\infty<\\epsilon η<ϵ,分类器就会将 x x x x ~ \\tildex x~ 分为同一个类。

思考一下权重向量 w w w 和对抗样本 x ~ \\tildex x~ 的点积(dot product):
w ⊤ x ~ = w ⊤ ( x + η ) = w ⊤ x + w ⊤ η w^\\top \\tildex=w^\\top(x+\\eta)=w^\\top x+w^\\top \\eta wx~=w(x+η)=wx+wη
对抗性干扰导致 activation 增加了 w ⊤ η w^\\top \\eta wη,本文指出可以使用最大范数约束(maxnorm constraint)将 η \\eta η 赋值为 η = sign ⁡ ( w ) \\eta=\\operatornamesign(\\boldsymbolw) η=sign(w) 从而使 w ⊤ η \\boldsymbolw^\\top \\boldsymbol\\eta wη 最大化。如果 w w w n n n 维且元素均值为 m m m,那么 activation 将增加 ϵ m n \\epsilon mn ϵmn,虽然 ∥ η ∥ ∞ \\|\\eta\\|_\\infty η 不会随着维度改变,但是由 η \\eta η 导致的 activation 的增加量 ϵ m n \\epsilon mn ϵmn 会随着维度 n n n 线性增长。那么对于一个高维度的问题,一个样本中大量维度的无限小的干扰加在一起就可以对输出造成很大的变化。这说明如果具有足够高的维度,即使是一个简单的线性模型也具有对抗样本易损性。

非线性模型的线性扰动

我们认为神经网络过于线性以至于不能抵抗对抗样本的干扰,而这种观点引出了一种生成对抗样本的快速方法,即 Fast Gradient Sign Method (FGSM) 方法。

θ \\theta θ 作为模型的参数, x x x 作为模型的输入, y y y 是模型对应的 label 值, J ( θ , x , y ) J(\\theta,x,y) J(θ,x,y) 是训练神经网络的损失函数,对某个特定的模型参数 θ \\theta θ 而言,FGSM方法将损失函数近似线性化,从而获得保证无穷范数限制的最优的扰动 ∥ η ∥ ∞ < ϵ \\|\\eta\\|_\\infty<\\epsilon η<ϵ,可以使用反向传播有效地计算所需的梯度。扰动值具体为:
η = ϵ sign ⁡ ( ∇ x J ( θ , x , y ) ) \\boldsymbol\\eta=\\epsilon \\operatornamesign\\left(\\nabla_\\boldsymbolx J(\\boldsymbol\\theta, \\boldsymbolx, y)\\right) η=ϵsign(xJ(θ,x,y))
实验表明,FGSM 这种简单的算法确实可以产生误分类的对抗样本,从而证明了作者假设的对抗样本的产生原因是由于模型的线性特性。同时,这种算法也可作为一种加速对抗训练的方法。

线性模型与权重衰减的对抗训练

通过对最简单的逻辑回归(logistic regression)模型上应用 FGSM 方法,理解如何在简单的设置中生成对抗样本。

如果我们训练了一个单一模型来对 P ( y = 1 ) = σ ( w ⊤ x + b ) P(y=1)=\\sigma\\left(\\boldsymbolw^\\top \\boldsymbolx+b\\right) P(y=1)=σ(wx+b) 区分标签 y ∈ − 1 , 1 y \\in\\-1,1\\ y1,1,其中 σ ( z ) \\sigma(z) σ(z) 是 logistic sigmoid 函数 σ ( z ) = 1 1 + e − z \\sigma(z)=\\frac11+e^-z σ(z)=1+ez1,使用梯度下降训练的损失函数为:
E x , y ∼ p  data  ζ ( − y ( w ⊤ x + b ) ) \\mathbbE_\\boldsymbolx, y \\sim p_\\text data \\zeta\\left(-y\\left(\\boldsymbolw^\\top \\boldsymbolx+b\\right)\\right) Ex,yp data ζ(y(wx+b))
其中 ζ ( z ) \\zeta(z) ζ(z) 为 softplus 函数 ζ ( z ) = l o g ( 1 + e z ) \\zeta(z)=log(1+e^z) ζ(z)=log(1+ez)

对该模型使用 FGSM 方法,扰动量 η \\eta η 为:
KaTeX parse error: \\cr valid only within a tabular/array environment
并且:
w ⊤ sign ⁡ ( w ) = ∥ w ∥ 1 \\boldsymbolw^\\top \\operatornamesign(\\boldsymbolw)=\\|\\boldsymbolw\\|_1 wsign(w)=w1
因此逻辑回归模型的对抗形式为最小化下列损失函数:
E x , y ∼ p data ζ ( − y ( w ⊤ x ~ + b ) ) = ⏟ x ~ = x + η , η = ϵ − sign ⁡ ( w ) E x , y ∼ p  data  ζ ( y ( ϵ ∣ ∣ w ∣ ∣ 1 − w ⊤ x − b ) ) E_x, y \\sim p_\\text data \\zeta\\left(-y\\left(w^\\top \\tildex+b\\right)\\right) \\underbrace=_\\tildex=x+\\eta, \\eta=\\epsilon-\\operatornamesign(w) E_x, y \\sim p_\\text data \\zeta\\left(y\\left(\\epsilon| | w| |_1-w^\\top x-b\\right)\\right) Ex,ypdataζ(y(wx~+b))x~=x+η,η=ϵsign(w) =Ex,yp data ζ(y(ϵ图像对抗算法-攻击篇(I-FGSM)

图像对抗算法-攻击篇(FGSM)

[Paper Review]EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES,2015

SQL调优指南笔记6:Explaining and Displaying Execution Plans

SQL调优指南笔记6:Explaining and Displaying Execution Plans

A Unified Deep Model of Learning from both Data and Queries for Cardinality Estimation 论文解读(SIGMOD 2