對抗樣本的基本原理

2020-12-17 雷鋒網

雷鋒網(公眾號:雷鋒網)AI科技評論按:本文首發於「兜哥帶你學安全」微信公眾號。

概述

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

在原理上介紹對抗樣本,以經典的二分類問題為例,機器學習模型通過在樣本上訓練,學習出一個分割平面,在分割平面的一側的點都被識別為類別一,在分割平面的另外一側的點都被識別為類別二。

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

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

梯度算法和損失函數

對抗樣本其實對機器學習模型都有效,不過研究的重點還是在神經網絡尤其是深度學習網絡領域。理解對抗樣本算法,需要一定的神經網絡的知識。在深度學習模型裡面,經常需要使用梯度算法,針對損失函數的反饋不斷調整各層的參數,使得損失函數最小化。損失函數可以理解為理想和現實之間的差距,通常定義一個函數來描述真實值和預測值之間的差異,在訓練階段,真實值就是樣本對應的真實標籤和預測值就是機器學習模型預測的標籤值,這些都是明確的,所以損失函數是可以定義和計算的。在分類問題中,常見的損失函數包括binary_crossentropy和categorical_crossentropy。

binary_crossentropy亦稱作對數損失,

categorical_crossentropy亦稱作多類的對數損失

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

xk+1=xk+ϵ∗grad(x)

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

xk+1=xk−ϵ∗grad(x)

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

f(x)=x2+2

根據梯度的定義,可以獲得對應的梯度為:

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

我們隨機初始化x,學習率設置為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步,由於我們預先知道函數的最小值為2,所以如果當計算獲得的函數值非常接近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裡面提供相應的工具返回loss函數關於variables的梯度,variables為張量變量的列表,這裡的loss函數即損失函數。

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

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

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

在進行神經網絡訓練時,追求的是損失函數最小,因此每輪訓練時,通過訓練集數據與模型的參數進行矩陣計算,獲得預測值,這一過程成為正向傳遞。然後通過計算預測值與目標值的損失函數,通過鏈式法則,計算出梯度值,然後根據梯度下降算法調整模型的參數值,這一過程成為反向傳遞。經過若干輪訓練後,損失函數下降到可以接受的程度,模型的參數也完成了調整,整個訓練過程結束。

攻擊InceptionV3模型

一般的卷積層只是一味增加卷積層的深度,但是在單層上卷積核卻只有一種,這樣特徵提取的功能可能就比較弱。Google增加單層卷積層的寬度,即在單層卷積層上使用不同尺度的卷積核,他們構建了Inception這個基本單元,基本的Inception中有1x1卷積核,3x3卷積核,5x5卷積核還有一個3x3下採樣,從而產生了InceptionV1模型。InceptionV3的改進是使用了2層3x3的小卷積核替代了5x5卷積核。以攻擊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

下面我們要定義最關鍵的三個函數了,我們定義損失函數為識別為烤麵包機的概率,因此我們需要使用梯度上升算法,不斷追求損失函數的最大化,變量object_type_to_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] )

下面我們就可以開始通過訓練迭代最終獲得我們需要的圖片了,我們認為烤麵包機的概率超過60%即可,所以我們定義損失函數的值超過0.6即可以完成訓練。我們設置使用訓練模式,learning_phase()標記為0,使用梯度上升的算法迭代獲取新的圖片內容。為了不影響肉眼識別,超過閾值的部分會截斷,這部分功能使用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)

我們輸出梯度的內容,便於我們理解。

[[  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]]]]

訓練完成後,保存圖片即可。這裡需要說明的是,圖像保存到NumPy變量後,每個維度都是0-255之間的整數,需要轉換成-1到1之間的小數便於模型處理。保存成圖像的時候需要再轉換回以前的範圍。

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本經過接近2個小時3070次迭代訓練,獲得了新的家豬圖像,但是機器學習模型識別它為烤麵包機的概率卻達到了95.61%,我們攻擊成功。在GPU伺服器上大致運行5分鐘可以得到一樣的結果。

總結

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

參考文獻

  • 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

雷鋒網版權文章,未經授權禁止轉載。詳情見轉載須知。

相關焦點

  • 神經網絡中的對抗攻擊與對抗樣本
    存在即合理,人類的視覺尚且如此,在沒有深入了解神經網絡的情況下,什麼樣欺騙機器的樣本其實都應該是很合理的存在。接下來,我們就了解一下對抗攻擊和對抗樣本出現的來龍去脈。其他的攻擊樣本訓練方式個人還沒有精力去研究,但我覺得基本思想大同小異,這裡也不一一展開,上面的兩篇論文更具有代表性,就用Survey中的一張表格做個簡單說明,這張表格將這些攻擊方法按時間排序,並結合相關特性做了一個對比。
  • 深度 | 生成對抗網絡初學入門:一文讀懂GAN的基本原理(附資源)
    在這篇文章中,我們將對生成對抗網絡(GAN)背後的一般思想進行全面的介紹,並向你展示一些主要的架構以幫你很好地開始學習,另外我們還將提供一些有用的技巧,可以幫你顯著改善你的結果。GAN 的發明生成模型的基本思想是輸入一個訓練樣本集合,然後形成這些樣本的概率分布的表徵。常用的生成模型方法是直接推斷其概率密度函數。
  • 原創對抗樣本與生成式對抗網絡
    對抗樣本與生成式對抗網絡對抗樣本和對抗性網絡,從最開始YannLeCun在Quora上直播時表示生成對抗性網絡近期人工智慧最值得期待的算法之一
  • 你真的懂對抗樣本嗎?一文重新思考對抗樣本背後的含義
    怎樣才能確保生成的對抗樣本符合這樣的定義?本文深入解析了對抗樣本背後的數學定義,並幫助讀者重新理解對抗樣本的定義。對抗樣本是各種機器學習系統需要克服的一大障礙。對抗樣本的存在表明模型傾向於依賴不可靠的特徵來最大化性能,如果特徵受到幹擾,那麼將造成模型誤分類,可能導致災難性的後果。
  • 對抗樣本攻擊與防禦,MindSpore是怎麼做的?
    防禦算法用了對抗訓練的方式,生成對抗樣本加入原始數據集中,一起訓練模型,得到的模型參數和單純用原始數據集的模型參數是有一點差異,這個差異,可能使得在測試集上的精度發生變化,可能減少,也可能增加。Q3:增加防禦算法對訓練時間的影響?
  • 深度神經網絡中的對抗樣本與學習7篇文章
    作者嘗試通過將培訓機制擴展到包含這些負面例子,使DNN對這些對抗圖像更加強大,但總是可能產生新的對抗樣本,仍會愚弄所產生的網絡。然後使用替代網絡技術來找到愚弄分類器的樣本。對MNIST的測試精度達到92.17%的亞馬遜分類器可能被96.19%的對抗樣本所欺騙;在MNIST上獲得了92%的測試準確性的Google分類器,可能被88.94%的對抗樣本所欺騙。基於梯度掩蔽的防禦對抗替換攻擊而言不是有效。
  • ACL2020|使用強化學習為機器翻譯生成對抗樣本
    因此我們可以通過利用已有平行句對的輸入產生對抗樣本的方式,沿用原本的輸出,從而快速得到大量可用於魯棒分析的平行數據。圖1: 對人名的變動影響了翻譯的預期結果(此樣例當前已被修復)2文本對抗樣本及難點對抗樣本的兩個核心為:保持語義限制,同時達成系統性能惡化。
  • 清華大學廖方舟:產生和防禦對抗樣本的新方法 | 分享總結
    它們與真實樣本的區別幾乎無法用肉眼分辨,但是卻會導致模型進行錯誤的判斷。本文就來大家普及一下對抗樣本的基礎知識,以及如何做好對抗樣本的攻與防。分享內容:大家好,我是廖方舟,今天分享的主題是對抗樣本的攻和防。
  • 清華大學團隊包攬三項冠軍,NIPS 2017對抗樣本攻防競賽總結
    如果輸入樣本是一個自然得到的樣本,比如來自 ImageNet 數據集的照片,我們稱之為「乾淨樣本」(clean example)。如果攻擊者修改了樣本,目的是使得該樣本會被誤分類,我們稱之為「對抗樣本」(adversasrial example)。當然,這種對抗攻擊並不一定會成功,模型可能仍然能夠正確分類對抗樣本。我們可以測量不同模型在特定對抗樣本集上的準確率或者錯誤率。
  • L2正則化視角下的對抗樣本
    事實上,當分類邊界靠近數據流形時,對抗樣本依然存在——換句話說,它獨立於圖像空間維度。建模讓我們從一個最小的玩具問題開始:一個二維圖像空間,其中每個圖像都是關於a和b的函數。當x和xp距離非常近時,我們把xp看做x的一個對抗樣本。聯繫第一個問題,顯然,xp被分類為I的置信度非常低,並不穩健。那麼有沒有置信度高的對抗樣本呢?
  • 對抗樣本的反思:僅僅設置更小的擾動閾值 ε,或許並不夠
    對抗樣本的反思雷鋒網AI科技評論編者按:對抗樣本是各種機器學習系統需要克服的一大障礙。它們的存在表明模型傾向於依賴不可靠的特徵來最大限度的提高性能,如果受到幹擾,可能會導致錯誤分類,帶來潛在的災難性後果。
  • 文本也有攻防戰:清華大學開源對抗樣本必讀論文列表
    在自然語言處理領域,對抗樣本的攻擊與防禦近來受到很多研究者的關注,我們希望構建更穩健的 NLP 模型。在本文中,我們簡要討論了攻防的概念,並介紹了清華大學近日開源的 NLP 對抗樣本攻防必讀論文列表。自然語言處理方面的研究在近幾年取得了驚人的進步,深度神經網絡模型已經取代了許多傳統的方法。
  • ACL 2018 俄勒岡大學:HotFlip:文本分類的白盒對抗樣本
    通過使用這些樣本作為訓練數據,對抗性訓練學習到了更健壯的模型,甚至可以在非對抗樣本上執行得更好。關於NLP系統漏洞的研究越來越多。以前的工作集中在在黑盒設置中創建對抗樣本的啟發式方法上,而沒有任何模型參數的明確知識。在白盒設置中,我們使用模型的完整知識來開發最壞情況下的攻擊,這可以揭示更大的漏洞。
  • 從GAN到WGAN:生成對抗網絡背後的數學原理(一)
    本文解釋了生成對抗網絡(GAN)背後的數學原理及其難以訓練的原因,並指出Wasserstein GAN是通過測量兩個概率分部之間的平滑度來改進GAN
  • 一文詳解生成對抗網絡(GAN)的原理,通俗易懂
    現有GAN網絡大多數代碼實現使用Python、torch等語言,這裡,後面用matlab搭建一個簡單的GAN網絡,便於理解GAN原理。GAN的鼻祖之作是2014年NIPS一篇文章:Generative Adversarial Net(https://arxiv.org/abs/1406.2661),可以細細品味。
  • 復旦大學李林陽:應用預訓練模型實現對抗樣本生成的高效方法
    李林陽:復旦大學  NLP group2019級研究生;導師為邱錫鵬教授;儘管深度學習取得了成功,但最近的研究發現神經網絡容易受到對抗樣本的攻擊,這些對抗樣本是對原始輸入進行細微擾動而製成的。儘管對抗性樣本對於人而言幾乎不可察覺,但是它們會誤導神經網絡進行錯誤的預測。
  • 要讓GAN生成想要的樣本,可控生成對抗網絡可能會成為你的好幫手
    韓國大學電子工程學院Minhyeok Lee和Junhee Seok近期發表論文,就生成對抗網絡的控制問題給出了自己的辦法,雷鋒網(公眾號:雷鋒網) AI 科技評論根據原文進行如下編輯,原文連結簡介生成對抗網絡(GANs)是最近幾年提出的新方法,在其問世之後的短短時間內,生成對抗網絡已經在生成真實的樣本上表現出很多有前途的結果了
  • 如何用 Caffe 生成對抗樣本?這篇文章告訴你一個更高效的算法
    ,本文作為其延續,將討論如何用Fast Gradient Sign方法在Caffe中生成對抗樣本。,在這個代碼中,我們執行的是生成一個對抗樣本降低當前模型預測類別的,其中每個像素在梯度方向上的前進幅度是1.0。
  • 深入淺出:GAN原理與應用入門介紹
    Statsbot 小組邀請數據科學家 Anton Karazeev 通過日常生活實例深入淺出地介紹 GAN 原理及其應用。生成對抗網絡由 Ian Goodfellow 於 2014 年提出。GAN 不是神經網絡應用在無監督學習中的唯一途徑,還有玻爾茲曼機(Geoffrey Hinton 和 Terry Sejnowski,1985)和自動解碼器(Dana H.
  • 新加坡國立大學在讀博士張景鋒:基於對抗學習的模型魯棒性研究...
    對抗樣本,即對輸入樣本故意添加一些人類無法察覺的細微幹擾從而形成的新樣本,可以導致模型以高置信度給出一個完全錯誤的輸出。對抗樣本給深度學習領域帶來了極大的挑戰與實際危害,如針對面部識別系統缺陷的非法認證、醫療數據等領域的隱私竊取和自動駕駛系統的惡意控制等。