FGSM(Fast Gradient Sign Method)生成對抗樣本


https://blog.csdn.net/u014038273/article/details/78773515

https://blog.csdn.net/qq_35414569/article/details/80770121

對抗樣本

通過對原始圖片添加噪聲來使得網絡對生成的圖片X’進行誤分類,需要注意的是,生成圖片X’和原始圖片X很像,人的肉眼無法進行辨別,生成的圖片X’即為對抗樣本。

1)定向對抗樣本 
注意是對X’(n-1)求偏導,並非X,而且注意loss函數J中的參數是X’和Y’,而不是X和Y。這個是定向對抗樣本生成的過程,f(x)是針對噪聲的裁剪過程。

X’(n)=X+ε*f(sign(∇X’J(θ,X’(n-1),Y’)))

2)不定向對抗樣本
針對不定向對抗樣本的生成過程,則直接對x和y求偏導數即可。

X’=X+ε*sign(∇X’J(θ,X,Y))

FGSM

產生噪聲η有很多種的方法,這里我們采用的是Fast Gradient Sign Method,即通過在梯度方向上進行添加增量來誘導網絡對生成的圖片X’進行誤分類,我們可以通過指定我們期待的分類使得網絡針對任何輸入圖片均產生指定分類的對抗樣本,同時也可以不指定期待的分類,只需要使得生成的圖片被網絡識別為與正確分類不同的分類即可。

針對指定預期分類的對抗樣本生成來說,我們需要更改它的loss損失函數,交叉熵損失函數變為:

loss = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y_logits, labels=[pl_cls_target]),通過計算網絡對於參數的梯度進行噪聲的生成即對抗樣本的生成。

  在2014年提出了神經網絡可以很容易被輕微的擾動的樣本所欺騙之后,又對產生對抗樣本的原因進行了分析,Goodfellow等人認為高維空間下的線性行為足以產生對抗樣本。

對抗樣本的線性解釋

  常見的數據圖像大部分表示成1-255,8bit/像素點的形式,所以能夠表示樣本的精度十分有限,由於這種有限的表達能力,可能在原始樣本上加小小的擾動就被誤分類。現在我們有: 

原始圖像:x
擾動:η
對抗樣本:

當存在一個小到可忽略的ε滿足,我們期望分類器對這兩個樣本的分類結果一致,然而…… 

現在考慮加入權值向量ω信息,則:

對抗擾動通過ωTη影響激活函數從而影響分類結果。如果ω有n個維度,權向量的一個元素的平均大小是m,那么激活函數就會增加εmn。雖然∥η∥∞不會隨着維度增加而增加,但是η會隨n線性增長,然后就有高維問題了。

非線性模型的線性擾動

  我們假設神經網絡都太線性了以至於不能抵抗對抗樣本。常見的LSTM、ReLU和maxout網絡都趨向於線性表現,而類似sigmod這種非線性性模型也把大量的時間花在非飽和和線性系統中。

我們從公式開始理解(fast gradient sign method):

模型參數:θ
模型輸入,即圖像:x
結果標簽:y
損失函數:J(θ,x,y)
符號函數:sign()
我們可以線性化代價函數的當前值θ,獲得最優max-norm η 

 

算法的主要思想:讓我們的變化量與梯度的變化方向完全一致,那么我們的誤差函數就會增大,那么將會對分類結果產生最大化的變化。

sign函數保證了變化方法同梯度方向一致。對損失函數求偏導,即得到權值向量ω有關的函數。

 

首先明確,橫坐標表示單維x輸入值,縱坐標表示損失值,函數圖像是損失函數J,損失值越大表示越大概率分類錯誤,假設灰的線上方為分類錯誤,下方為分類正確。

以樣本點x1為例。根據公式,此時的偏導函數為負,則黑色箭頭方向為擾動方向,同理x2樣本在取值為正時,也沿着黑色箭頭方向變化,只要我們的 ε取值合適,就能生成對抗樣本,使得分類錯誤。

線性模型與權值衰減的對抗性訓練

如果我們可以考慮的最簡單的模型是邏輯回歸。在這種情況下,FGSM是准確的。

代碼

代碼實現主要參考鏈接:Python3環境下cleverhans對抗樣本防護編譯與測試(含FGSM攻擊與ADV防護),但是原博客沒有直接給出可運行的代碼,所以自己基於基礎代碼改了一下,在博客最后附下載鏈接。 

工程如下:

fgsm.py 可直接運行主程序,實現FGSM算法生成對抗樣本,也能實現防御
eval_on_adversarisl.py 實現防御訓練模型
checkpoint 兩個防御模型
input 原始輸入圖像
output 對抗樣本
通過修改checkpoint_path來實現調用不同模型:

inception_v3.ckpt 是原始經典模型
adv_inception_v3.ckpt 是Step L.L.防御訓練后的模型
ens4_adv_inception_v3.ckpt 是集成四個模型Step L.L.防御訓練后的模型
結果展示函數:
classify() 展示預測結果最高的類別
show_classify() 展示圖像以及預測結果最高的前十個結果,如下圖:


代碼主要調用cleverhans集成庫,里頭還有許多現成的攻擊算法可以調用。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM