back to index

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


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