攻擊AI模型之FGSM演算法
雷鋒網 AI 科技評論按:本文為「兜哥帶你學安全」系列之二,首發於AI科技評論,未經許可不得轉載。
概述
在前面文章《對抗樣本的基本原理》中,我們介紹了生成對抗樣本的基本思路,其中大體思路分為白盒攻擊和黑盒攻擊,區別在於黑盒測試把模型當做黑盒,只能輸入樣本獲得預測結果,白盒在黑盒的基礎上還可以獲取模型的參數、梯度等信息。本文將介紹白盒攻擊中鼎鼎大名的FGSM(Fast Gradient Sign Method)演算法。
FGSM基本原理
FGSM最早由Goodfellow在其論文《Explaining and Harnessing Adversarial Examples》中提出。以最常見的圖像識別為例,我們希望在原始圖片上做肉眼難以識別的修改,但是卻可以讓圖像識別模型產生誤判。假設圖片原始數據為x,圖片識別的結果為y,原始圖像上細微的變化肉眼難以識別,使用數學公式表示如下。
將修改後的圖像輸入分類模型中,x與參數矩陣相乘。
對分類結果的影響還要受到激活函數的作用,攻擊樣本的生成過程就是追求以微小的修改,通過激活函數的作用,對分類結果產生最大化的變化。Goodfellow指出,如果我們的變化量與梯度的變化方向完全一致,那麼將會對分類結果產生最大化的變化。
其中sign函數可以保證與梯度函數方向一致。
當x的維數為n時,模型的參數在每個維度的平均值為m,每個維度的微小修改與梯度函數方向一致,累計的效果為:
可見當原始數據的維度越大,攻擊的累計效果越明顯。以一個更加直觀的例子來說明FGSM的原理。假設具有2000個樣本,每個數據具有1000維,每維的數據的數值的大小都在0-1之間隨機生成,分類標籤只有2種。
#特徵數
n_features=1000
x,y=datasets.make_classification(n_samples=2000,
n_features=n_features,n_classes=2,random_state=random_state)
#標準化到0-1之間
x= MinMaxScaler().fit_transform(x)
分類模型是一個非常簡單的多層感知機,輸入層大小為1000,輸出層為1,激活函數為sigmoid。
model = Sequential()
model.add(Dense(1,activation="sigmoid",
input_shape=(n_features,) ) )
sigmoid函數是非常經典的激活函數,取值範圍為0-1,特別適合表示概率分布。
損失函數使用最簡單的mse,優化方式使用adam,考核的指標為準確度accuracy。
model.compile(loss="mse",
optimizer="adam",
metrics=["accuracy"])
model.summary()
完整的模型結果如下。
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 1) 1001
=================================================================
Total params: 1,001
Trainable params: 1,001
Non-trainable params: 0
_________________________________________________________________
批處理大小為16,經過20輪訓練。
model.fit(x,y,epochs=20,batch_size=16)
最終訓練結果,損失值穩定在0.17-0.18之間,準確度為80.85%。
Epoch 18/20
2000/2000 [==============================] - 0s 86us/step - loss: 0.1796 - acc: 0.7690
Epoch 19/20
2000/2000 [==============================] - 0s 86us/step - loss: 0.1711 - acc: 0.8470
Epoch 20/20
2000/2000 [==============================] - 0s 87us/step - loss: 0.1718 - acc: 0.8085
由於數據是隨機生成的,我們取0號舉例,
#獲取第0號元素
x0=x[0]
y0=y[0]
x0 = np.expand_dims(x0, axis=0)
y0_predict = model.predict(x0)
0號數據的標籤為0,內容截取如下,預測的值為0.296199。
獲取x0對應的梯度。
e = 0.1
cost, gradients = grab_cost_and_gradients_from_model([x0, 0])
n = np.sign(gradients)
x0 += n * e
當e取0.1時,FGSM計算的最終偏移值絕對值為0.1,即在每個維度增加或者減少0.1,具體值截取如下。
[[-0.1 -0.1 -0.1 0.1 -0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 0.1 -0.1
-0.1 -0.1 0.1 -0.1 -0.1 -0.1 0.1 -0.1 -0.1 0.1 -0.1 0.1 0.1 0.1
-0.1 -0.1 0.1 -0.1 -0.1 -0.1 0.1 -0.1 0.1 0.1 0.1 -0.1 0.1 0.1
-0.1 -0.1 -0.1 0.1 0.1 0.1 -0.1 -0.1 0.1 0.1 0.1 0.1 0.1 -0.1
疊加完得到新的x0值,由於修改量較小,可以認為對原始數據修改不大,但是預測值達到了0.984356,可以認為標籤從0變成了1。
攻擊圖像識別模型
以攻擊InceptionV3模型為例,介紹生成攻擊樣本的基本原理。Keras內置了這個模型,我們直接使用就可以了。從模型中直接獲取第一層的輸入作為輸入層,最後一層的輸出為輸出層。
model = inception_v3.InceptionV3()
model_input_layer = model.layers[0].input
model_output_layer = model.layers[-1].output
然後載入我們攻擊的圖片,比如我們的小豬。這裡需要特彆強調的是,NumPy出於性能考慮,默認的變數賦值會引用同樣一份內存,所以我們需要使用np.copy手工強制複製一份圖像數據。
img = image.load_img("../picture/pig.jpg", target_size=(299, 299))
original_image = image.img_to_array(img)
hacked_image = np.copy(original_image)
為了避免圖像變化過大,超過肉眼可以接受的程度,我們需要定義閾值。
max_change_above = original_image + 0.01
max_change_below = original_image - 0.01
下面我們要定義最關鍵的三個函數了,我們定義損失函數為識別為烤麵包機的概率,因此我們需要使用梯度上升演算法,不斷追求損失函數的最大化,變數objecttypeto_fake定義的就是烤麵包機對應的標籤,在InceptionV3中麵包機的標籤為859。
object_type_to_fake = 859
有了損失函數以後,我們就可以通過Keras的介面獲取到對應的梯度函數。最後通過K.function獲取一個Keras函數實例,該函數的輸入列表分別為輸入層和當前是訓練模式還是測試模式的標記learning_phase(),輸出列表是損失函數和梯度。關於K.function的使用建議閱讀Keras的在線文檔。
cost_function = model_output_layer[0, object_type_to_fake]
gradient_function = K.gradients(cost_function, model_input_layer)[0]
grab_cost_and_gradients_from_model =
K.function([model_input_layer,K.learning_phase()],
[cost_function, gradient_function] )
除了迭代環節,FGSM與基於梯度上升的演算法完全相同。在迭代環節,我們通過NumPy的sign函數對梯度進行處理,然後迭代更新圖片內容。
e=0.007
while cost
cost, gradients = grab_cost_and_gradients_from_model([hacked_image, 0])
n=np.sign(gradients)
hacked_image +=n*e
hacked_image = np.clip(hacked_image, max_change_below, max_change_above)
hacked_image = np.clip(hacked_image, -1.0, 1.0)
print("batch:{} Cost: {:.8}%".format(index,cost * 100))
index+=1
在我的Mac本經過2分鐘16次迭代訓練,獲得了新的家豬圖像,但是機器學習模型識別它為烤麵包機的概率卻達到了74.31%,迭代次數明顯減少。
batch:11 Cost: 2.7044188%
batch:12 Cost: 16.616838%
batch:13 Cost: 38.806009%
batch:14 Cost: 52.693129%
batch:15 Cost: 38.372087%
batch:16 Cost: 74.312818%
基於FGSM演算法被識別為烤麵包機的家豬(概率為74.31%)的圖片效果如下。
由於我們設置的退出條件是概率大於60%,所以FGSM沒有繼續迭代下去,我們通過設置閾值可以得到概率更大的圖片,在進一步的實驗中我們通過37次迭代得到了概率為99.56%的攻擊圖片。
batch:34 Cost: 97.030985%
batch:35 Cost: 90.346575%
batch:36 Cost: 63.920081%
batch:37 Cost: 99.558592%
基於FGSM演算法被識別為烤麵包機的家豬(概率為99.56%)的圖片效果如下。
Ian Goodfellow在他的論文《Adversarial examples in the physical world》中指出,針對圖像的攻擊方式在現實生活中也可以發生,攻擊圖片經過拍照列印後依然可以欺騙圖像分類模型,系統錯把「洗衣機」標籤為「保險箱」。
參考文獻
Ian J. Goodfellow, Jonathon Shlens & Christian Szegedy,Explaining and Harnessing Adversarial Examples,arXiv:1412.6572
Alexey Kurakin, Ian Goodfellow, Samy Bengio,Adversarial examples in the physical world,arXiv:1607.02533
https://baike.baidu.com/item/sign/115763
劉焱,《web安全之強化學習與GAN》,機械工業出版社
※柳傳志發內部信回應5G事件、英特爾50億美元擴建以色列工廠、扎克伯格出席歐洲議會作證|雷鋒早報
※ZipperDown漏洞來了!微博、陌陌、快手等常用 iOS 應用恐要中招
TAG:雷鋒網 |