HTML 的英文全称是Hyper Text Markup Language,直译为超文本标记语言。它是全球广域网上描述网页内容和外观的标准。HTML 包含了一对打开和关闭的标记,在当中包含有属性和值。标记描述了每个在网页上的组件,例如文本段落、表格或图像等。
事实上,HTML 是一种因特网上较常见的网页制作标注性语言,而并不能算做一种程序设计语言,因为它缺少程序设计语言所应有的特征。HTML 通过IE 等浏览器的翻译,将网页中所要呈现的内容、排版展现在用户眼前。
文件:/f/25127180-502616755-9fca9a(访问密码:551685)
以下内容无关:
-------------------------------------------分割线---------------------------------------------
引言
在深度学习领域内的对抗样本综述(二)中,我们知道了几种著名的对抗攻击和对抗防御的方法。下面具体来看下几种对抗攻击是如何工作的。这篇文章介绍FGSM(Fast Gradient Sign Method)。
预备知识
符号函数sign
泰勒展开
当函数f(x)在点x0处可导时,在点x0的邻域U(x0)内恒有:
f(x)=f(x0)+f′(x0)∗(x−x0)+o(x−x0)
因为o(x−x0)是一个无穷小量,故有:
f(x)≈f(x0)+f′(x0)∗(x−x0)
这是在对函数进行局部线性化处理时常用的公式之一。从几何上看,它是用切线近似代替曲线。这样的近似是比较粗糙的,而且只在点的附近才有近似意义。
梯度
梯度是偏导数组成的向量。若有函数f(x(1),x(2),x(3)),则f在点θ0=[x(1)0,x(2)0,x(3)0]T处的梯度为:
∇fθ0=[∂fθ0∂x(1),∂fθ0∂x(2),∂fθ0∂x(3)]T
一元函数的导数表示函数增加最快的方向,那么梯度表示多元函数值增加最快的方向。
FGSM公式
xadv=x+ϵ∗sign(∇xJ(x,y,θ))
ϵ为hyperparameter,控制原图像和对抗样本之间的差异程度。(字母加粗表示向量)
在梯度下降法中,我们求损失函数关于权重w、偏移b(统称参数θ)的梯度,然后更新参数,即参数θ=θ−η∗∇θJ(x,y,θ),η为learning rate。
而在FGSM中,我们用加梯度方向的ϵ倍的方式更新输入。
注意两者的不同:梯度代表函数值增加最快的方向,更新参数时,我们要做的是使损失函数J减小(在输入确定的情况下),因此减去梯度;而获取对抗样本时,我们要做的是使损失函数J增大(在θ确定的情况下),因此增加梯度,但又要控制扰动的大小,因此只取梯度的方向,其大小统一控制为ϵ。
为什么FGSM中要让损失函数增加?因为J 越大,表明预测class概率向量和真实one-hot class向量的距离越大,更有可能使预测器输出错误的label。用数学来解释下,损失函数在输入x附近xadv处的泰勒展开:
J(xadv,y,θ)≈J(x,y,θ)+∇xJ(x,y,θ)T∗ϵ∗sign(∇xJ(x,y,θ))
ϵ∗sign(∇xJ(x,y,θ))即泰勒展开中的(x−x0)项。
在上式中,∇xJ(x,y,θ)T∗ϵ∗sign(∇xJ(x,y,θ))为非负数,则J(xadv,y,θ)>=J(x,y,θ),说明我们达到了让损失函数增大的目的。
∇xJ(x,y,θ)T∗ϵ∗sign(∇xJ(x,y,θ))是非负数,因为:
∇xJ(x,y,θ)T∗ϵ∗sign(∇xJ(x,y,θ))=∇xJ(x,y,θ)T∗ϵ∗(∇xJ(x,y,θ)/∥∇xJ(x,y,θ)∥)
=ϵ∗∇xJ(x,y,θ)T∗∇xJ(x,y,θ)/∥∇xJ(x,y,θ)∥
=ϵ∗∥∇xJ(x,y,θ)∥2/∥∇xJ(x,y,θ)∥
=ϵ∗∥∇xJ(x,y,θ)∥
=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