丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
人工智能 正文
發(fā)私信給兜哥帶你學(xué)安全
發(fā)送

0

對抗樣本的基本原理

本文作者: 兜哥帶你學(xué)安全 編輯:郭奕欣 2018-06-01 17:20
導(dǎo)語:對抗樣本是機器學(xué)習(xí)模型的一個有趣現(xiàn)象,攻擊者通過在源數(shù)據(jù)上增加人類難以通過感官辨識到的細微改變,但是卻可以讓機器學(xué)習(xí)模型接受并做出錯誤的分類決定。

雷鋒網(wǎng)AI科技評論按:本文首發(fā)于“兜哥帶你學(xué)安全”微信公眾號。

概述

對抗樣本是機器學(xué)習(xí)模型的一個有趣現(xiàn)象,攻擊者通過在源數(shù)據(jù)上增加人類難以通過感官辨識到的細微改變,但是卻可以讓機器學(xué)習(xí)模型接受并做出錯誤的分類決定。一個典型的場景就是圖像分類模型的對抗樣本,通過在圖片上疊加精心構(gòu)造的變化量,在肉眼難以察覺的情況下,讓分類模型產(chǎn)生誤判。

對抗樣本的基本原理

在原理上介紹對抗樣本,以經(jīng)典的二分類問題為例,機器學(xué)習(xí)模型通過在樣本上訓(xùn)練,學(xué)習(xí)出一個分割平面,在分割平面的一側(cè)的點都被識別為類別一,在分割平面的另外一側(cè)的點都被識別為類別二。

對抗樣本的基本原理

生成攻擊樣本時,我們通過某種算法,針對指定的樣本計算出一個變化量,該樣本經(jīng)過修改后,從人類的感覺無法辨識,但是卻可以讓該樣本跨越分割平面,導(dǎo)致機器學(xué)習(xí)模型的判定結(jié)果改變。

對抗樣本的基本原理

如何高效的生成對抗樣本,且讓人類感官難以察覺,正是對抗樣本生成算法研究領(lǐng)域的熱點。

梯度算法和損失函數(shù)

對抗樣本其實對機器學(xué)習(xí)模型都有效,不過研究的重點還是在神經(jīng)網(wǎng)絡(luò)尤其是深度學(xué)習(xí)網(wǎng)絡(luò)領(lǐng)域。理解對抗樣本算法,需要一定的神經(jīng)網(wǎng)絡(luò)的知識。在深度學(xué)習(xí)模型里面,經(jīng)常需要使用梯度算法,針對損失函數(shù)的反饋不斷調(diào)整各層的參數(shù),使得損失函數(shù)最小化。損失函數(shù)可以理解為理想和現(xiàn)實之間的差距,通常定義一個函數(shù)來描述真實值和預(yù)測值之間的差異,在訓(xùn)練階段,真實值就是樣本對應(yīng)的真實標(biāo)簽和預(yù)測值就是機器學(xué)習(xí)模型預(yù)測的標(biāo)簽值,這些都是明確的,所以損失函數(shù)是可以定義和計算的。在分類問題中,常見的損失函數(shù)包括binary_crossentropy和categorical_crossentropy。

  • binary_crossentropy

binary_crossentropy亦稱作對數(shù)損失,

  • categorical_crossentropy

categorical_crossentropy亦稱作多類的對數(shù)損失

機器學(xué)習(xí)模型訓(xùn)練的過程就是不斷調(diào)整參數(shù)追求損失函數(shù)最小的過程。梯度可以理解為多元函數(shù)的指定點上升的坡度。梯度可以用偏導(dǎo)數(shù)來定義,通常損失函數(shù)就是這個多元函數(shù),特征向量就可以看成這個多元函數(shù)的某個點。在訓(xùn)練過程中,針對參數(shù)的調(diào)整可以使用梯度和學(xué)習(xí)率來定義,其中學(xué)習(xí)率也叫做學(xué)習(xí)步長,物理含義就是變量在梯度方向上移動的長度,學(xué)習(xí)率是一個非常重要的參數(shù),過大會導(dǎo)致?lián)p失函數(shù)的震蕩難以收斂,過小會導(dǎo)致計算緩慢,目前還沒有很成熟的理論來推導(dǎo)最合適的學(xué)習(xí)率,經(jīng)驗值是0.001-0.1之間,迭代更新參數(shù)x的方法為:

xk+1=xk+??grad(x)

當(dāng)我們求函數(shù)的最大值時,我們會向梯度向上的方向移動,所以使用加號,也成為梯度向上算法。如果我們想求函數(shù)的最小值時,則需要向梯度向下的方向移動,也成為梯度下降算法。所以使用減號,比如求損失函數(shù)最小值是,對應(yīng)迭代求解的方法為:

xk+1=xk???grad(x)

我們通過一個非常簡單的例子演示這個過程,假設(shè)我們只有一個變量x,對應(yīng)的損失函數(shù)定義為:

f(x)=x2+2

根據(jù)梯度的定義,可以獲得對應(yīng)的梯度為:

grad(x)=?f(x)/?(x)=2x

我們隨機初始化x,學(xué)習(xí)率設(shè)置為0.1,整個過程如下:

def demo():
   import random
   a=0.1
   x=random.randint(1,10)
   y = x * x + 2
   index=1
   while index < 100 and abs(y-2) > 0.01 :
       y=x*x+2
       print "batch={} x={} y={}".format(index,x,y)
       x=x-2*x*a
       index+=1

整個迭代過程最多100步,由于我們預(yù)先知道函數(shù)的最小值為2,所以如果當(dāng)計算獲得的函數(shù)值非常接近2,我們也可以提前退出迭代過程,比如絕對值相差不超過0.01。最后果然沒讓我們失望,在迭代20次后就找到了接近理論上的最小點。

batch=14 x=0.329853488333 y=2.10880332377
batch=15 x=0.263882790666 y=2.06963412721
batch=16 x=0.211106232533 y=2.04456584141
batch=17 x=0.168884986026 y=2.02852213851
batch=18 x=0.135107988821 y=2.01825416864
batch=19 x=0.108086391057 y=2.01168266793
batch=20 x=0.0864691128455 y=2.00747690748

Keras里面提供相應(yīng)的工具返回loss函數(shù)關(guān)于variables的梯度,variables為張量變量的列表,這里的loss函數(shù)即損失函數(shù)。

from keras import backend as K
k.gradients(loss, variables)

Keras也提供了function用于實例化一個Keras函數(shù),inputs是輸入列表列表,其元素為占位符或張量變量,outputs為輸出張量的列表

k.function(inputs, outputs, updates=[])

在進行神經(jīng)網(wǎng)絡(luò)訓(xùn)練時,追求的是損失函數(shù)最小,因此每輪訓(xùn)練時,通過訓(xùn)練集數(shù)據(jù)與模型的參數(shù)進行矩陣計算,獲得預(yù)測值,這一過程成為正向傳遞。然后通過計算預(yù)測值與目標(biāo)值的損失函數(shù),通過鏈式法則,計算出梯度值,然后根據(jù)梯度下降算法調(diào)整模型的參數(shù)值,這一過程成為反向傳遞。經(jīng)過若干輪訓(xùn)練后,損失函數(shù)下降到可以接受的程度,模型的參數(shù)也完成了調(diào)整,整個訓(xùn)練過程結(jié)束。

攻擊InceptionV3模型

一般的卷積層只是一味增加卷積層的深度,但是在單層上卷積核卻只有一種,這樣特征提取的功能可能就比較弱。Google增加單層卷積層的寬度,即在單層卷積層上使用不同尺度的卷積核,他們構(gòu)建了Inception這個基本單元,基本的Inception中有1x1卷積核,3x3卷積核,5x5卷積核還有一個3x3下采樣,從而產(chǎn)生了InceptionV1模型。InceptionV3的改進是使用了2層3x3的小卷積核替代了5x5卷積核。以攻擊InceptionV3模型為例,介紹生成攻擊樣本的基本原理。Keras內(nèi)置了這個模型,我們直接使用就可以了。從模型中直接獲取第一層的輸入作為輸入層,最后一層的輸出為輸出層。

model = inception_v3.InceptionV3()
model_input_layer = model.layers[0].input
model_output_layer = model.layers[-1].output

然后加載我們攻擊的圖片,比如我們的小豬。這里需要特別強調(diào)的是,NumPy出于性能考慮,默認的變量賦值會引用同樣一份內(nèi)存,所以我們需要使用np.copy手工強制復(fù)制一份圖像數(shù)據(jù)。

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

下面我們要定義最關(guān)鍵的三個函數(shù)了,我們定義損失函數(shù)為識別為烤面包機的概率,因此我們需要使用梯度上升算法,不斷追求損失函數(shù)的最大化,變量object_type_to_fake定義的就是烤面包機對應(yīng)的標(biāo)簽,在InceptionV3中面包機的標(biāo)簽為859。

object_type_to_fake = 859

有了損失函數(shù)以后,我們就可以通過Keras的接口獲取到對應(yīng)的梯度函數(shù)。最后通過K.function獲取一個Keras函數(shù)實例,該函數(shù)的輸入列表分別為輸入層和當(dāng)前是訓(xùn)練模式還是測試模式的標(biāo)記learning_phase(),輸出列表是損失函數(shù)和梯度。關(guān)于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] )

下面我們就可以開始通過訓(xùn)練迭代最終獲得我們需要的圖片了,我們認為烤面包機的概率超過60%即可,所以我們定義損失函數(shù)的值超過0.6即可以完成訓(xùn)練。我們設(shè)置使用訓(xùn)練模式,learning_phase()標(biāo)記為0,使用梯度上升的算法迭代獲取新的圖片內(nèi)容。為了不影響肉眼識別,超過閾值的部分會截斷,這部分功能使用NumPy的np.clip即可完成。

while cost < 0.60:
   cost, gradients = grab_cost_and_gradients_from_model([hacked_image, 0])
   hacked_image += gradients * learning_rate
   hacked_image = np.clip(hacked_image, max_change_below, max_change_above)
   hacked_image = np.clip(hacked_image, -1.0, 1.0)

我們輸出梯度的內(nèi)容,便于我們理解。

[[  2.29095144e-06   4.88560318e-07  -1.26309533e-06]
   [ -1.21029143e-06  -7.01245654e-06  -9.00149917e-06]
   [ -8.28917791e-07  -3.46928073e-06   3.33982143e-06]
   ..., 
   [ -2.91559354e-06  -8.72657665e-07   6.22621087e-07]
   [  2.66754637e-06   1.84044097e-06  -2.53160965e-06]
   [ -4.96620885e-07   3.94217068e-07  -7.95937069e-07]]]]

訓(xùn)練完成后,保存圖片即可。這里需要說明的是,圖像保存到NumPy變量后,每個維度都是0-255之間的整數(shù),需要轉(zhuǎn)換成-1到1之間的小數(shù)便于模型處理。保存成圖像的時候需要再轉(zhuǎn)換回以前的范圍。

img = hacked_image[0]
img /= 2.
img += 0.5
img *= 255.
im = Image.fromarray(img.astype(np.uint8))
im.save("../picture/hacked-pig-image.png")

在我的Mac本經(jīng)過接近2個小時3070次迭代訓(xùn)練,獲得了新的家豬圖像,但是機器學(xué)習(xí)模型識別它為烤面包機的概率卻達到了95.61%,我們攻擊成功。在GPU服務(wù)器上大致運行5分鐘可以得到一樣的結(jié)果。

對抗樣本的基本原理

總結(jié)

本章介紹了對抗樣本的基本原理,并以最簡單的梯度下降算法演示了生成對抗樣本的基本過程,大家可能會因為它的效率如此低而印象深刻。后面我們將進一步介紹常見的幾種生成對抗樣本的算法。

參考文獻

  • https://medium.com/@ageitgey/machine-learning-is-fun-part-8-how-to-intentionally-trick-neural-networks-b55da32b7196

  • https://blog.csdn.net/u012223913/article/details/68942581

  • Ian J. Goodfellow, Jonathon Shlens & Christian Szegedy,EXPLAINING AND HARNESSING ADVERSARIAL EXAMPLES,arXiv:1412.6572

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

對抗樣本的基本原理

分享:
相關(guān)文章

知情人士

AI安全三部曲 《web安全之機器學(xué)習(xí)入門》《web安全之深度學(xué)習(xí)實戰(zhàn)》 《web安全之強化學(xué)習(xí)和GAN》 作者 公眾號:兜哥帶你學(xué)安全
當(dāng)月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說