引言

在对抗样本综述(二)中,我们知道了几种著名的对抗攻击和对抗防御的方法。下面具体来看下几种对抗攻击是如何工作的。这篇文章介绍FGSM(Fast Gradient Sign Method)。

预备知识

符号函数sign

泰勒展开

当函数\(f(x)\)在点\(x_0\)处可导时,在点\(x_0\)的邻域\(U(x_0)\)内恒有:

\[f(x)=f(x_0)+f'(x_0)*(x-x_0)+o(x-x_0)
\]

因为\(o(x-x_0)\)是一个无穷小量,故有:

\[f(x)≈f(x_0)+f'(x_0)*(x-x_0)
\]

这是在对函数进行局部线性化处理时常用的公式之一。从几何上看,它是用切线近似代替曲线。这样的近似是比较粗糙的,而且只在点的附近才有近似意义。

梯度

梯度是偏导数组成的向量。若有函数\(f(x^{(1)},x^{(2)},x^{(3)})\),则\(f\)在点\(θ_0=[x_0^{(1)},x_0^{(2)},x_0^{(3)}]^T\)处的梯度为:

\[\nabla f_{θ_0}=[\frac{\partial f_{θ_0}}{\partial x^{(1)}}, \frac{\partial f_{θ_0}}{\partial x^{(2)}}, \frac{\partial f_{θ_0}}{\partial x^{(3)}}]^T
\]

一元函数的导数表示函数增加最快的方向,那么梯度表示多元函数值增加最快的方向。

FGSM公式

\[\textbf{x}_{adv}=\textbf{x}+ϵ∗sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))
\]

ϵ为hyperparameter,控制原图像和对抗样本之间的差异程度。(字母加粗表示向量)

在梯度下降法中,我们求损失函数关于权重w、偏移b(统称参数θ)的梯度,然后更新参数,即参数\(\textbf{θ}=\textbf{θ}-η*\nabla_θ J(\textbf{x},y,\textbf{θ})\),η为learning rate。

而在FGSM中,我们用加梯度方向的ϵ倍的方式更新输入。

注意两者的不同:梯度代表函数值增加最快的方向,更新参数时,我们要做的是使损失函数J减小(在输入确定的情况下),因此减去梯度;而获取对抗样本时,我们要做的是使损失函数J增大(在θ确定的情况下),因此增加梯度,但又要控制扰动的大小,因此只取梯度的方向,其大小统一控制为ϵ。

为什么FGSM中要让损失函数增加?因为J 越大,表明预测class概率向量和真实one-hot class向量的距离越大,更有可能使预测器输出错误的label。用数学来解释下,损失函数在输入x附近\(x_{adv}\)处的泰勒展开:

\[J(\textbf{x}_{adv},y,\textbf{θ})=J(\textbf{x},y,\textbf{θ})+\nabla_x J(\textbf{x},y,\textbf{θ})^T*ϵ*sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))
\]

\(ϵ*sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))\)即泰勒展开中的\((x-x_0)\)项。

在上式中,\(\nabla_x J(\textbf{x},y,\textbf{θ})^T*ϵ*sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))\)为非负数,则\(J(\textbf{x}_{adv},y,\textbf{θ})>=J(\textbf{x},y,\textbf{θ})\),说明我们达到了让损失函数增大的目的。

\(\nabla_x J(\textbf{x},y,\textbf{θ})^T*ϵ*sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))\)是非负数,因为:

\[\nabla_x J(\textbf{x},y,\textbf{θ})^T*ϵ*sign(∇_\textbf{x}J(\textbf{x},y,\textbf{θ}))=\nabla_x J(\textbf{x},y,\textbf{θ})^T*ϵ*( ∇_\textbf{x}J(\textbf{x},y,\textbf{θ})/\Vert∇_\textbf{x}J(\textbf{x},y,\textbf{θ})\Vert)
\]
\[=ϵ*\nabla_x J(\textbf{x},y,\textbf{θ})^T*∇_\textbf{x}J(\textbf{x},y,\textbf{θ})/\Vert∇_\textbf{x}J(\textbf{x},y,\textbf{θ})\Vert
\]
\[=ϵ*\Vert∇_\textbf{x}J(\textbf{x},y,\textbf{θ})\Vert^2/\Vert∇_\textbf{x}J(\textbf{x},y,\textbf{θ})\Vert
\]
\[=ϵ*\Vert∇_\textbf{x}J(\textbf{x},y,\textbf{θ})\Vert
\]
\[>=0
\]

FGSM代码

def fgsm(model, loss, eps, softmax=False):
"""
单次FGSM
model为目标模型
loss为传入的损失函数计算函数
eps为限定扰动大小
"""
def attack(img, label):
output = model(img)
if softmax:
error = loss(output, label)
else:
error = loss(output, label.unsqueeze(1).float())
error.backward() # 计算损失函数对输入x的梯度
# clamp()使perturbed_img的各分量在[0,1]区间
perturbed_img = torch.clamp(img + eps * img.grad.data.sign(), 0, 1).detach()
img.grad.zero_()
return perturbed_img return attack def ifgsm(model, loss, eps, iters=4, softmax=False):
# 多次FGSM
def attack(img, label):
perturbed_img = img
perturbed_img.requires_grad = True
for _ in range(iters):
output = model(perturbed_img)
if softmax:
error = loss(output, label)
else:
error = loss(output, label.unsqueeze(1).float())
error.backward()
temp = torch.clamp(perturbed_img + eps * perturbed_img.grad.data.sign(), 0, 1).detach()
perturbed_img = temp.data
perturbed_img.requires_grad = True
return perturbed_img.detach() return attack

参考文献

[1] Goodfellow I J , Shlens J , Szegedy C . Explaining and Harnessing Adversarial Examples[J]. Computer Science, 2014.

[2] 为什么函数的导数大于等于零或小于等于零就可以判断函数是增还是减? - Observer的回答 - 知乎 https://www.zhihu.com/question/377992767/answer/1104094160

对抗攻击(一) FGSM的更多相关文章

  1. SNN对抗攻击笔记

    SNN对抗攻击笔记: 1. 解决SNN对抗攻击中脉冲与梯度数据格式不兼容性以及梯度消失问题: G2S Converter.Gradient Trigger[1] 2. 基于梯度的对抗攻击方式: FGS ...

  2. KDD 2018 | 最佳论文:首个面向Facebook、arXiv网络图类的对抗攻击研究

    8 月 19 日至 23 日,数据挖掘顶会 KDD 2018 在英国伦敦举行,昨日大会公布了最佳论文等奖项.最佳论文来自慕尼黑工业大学的研究者,他们提出了针对图深度学习模型的对抗攻击方法,是首个在属性 ...

  3. 小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现

    小样本利器2.文本对抗+半监督 FGSM & VAT & FGM代码实现 上一章我们聊了聊通过一致性正则的半监督方案,使用大量的未标注样本来提升小样本模型的泛化能力.这一章我们结合FG ...

  4. QA 中的对抗攻击和防御

    攻击 supporting facts 的修改:字符调换,替换词(用空格embedding或近同义词,变形词等) 还有针对question的攻击. 梯度下降,在embediing上做攻击,如何deco ...

  5. 对抗样本攻防战,清华大学TSAIL团队再获CAAD攻防赛第一

    最近,在全球安全领域的殿堂级盛会 DEF CON 2018 上,GeekPwn 拉斯维加斯站举行了 CAAD CTF 邀请赛,六支由国内外顶级 AI 学者与研究院组成的队伍共同探讨以对抗训练为攻防手段 ...

  6. 深度学习攻防对抗(JCAI-19 阿里巴巴人工智能对抗算法竞赛)

    最近在参加IJCAI-19阿里巴巴人工智能对抗算法竞赛(点击了解),初赛刚刚结束,防御第23名,目标攻击和无目标攻击出了点小问题,成绩不太好都是50多名,由于找不到队友,只好一个人跟一群大佬PK,双拳 ...

  7. pytorch生成对抗示例

    pytorch生成对抗示例 本文对ML(机器学习)模型的安全漏洞的认识,并将深入了解对抗性机器学习的热门话题.图像添加难以察觉的扰动会导致模型性能大不相同.通过图像分类器上的示例探讨该主题.使用第一种 ...

  8. 生成对抗网络(Generative Adversarial Networks,GAN)初探

    1. 从纳什均衡(Nash equilibrium)说起 我们先来看看纳什均衡的经济学定义: 所谓纳什均衡,指的是参与人的这样一种策略组合,在该策略组合上,任何参与人单独改变策略都不会得到好处.换句话 ...

  9. NLP 对抗方法整理

    NLP中对抗应用 1. 分词 , 可以用GAN来做,消除不同分词器的差异性 2. 风格迁移, 这个在图像中应用较多,在NLP中同样可行 3. 提高问答系统/阅读理解的性能. 4. 机器翻译应该也可以做 ...

随机推荐

  1. python解析ua

    一个非常神奇的包可以帮助我们优雅的解析浏览器的UA,他的名字叫做user_agents pip install pyyaml ua-parser user-agents >>>ua_ ...

  2. Go语言设计模式之函数式选项模式

    Go语言设计模式之函数式选项模式 本文主要介绍了Go语言中函数式选项模式及该设计模式在实际编程中的应用. 为什么需要函数式选项模式? 最近看go-micro/options.go源码的时候,发现了一段 ...

  3. 【Azure Developer】使用 Python SDK连接Azure Storage Account, 计算Blob大小代码示例

    问题描述 在微软云环境中,使用python SDK连接存储账号(Storage Account)需要计算Blob大小?虽然Azure提供了一个专用工具Azure Storage Explorer可以统 ...

  4. 嵌入式Linux设备驱动程序:发现硬件配置

    嵌入式Linux设备驱动程序:发现硬件配置 Embedded Linux device drivers: Discovering the hardware configuration Interfac ...

  5. 十一、diff和patch打补丁

    diff制作补丁文件的原理:告诉我们怎么修改第一个文件后能得到第二个文件. diff命令常用选项: -u 输出统一内容的头部信息(打补丁使用),计算机知道是哪个文件需要修改    -r 递归对比目录中 ...

  6. 彻底搞懂彻底搞懂事件驱动模型 - Reactor

    在高性能网络技术中,大家应该经常会看到Reactor模型.并且很多开源软件中都使用了这个模型,如:Redis.Nginx.Memcache.Netty等. 刚开始接触时可能一头雾水,这到底是个什么东东 ...

  7. MySQL:聊一聊数据库中的那些锁

    在软件开发中,程序在高并发的情况下,为了保证一致性或者说安全性,我们通常都会通过加锁的方式来解决,在 MySQL 数据库中同样有这样的问题,一方面为了最大程度的利用数据库的并发访问,另一方面又需要保证 ...

  8. NOIP模拟测试13「矩阵游戏·跳房子·优美序列」

    矩阵游戏 考试时思路一度和正解一样,考试到最后还是打了80分思路,结果80分打炸了只得了40分暴力分 题解 算出来第一列的总值,每次通过加每两列之间的差值得出下一列的总值 算第一列我们只需要让当前点* ...

  9. 通过ffmpeg转换为mp4格式

    FFMPEG  -i  example.wmv -c:v libx264 -strict -2 output.mp4FFMPEG  -i  example.wmv -c:v libx264 -stri ...

  10. Kubernetes使用Keda进行弹性伸缩,更合理利用资源

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 Kubernetes自带的HPA是只支持CPU/MEM的,很多时候我们并不根据这两项指标来进行伸缩资源.比如消费 ...