back to index
【機器學習2021】來自人類的惡意攻擊 (Adversarial Attack) (上) – 基本概念

link |
好,我們來講一下下一個主題,我們來講adversarial attack。
link |
adversarial attack要講這個主題,要講的是什麼呢?
link |
我們這邊要講的是,我們在作業裡面,我們已經訓練了非常多各式各樣的類神經網路。
link |
我們當然期待說,我們可以把這些技術用在真正的應用上。
link |
但是,光是把這些network用在真正的應用上,要把這些network用在真正的應用上,光是他們正確率高是不夠的。
link |
他們還需要什麼能力呢?他們需要能夠應付來自人類的惡意。
link |
什麼叫做來自人類的惡意呢?有時候你的network,他的工作是為了要偵測一些有惡意的行為。
link |
如果今天他的工作是要偵測有惡意的行為,這些他要偵測的對象會去想辦法騙過network。
link |
Network在一般的情況下,都可以得到高的正確率是不夠的,他要在有人試圖想要欺騙他的情況下,也得到高的正確率。
link |
舉例來說,我們今天都會用network來做email的filtering,你會用network來偵測一封郵件,他是不是垃圾郵件。
link |
今天對於一個垃圾郵件的發信者而言,他也會想盡辦法避免他的郵件被分類為垃圾郵件。
link |
如果今天有人他想辦法去更改郵件的內容,想要去欺騙過network的話,那network到底能不能不要被欺騙呢?
link |
所以今天我們希望我們的內政經網路,他光是正確率高還不夠,我們希望他可以應付來自人類的惡意。
link |
舉例來說,這個是蟻王,知道嗎?他叫做梅露艾姆,他是站在生物頂點的一個存在,他非常的強,人類沒有辦法打贏他,他會消滅掉所有的人類。
link |
但是人類並沒有跟他打,人類是不講武德的,人類就直接放一個核彈就把他炸死,然後故事就結束了,就這樣。
link |
所以這告訴我們什麼?這告訴我們說network光是正確率高是不夠的,他必須要能夠應付來自人類的惡意。
link |
接下來我們就要講人類的惡意可能是什麼樣子的。
link |
我們先來看一個真正的例子,我們今天在好多的作業裡面,我們都已經訓練了影像辨識的模型。
link |
也就是說你有一個影像辨識的系統,給他一張照片,他可以告訴我們說這張照片屬於什麼樣的類別。
link |
那今天我們要做的事情是在這張照片上面加入一個非常小的雜訊,一張照片可以被看作是一個非常長的相量。
link |
我們在這個非常長的相量上加入每一個維度,都加入一個小小的雜訊,把這個有加入雜訊以後的照片丟到network,看看會發生什麼樣的事情。
link |
一般這個雜訊都非常非常的小,小到什麼地步呢?最好小到人肉眼沒有辦法看出來。
link |
所以這個例子裡面加的雜訊其實太大了,一般這個雜訊是小到人肉眼看不出來的。
link |
有被加雜訊的照片叫做attack image,有被攻擊的照片。
link |
那還沒有被加雜訊的照片呢,我們一般就叫做benign image,它是好的image,它是還沒有被攻擊的圖片。
link |
Benign的image丟到network裡面,它的輸出是貓,那我們期待說attack的image,我們現在是攻擊方,我們是壞人,我們希望attack的image丟到network裡面,它的輸出不可以是貓,要變成其他的東西。
link |
那攻擊大致上可以分成兩種類型,一種是沒有目標的攻擊,沒有目標的攻擊是原來的答案是貓,只要你能夠讓network的輸出不是貓,你就算是成功了。
link |
但是還有另外一種更困難的攻擊是有目標的攻擊,也就是說我們希望network不只它輸出不能是貓,還要輸出別的東西,比如說我們希望加了一個雜訊以後,network輸出是海星,要把錯誤判斷成一隻海星才算是攻擊成功。
link |
那這樣子的攻擊真的有可能做到嗎?我們真的可以加入一個人肉眼看不到的雜訊去改變network的輸出嗎?實際上是可以的。
link |
這邊用的network並不是一個很弱的network,它是50層的resnet。當我們把一個bignight的image沒有被攻擊的圖片丟到50層的resnet的時候,它的輸出是tiger cat。你知道今天這種影像辨識的系統,它的輸出都不只會告訴你它是什麼動物,還會告訴你它是哪一個品種的動物。
link |
所以給它這隻貓,它不只說它是cat,還說它是tiger cat。不過據說這個答案其實是錯的,據說這個貓不是tiger cat。不過沒有關係,反正它都認得出這個是一隻貓就對了,至少知道是一個貓科的動物。
link |
它還有一個信心的分數,信心的分數是0.64。這個信心的分數是什麼呢?這個信心的分數就是做完softmax以後得到的那個分數。就假設你的影像分類的類別有兩千類,兩千個類別都會有一個分數,那這個分數一定介於0到1之間,而且兩千個類別的分數合起來會剛剛好是1。
link |
那既然有兩千個類別那麼多,tiger cat可以拿到0.64的分數,那其實算是挺高的。接下來呢,我們在這個big knife的image上面加入一些雜訊。
link |
我們現在希望成功攻擊的目標是把tiger cat變成海星。被攻擊以後的圖片長得是這個樣子。你可能問說雜訊加在哪裡呢?雜訊已經加進去了,但它非常非常的小,小到人的肉眼根本沒有辦法看出來。
link |
把這張圖片丟到resnet以後會發生什麼事呢?resnet的output變成starfish,而且它的信心分數是100%,本來它還沒有那麼確定這是不是一隻貓,現在它百分之百確定它就是海星。
link |
那為了要證明說這兩張照片還是有一些不一樣的,我們把它做一下相減。光做相減是不夠的,做完相減以後還要把它們的差距放大50倍,你會得到這樣子的結果。
link |
所以這兩張照片確實有些不一樣,我並不是把同一張照片複製兩次來騙你,它們是有一點不一樣的,但是人根本看不出這點不一樣會造成什麼樣的影響,但是對resnet而言,它卻有了天差地遠的輸出。
link |
那也許有人會覺得說,也許是因為貓跟海星有什麼特別的關係,我可以把貓變成海星只是一個特例。這不是一個特例,你可以把這隻貓輕易地變成任何的東西。
link |
我完全可以加上另外一個雜訊,就讓這隻貓變成一個鍵盤。它一樣信心分數高達0.9%,本來不太確定它是不是貓,現在加入另外一個雜訊以後,nevo百分之九十八確定它就是一個鍵盤。
link |
那有人可能會覺得說,怎麼會發生這麼離譜的行為,會不會是這個nevo太爛?我告訴你,它可是有五十成的哦,它可不是一個非常爛的nevo。如果你加入的只是一般的雜訊,它並不會犯錯。
link |
這個是原來的圖片。我們現在加入一個雜訊,這個雜訊是你肉眼可見的,你可以很明顯地看到這張圖片裡面被加入了雜訊。這個時候ResNet覺得它看到的是Cappy Cat,這可能才是正確答案,但無論如何它都知道是貓科動物。
link |
把雜訊加得更大一點,它說這是Persian Cat,這是波斯貓。可能雜訊加得大一點,這個貓看起來毛茸茸的,所以ResNet覺得它看到了波斯貓。
link |
把雜訊再加更大一點,你可能已經不知道這是什麼東西了,這個時候ResNet說它看到了Fire Screen。Fire Screen是什麼呢?我Google了一下發現Fire Screen長這個樣子。
link |
所以你完全可以理解機器為什麼會犯錯,它覺得前面的雜訊是這個屏風,而後面這個橙色的貓就是火焰。它雖然犯錯,它錯的是有尊嚴的,它錯的是有道理的,但不知道為什麼,加入一個人肉眼看不到雜訊的時候,它卻產生了天差地遠的結果。
link |
接下來,我們在講為什麼這件事會發生之前,我們來看看剛才所說的攻擊究竟是如何做到。我們到底是怎麼加入了一個非常微小的雜訊,而這個非常微小的雜訊可以讓Network產生非常錯誤的結果呢?
link |
這個是我們的Network,它是一個function,我們叫它f,這個function輸入是一張圖片,我們叫它x0,它的輸出是一個distribution,這個是分類的結果,我們叫它y0。
link |
我們這邊假設Network的參數就是固定的,我們不討論Network的參數的部分,Network的參數不是我們今天的重點,所以它是固定的。如果是non-target attack的話,我們要怎麼找出non-target attack的雜訊呢?
link |
我們現在要做的目標就是我們要找到一張新的圖片,這張新的圖片我們用x來表示,當我們把x丟到這個Network f的時候,它的輸出是y,而我們希望y跟正確答案,正確答案叫做y hat,我們希望y跟y hat,它的差距越大越好。
link |
我們現在是non-target attack,沒有目標的攻擊,我們只要知道說正確答案是y hat,今天Network的輸出跟正確答案的差距越大,我們就算是攻擊成功了。
link |
那怎麼做到這件事呢?怎麼找到這個x丟到一個Network裡,然後它產生的y跟y hat差距越大越好呢?我們一樣要解一個optimization的問題,這個跟我們訓練一個Network其實是非常類似的。
link |
我們先定一個loss function,這個loss function叫做大L。這個大L是什麼呢?這個大L是y跟y hat之間的差距取一個負號。
link |
舉例來說,我們一般在做classification的時候,我們訓練的目標y跟y hat都是看它的cross entropy,那我們這個e of y hat這一項代表的就是y跟y hat之間的cross entropy。
link |
但是我們希望這個cross entropy越大越好,所以我們今天在cross entropy前面加一個負號,那這個負的cross entropy就是我們的loss,而我們希望這個loss越小越好。
link |
我們希望找到一個x,x可以讓l of x越小越好,l of x越小就代表說y跟y hat它們的cross entropy越大,也就是y跟y hat它們的距離越大。這個是沒有目標的攻擊。
link |
如果是有目標的攻擊的話,那我們會先設定好我們的目標,我們用y target來代表我們的目標。
link |
y hat其實是一個one-hot vector,y target也是一個one-hot vector。那我們現在希望這個y不只跟y hat越遠越好,我們還要跟y target越近越好。
link |
所以假設你的y target是一個fish,那你希望你輸出的這個y,它不只cat的機率越低越好,fish的機率還要越高越好。
link |
那你的loss function就寫成這樣,我們的loss function是負的y跟y hat之間的cross entropy,你希望這一項越大越好。
link |
同時你又希望y跟y target它們越小越好,你把這兩項加起來就是你的loss,你希望找一個x去minimize這個loss。
link |
但光是找一個x去minimize loss是不夠的,因為我們其實還期待說我們加入的雜訊越小越好。也就是我們新找到的圖片,可以欺騙過network的圖片跟原來的圖片要越相近越好,x跟x0要越近越好。
link |
所以我們在解這個optimization的problem的時候,我們還會多加入一個限制,這個限制是d of x0,x它小於等於ε。
link |
那這個d of x0,x小於等於ε是什麼意思呢?它的意思就是我們希望x跟x0之間的差距小於某一個threshold,小於某一個預值。
link |
那這個預值是根據什麼東西來決定的呢?通常就是根據人類的感知能力來決定。
link |
我們就是假設說如果x跟x0它們的差距大於這個d of x0,x就代表它們兩個之間的差距。
link |
那等一下下一頁的投影片我們會講說怎麼計算兩張圖片之間的差距。
link |
如果x0跟x之間的差距大於ε,我們假設人就會看到這個雜訊,人就會發現有一個雜訊存在,所以我們要讓x0跟x它的差距小於ε,小於等於人類可以感知的極限。
link |
那我們就可以產生一張圖片,人類看起來x跟x0是一模一樣的,但產生的結果對Neo來說是非常不一樣的。
link |
那怎麼計算x跟x0之間的差距,它們之間的距離呢?
link |
d of x0,x就代表它們之間的距離,有各式各樣不同的算法。
link |
那為了等一下符號的方便起見呢,我們假設x是一個向量,因為它是一個圖片,所以它是一個向量嘛。
link |
x0是另外一張圖片,它也是一個向量。
link |
那這個距離你可以定L2的none當作它們的距離,也就是說你可以計算Δx的L2none,
link |
Δx的L2none就是把Δx的第一位拿出來取平方,第二位拿出來取平方,第三位拿出來取平方。
link |
那這邊你其實要開根號也可以啦,就看你的L2none的定義是怎樣,你要開根號還是可以的。
link |
那另外還有一個定義呢,是L的infinity,L的infinity是怎麼看的呢?
link |
它就是把這個Δx拿來,然後看裡面哪一個維度它的絕對值最大,那這一個就是Linfinity。
link |
就把Δx1,Δx2,Δx3,也就是Δx的每一維都拿出來取絕對值,看誰最大。
link |
最大的那個就代表x跟x0之間的距離。
link |
那有各種不同的方法可以計算兩張圖片之間的距離,但是我們在決定要使用哪一種方法來計算圖片的距離的時候,
link |
其實我們應該把人類的感知把它考慮進來。
link |
那L2跟Linfinity到底哪一個在attack的時候是比較好的距離呢?
link |
這是一張圖片,假設這個圖片只有4個pixel而已。
link |
現在我們把這張圖片做兩種不同的變化。
link |
第一個變化是這4個pixel的顏色都做了非常小的改變。
link |
第二種變化是只有右下角這個pixel它的顏色被改了,但是改的是比較大的。
link |
如果我們今天在計算L2的none的時候,這兩張圖片的L2none和這兩張圖片的L2none是一樣的。
link |
上面這張圖片是下面這張圖片4個pixel都改過以後的結果,
link |
中間這個圖片是下面這個圖片,就下面這個圖片是中間這個圖片只有右下角的pixel改動以後的結果,
link |
這兩個變化,它們的L2none是一樣的。
link |
但是如果你看Linfinity的話,它們是不一樣的,因為Linfinity只在意最大的變化量。
link |
對於Linfinity而言,這個改變它的最大的變化量跟這個改變它最大的變化量,
link |
下面這個改變它最大的變化量是比較大的,上面這個改變最大的變化量是比較小的。
link |
那如果從這個例子來看,Linfinity跟L2哪一個比較接近人類的感知能力呢?
link |
因為對你來說,其實這兩張圖片,我相信多數人你可能都看不出它們之間有什麼差別。
link |
但我可以保證它們兩個之間是有差別的,它們是有非常非常微小的差別,
link |
只是它的差別是分佈在每一個pixel上面。
link |
而下面這兩個改變,你會很明顯的看到右下角這個綠色,它的顏色變深了。
link |
雖然另外這三個pixel的顏色是固定的,右下角的顏色一變深,你就發現圖片有變化了,
link |
所以看起來Linfinity也許更符合實際的需求。
link |
我們要避免被人類發現光是L2小是不夠的,我們要讓Linfinity小才是最好的,才是比較不會被發現的。
link |
所以在作業裡面,我們是用Linfinity來當作我們的限制,來當作攻擊的。
link |
我們作業就是要去攻擊一個George Floyd上面的影像辨識系統,
link |
那你產生出來的圖片,我們會有所限制說新的圖片跟舊的圖片,跟原來Be Nice的圖片的差距,
link |
要小於某一個threshold,那我們在定這個差距的時候,我們就是選擇Linfinity。
link |
那實際上這個差距要怎麼定才是比較好,這個也要憑domain knowledge。
link |
如果我們今天要攻擊的對象其實是一個跟語音相關的系統,我們的X跟X0其實都是聲音訊號。
link |
那什麼樣的聲音訊號對人類來說聽起來有差距,那就不見得是L2跟Linfinity了。
link |
你就要去研究人類的聽覺系統,看看人類對什麼頻帶的變化特別敏感,
link |
那根據人類的聽覺系統來制定比較適合的X跟X0之間距離的衡量方式,
link |
那這個部分就是需要用到domain knowledge。
link |
好,那我們現在已經有了我們的optimization的問題,
link |
我們要做的事情就是我們要去minimize一個loss,
link |
現在我們要找一個X去minimize這個loss,但是對X我們是有限制的,X跟X0他們的distance要小於等於X0。
link |
那這個問題到底要怎麼解呢?我們先把這個限制拿掉。
link |
如果把這個限制拿掉,你會不會解這個問題呢?你其實會解這個問題。
link |
因為這跟我們train一個模型其實沒有什麼差別啊,
link |
我們在第一堂課的時候就列過這個optimization的問題給你看,
link |
告訴你說你可以調你的network的參數去讓一個loss最小。
link |
我們今天只是把參數改成network的input而已,就這樣。
link |
你就把input的那張image看作是network參數的一部分,然後minimize你的loss function就結束了。
link |
現在network的參數是固定的,我們只去調input的部分,
link |
讓input的部分去改變,去minimize一個loss就結束了,用的一樣是gradient descent。
link |
那怎麼做呢?你就這樣做啦,就是你要先有個initialization嘛,
link |
我們現在要找的對象不是network的參數,是X,是你input的image。
link |
但是他還是需要一個初始化的值,對不對?
link |
你還是需要一個做gradient descent的時候初始化的值。
link |
那初始化的值設什麼樣的數值比較好呢?
link |
你可能不會從隨機的image開始,你可能會從X0開始。
link |
因為我們本來就希望說,我們新找到的X應該要跟X0越接近越好嘛。
link |
那你何不就從X0開始找呢?你從X0開始找,你接下來找出來的X可能就會跟X0比較接近。
link |
所以你初始化的X,你會初始化的這個X你就直接設X0。
link |
那接下來就跟一般的gradient descent是一模一樣的,我們就是iterative的去update你的參數,
link |
你就設一個iteration,t等於1到T,然後在每一個iteration裡面你都會計算gradient。
link |
只是這個gradient不是network參數對loss的gradient,我們現在已經不管network參數了,
link |
而是input的那一張imageX對於loss的gradient。
link |
那input的這個X它也是一個很長的向量嘛,它裡面就是有X1、X2、X3嘛。
link |
你就去計算這個input的image裡面,每一個數值對大L的偏微分。
link |
就X1對大L的偏微分,X2對大L的偏微分。
link |
算出來,算出一個gradient,用這個gradient去update你的image就結束了。
link |
所以你本來的imageX0,它就減掉這個gradient,那前面你也會乘上一個learning rate,就跟一般的gradient descent是一模一樣的。
link |
只是要做gradient descent的對象,從參數換成input而已,其他都是一樣的。
link |
你也有learning rate那些什麼東西,通通都有。
link |
你算一個gradient,乘上learning rate,減掉原來的image,然後就得到新的image。
link |
那你可以iteration的跑,就跟一般的gradient descent是一模一樣的。
link |
但是這個是在沒有constraint的前提下。
link |
接下來我們得把constraint加進去。
link |
因為一般我們在做gradient descent的時候,我們並沒有把gradient descent的對象做什麼限制。
link |
我們並沒有設限說我們的參數一定要長什麼樣子。
link |
那現在我們是有限制的,我們限制說X跟X0,他們的差距一定要小於WM4.
link |
你就在你的gradient descent裡面再加一個module。
link |
我發現說快5.20了,你知道今天我們需要在5.20左右就結束了。
link |
所以我們等一下可能會需要講到一個段落就結束它。
link |
我們要跑gradient descent這個演算法,但是我們要同時考慮X0跟X之間的差距。
link |
這邊這個方法說穿了不值錢,非常的簡單。
link |
如果你update完你的參數以後發現X0跟X,我這邊應該要用XT比較正確啦。
link |
你update完你的參數以後發現你的XT跟X0的差距大於X0以後,
link |
你就做一個修改,把XT做一個修改,把它改回符合限制就結束了。
link |
舉例來說,假設我們現在用的是Linfinity,我們的X0在這個地方,
link |
那我們的X它可以存在的範圍就只有這個方形框框的範圍,對不對?
link |
Linfinity是考慮X0跟X之間最大的差距。
link |
所以出了這個框大的差距就會超過Epsilon。
link |
所以今天你在做完這個gradient descent,用gradient去update你的X以後,
link |
它一定還是得要落在這個框框裡面才行。
link |
那怎麼保證update以後一定落在這個框框裡面呢?
link |
你就只要update超出了框框,就把它拉回來就結束了。
link |
所以今天這個步驟,如果做完,你發現你得到藍色這個點,
link |
在框框裡面找一個跟藍色的點最近的位置,
link |
其實這種attack有非常多不同的變形,
link |
我想你在文獻上可以找到各式各樣attack的方法,
link |
但其實它們的精神都不拖我們今天講的這個式子。
link |
那它們通常不一樣的地方就是,要嘛是constraint不一樣,
link |
要嘛是optimization的方法不一樣,
link |
但是通常都還是用gradient descent,它們的精神還是一樣的,
link |
只是這邊你可能會有不同的optimizer,
link |
它們精神都不拖我們今天跟大家舉的這個例子。
link |
那接下來呢,我們跟大家介紹一個最簡單的attack的方法,
link |
也是作業裡面你要過medium baseline吧,所用的方法。
link |
這個方法是什麼呢?這個方法它叫做FGSN,
link |
它可以過medium baseline嗎?
link |
它不能過medium baseline,它只能過simple baseline。
link |
這個FGSN它是怎麼做的呢?非常的簡單,
link |
它叫做Fast Gradient Side Method的縮寫。
link |
它怎麼做呢?它就像是一個一拳超人一樣,
link |
本來一般你在做gradient descent的時候,
link |
一級就找出一個可以attack成功的image。
link |
所以首先呢,本來要iterative的去update參數,
link |
它說我們不要直接用這個gradient descent的值,
link |
它的值可以是任何的real number,
link |
但現在取sign,它要嘛是正1,要嘛是負1。
link |
learning rate就設epsilon,
link |
就看你這邊的這個epsilon設多大,
link |
直接設一個一模一樣的會得到什麼效果呢?
link |
你一定落在這個藍色框框的四個角落的地方。
link |
你今天的x0要嘛就是往右邊移epsilon,
link |
它一定會挪到這個四方形的四個角落的地方,
link |
所以這個你可以過Simple Baseline。
link |
如果我多攻擊幾次,多跑幾個Iteration,
link |
會更好,所以多跑幾個Iteration,
link |
就過Medium Baseline,就這樣子。
link |
所以怎麼多跑幾個Iteration呢?
link |
要跑幾個Iteration的高性就是你自己設,
link |
就設個比如說3、5、10,多跑幾個Iteration。
link |
那但是多跑幾個Iteration的壞處是,
link |
有可能一不小心就跑出了這個四方形的範圍。
link |
你就看說在這個藍色的點Update以後,
link |
好,這個就是Iterative的FGSM,
link |
它可以通過Medium的Baseline。
link |
也許正好到一個段落,我們在這邊就先下課了。
link |
大家有問題呢,其實還是可以繼續留下來問,