網(wǎng)站開發(fā)有哪些要求咖啡seo是什么意思
FGSM
傳送門
FGSM 利用了梯度上升的思想,通過損失函數(shù)相對(duì)于輸入圖像的梯度來(lái)找到 最容易 迷惑網(wǎng)絡(luò)的方向,并沿著這個(gè)方向?qū)D像進(jìn)行微小的擾動(dòng)。
FGSM 的基本想法是,沿著這個(gè)梯度的符號(hào)方向?qū)D像進(jìn)行微調(diào),以最大化損失函數(shù)。具體公式為:
FGSM攻擊算法代碼:
# 定義 FGSM 攻擊函數(shù)
def fgsm_attack(image, epsilon, data_grad):# 生成擾動(dòng)方向sign_data_grad = data_grad.sign()# 生成對(duì)抗樣本perturbed_image = image + epsilon * sign_data_grad# 對(duì)抗樣本像素值范圍約束在 [0,1]perturbed_image = torch.clamp(perturbed_image, 0, 1)return perturbed_image
PGD:
傳送門
PGD算法在論文 《Towards Deep Learning Models Resistant to Adversarial Attacks 》中提出,它既是產(chǎn)生對(duì)抗樣本的攻擊算法,也是對(duì)抗訓(xùn)練的防御算法。
除此之外,PGD算法也是一階中的最強(qiáng)攻擊(一階是指利用一階導(dǎo)數(shù))
設(shè)想目標(biāo)模型如果是一個(gè)線性模型,損失函數(shù)對(duì)輸入的導(dǎo)數(shù)一定是一個(gè)固定值,一次迭代和多次迭代時(shí)擾動(dòng)的方向都不會(huì)發(fā)生改變,但是,如果目標(biāo)模型為非線性,每次迭代之間的方向都有可能會(huì)發(fā)生變化,這時(shí)FGSM的單次迭代效果肯定不如PGD的效果好。FGSM算法通過一步計(jì)算,可能達(dá)不到最優(yōu)效果,而PGD算法則是每次走一小步,但是多走幾次,如果超過了擾動(dòng)半徑為ε的空間,就重新映射回來(lái)。
下面來(lái)看一下PGD算法的公式:
這里主要看一下公式最前面的投影到x+S的意思:就是通過一系列操作得到對(duì)抗樣本后,將對(duì)抗樣本減去原始圖像得到了擾動(dòng)值,然后將擾動(dòng)值限制在-ε到+ε之間,得到了新的擾動(dòng)值,原始圖像加上新的擾動(dòng)值就是最終生成的對(duì)抗樣本。
關(guān)于對(duì)式子中sgn(L(θ,x,y)’)的理解可從FGSM中獲取:
在FGSM中引入符號(hào)函數(shù)可以確定對(duì)抗擾動(dòng)的方向。Goodfellow指出,如果我們的變化量與梯度的變化方向完全一致,那么將對(duì)分類結(jié)果產(chǎn)生較大的變化。因此,在FGSM中不需要關(guān)心具體的梯度大小,只需要知道方向即可。
符號(hào)函數(shù)sign:
PGD的核心代碼:
# PGD攻擊方式,屬于FGSM攻擊的變體
def PGD_attack(model, image, label, epsilon=0.8, alpha=0.1, iters=40):image = image.to(device)label = label.to(device)loss = nn.CrossEntropyLoss()ori_image = image.datafor i in range(iters): # 每次走一小步,但是多走幾次image.requires_grad = Trueoutput = model(image)model.zero_grad()cost = loss(output, label).to(device)cost.backward()# 對(duì)抗樣本 = 原始圖像 + 擾動(dòng)adv_image = image + alpha * image.grad.sign()# 限制擾動(dòng)范圍eta = torch.clamp(adv_image - ori_image, min=-epsilon, max=epsilon)# 進(jìn)行下一輪的對(duì)抗樣本生成image = torch.clamp(ori_image + eta, min=0, max=1).detach()return image