back to index

【機器學習2022】自然語言處理上的對抗式攻擊 (由姜成翰助教講授) - Part 3


link |
00:00.000
大家好,我是江承翰,那我們就繼續上禮拜講的東西。
link |
00:05.000
剛剛稍微耽誤了一點時間,不好意思,希望今天可以兩個小時內講完。
link |
00:10.000
上禮拜我們已經講了 NLP 裡面最重要的 evasion attack。
link |
00:18.000
我們也講了要怎麼去 control evasion attack 裡面的 adversarial sample。
link |
00:25.000
那當初我們講的是說,因為 NLP 的 input 是 discrete,所以它跟 CV 或是 audio 是不一樣的。
link |
00:36.000
我們必須要用一些很特別的方法才能找出一個合理的 adversarial sample。
link |
00:43.000
那這個有沒有其他方法不要用這些大量的 transformation 還有 constraint,
link |
00:52.000
還有 search method 才能達成這個 goal? 其實是有的。
link |
00:56.000
那今天來介紹剩下兩個來 construct evasion attack 裡面的 adversarial sample 的方式。
link |
01:02.000
但是它做的事情是我們直接訓練一個模型,
link |
01:06.000
這個模型的目標就是要產生一個 adversarial example。
link |
01:11.000
那我們來看一下實際上要怎麼做。
link |
01:15.000
那首先我們第一個介紹的例子是我們直接用一個 autoencoder 來生成一個句子,
link |
01:20.000
然後這個句子就會是一個 adversarial example。
link |
01:24.000
那這個想法其實很簡單,就是我訓練一個 generator,
link |
01:30.000
那這個 generator 它是一個 autoencoder,
link |
01:32.000
那這個 autoencoder 做的事情就是當它看到一個正常的 input 的時候,
link |
01:37.000
它就要去改寫這個正常的 input,
link |
01:40.000
也就是它要改寫正常的 input,
link |
01:43.000
然後改寫出來讓它最後 output 出來的是一個 adversarial example。
link |
01:48.000
那這個 generator 它的目標就是要生出一個足夠好的 example,
link |
01:57.000
那這個 example 要好到可以去讓 classifier 的 output 是爛掉的。
link |
02:04.000
也就是說原本有一個 text classifier,
link |
02:09.000
然後當你餵進去這個 autoencoder,
link |
02:13.000
也就是 generator output 出來的 sample 的時候,
link |
02:16.000
我們希望它可以跟原本你把這個東西餵進去的時候,
link |
02:21.000
它得到的 output 是相反的。
link |
02:24.000
那另外為了要訓練這個 generator,
link |
02:28.000
它多訓練了一個 classifier,
link |
02:31.000
那這個 classifier 它的目標就是要正確的判斷
link |
02:36.000
這個 autoencoder output 出來的東西。
link |
02:39.000
那這個整體而言,這個想法就是很像,
link |
02:43.000
有一點點像是 GAN,但它有點不太一樣。
link |
02:46.000
就是 autoencoder 它要生出一個 sample,
link |
02:50.000
可以去騙過 classifier,
link |
02:53.000
然後 classifier 它要足夠強,
link |
02:57.000
可以去正確的判斷出這個 autoencoder output 出來的東西是哪一個 class。
link |
03:03.000
但這邊跟 GAN 不太一樣的是說,
link |
03:05.000
GAN 要判斷的是在 GAN 裡面,
link |
03:07.000
它的 discriminator 它要做的是什麼?
link |
03:09.000
是要判斷它的 input 是生成出來的,
link |
03:13.000
還是原本真實的 beta 嗎?
link |
03:15.000
但這邊不是,這邊它要判斷的是
link |
03:18.000
這個 input,這個是 movie-review 的例子,
link |
03:22.000
所以它這個 input 是正面的情緒還是負面的情緒?
link |
03:25.000
那對於一個好的 classifier,
link |
03:28.000
它就應該要判斷出來說,
link |
03:30.000
不管你做了什麼 perturbation,
link |
03:32.000
它只要是合理的 perturbation,
link |
03:33.000
它都應該要是正面的,
link |
03:35.000
它不應該改變它的預測。
link |
03:38.000
所以這個 generator 它做的事情,
link |
03:40.000
實際上就是它要做 attack,
link |
03:42.000
它要去 construct 一個 adversarial sample,
link |
03:44.000
使得一個不 robust classifier 它可以被騙過。
link |
03:49.000
另外它用的這個 robust classifier,
link |
03:52.000
它做的事情其實就是 defense,
link |
03:54.000
就是它要去想辦法可以去正確的判斷說,
link |
04:02.000
今天進來的不管是 adversarial sample 還是正常的 input,
link |
04:06.000
它都要有辦法去正確的判斷它。
link |
04:09.000
那所以整個訓練的過程呢,
link |
04:11.000
就要交替的在 attack 跟 defense 這兩個 step,
link |
04:17.000
就是有時候要 train 一下這個 autoencoder,
link |
04:19.000
然後使它 output 出來的這個 example 是足夠好的,
link |
04:24.000
那有時候要 update 這個 classifier,
link |
04:29.000
然後使得它是足夠強可以去判斷說,
link |
04:32.000
現在的 input 到底是,
link |
04:36.000
不管它是 adversarial sample 還是不是 adversarial sample,
link |
04:39.000
它都要有辦法正確判斷。
link |
04:41.000
那我們首先來看一下這個,
link |
04:43.000
在 attack step 的時候,
link |
04:45.000
它要怎麼去訓練這個 autoencoder。
link |
04:47.000
那在 attack step 的時候呢,
link |
04:49.000
它原本那個 robust classifier 就是不會用到,
link |
04:54.000
它只會用到原本的這個 test classifier,
link |
04:57.000
這個 test classifier 是本來就已經訓練好的,
link |
04:59.000
然後你要先訓練好一個不 robust classifier,
link |
05:02.000
然後才會去訓練這個 generator。
link |
05:09.000
好,那這個 attack step 呢,
link |
05:11.000
它要訓練這個 generator,
link |
05:12.000
它使用了三個不同的 loss,
link |
05:14.000
那首先我們來看其中兩個 loss,
link |
05:17.000
一個是 reconstruction loss,
link |
05:18.000
一個是 similarity loss,
link |
05:20.000
那這兩個 loss 呢,寫出來長這個樣子,
link |
05:22.000
那我丟口令讓大家敘述一下,
link |
05:24.000
大家不用太在意式子裡面是什麼。
link |
05:26.000
這個 x 跟 x star 呢,
link |
05:29.000
代表原本的 input 跟 autoencoder output,
link |
05:32.000
那 reconstruction 這個 loss 呢,
link |
05:34.000
它要求的就是呢,
link |
05:35.000
這個 autoencoder output 要跟 input 足夠像,
link |
05:39.000
那足夠像呢,它從兩個層面來限制,
link |
05:43.000
第一個就是 reconstruction loss,
link |
05:45.000
reconstruction loss 呢,
link |
05:46.000
要求說它在 token level 要長得足夠像,
link |
05:49.000
那 similarity loss 它要求的是,
link |
05:51.000
這邊兩個的 token embedding 要足夠像,
link |
05:53.000
所以你可以把它想像成,
link |
05:55.000
這個就有點像是我們在那個,
link |
05:57.000
我們在講那四個要素裡面的那個 constraint,
link |
06:00.000
我們有講到一個 sentence encoder 的 similarity,
link |
06:04.000
那它這邊就是要求說,
link |
06:05.000
input 跟 output 它的 similarity 要足夠像,
link |
06:08.000
但是呢,你如果讓它是完全一樣的啊,
link |
06:10.000
這個就失去了我們要 attack 的這個目標了,
link |
06:14.000
所以它除了這兩個 loss 之外啊,
link |
06:17.000
它還另外多加了一個叫做 adversarial loss,
link |
06:20.000
那這個 adversarial loss 它要做的事情呢,
link |
06:22.000
就是它要想辦法去騙過這個 classifier,
link |
06:26.000
使得呢,這個 classifier 當它看到一個 adversarial symbol 的時候,
link |
06:32.000
它的 output 會是爛掉的,
link |
06:34.000
所以說在 attack step 的時候呢,
link |
06:36.000
它就是用這三個不同的 loss 去訓練這個 generator,
link |
06:41.000
那另外呢,這個除了 attack step 它也要,
link |
06:45.000
它另外一個步驟是 defense 的 step 嘛,
link |
06:49.000
那它 defense 的 step 呢,它要做的就是,
link |
06:52.000
它要訓練這個 autoencoder 跟另外一個 robust classifier,
link |
06:56.000
那為什麼會說它是 robust 呢?
link |
06:58.000
因為這個分類器啊,
link |
07:01.000
它看到正常的 input 的時候,
link |
07:03.000
它可以正確的判斷,
link |
07:04.000
另外呢,我們也希望它看到 adversarial symbol 的時候,
link |
07:08.000
它的這個 output 呢,也是可以是正確的,
link |
07:12.000
所以我們說它是個 robust classifier,
link |
07:15.000
那這個 robust classifier 啊,
link |
07:16.000
跟前面一頁我們看到這個 classifier 是不一樣的,
link |
07:20.000
這個 classifier 呢,它在 attack step 的時候,
link |
07:23.000
它是不會被 update,
link |
07:24.000
可是這個 robust classifier 它在訓練的時候呢,
link |
07:28.000
它會一直被 update,
link |
07:30.000
所以也就是說這個,
link |
07:32.000
在 defense step 的時候,
link |
07:34.000
我們就是要訓練一個 robust 的這個分類器,
link |
07:38.000
所以它是要被 update,
link |
07:40.000
那這個 defense step 它訓練這個 classifier,
link |
07:44.000
它也會同時訓練這個 autoencoder,
link |
07:46.000
那它用了一樣是三個不同的 loss,
link |
07:48.000
那這三個 loss 呢,跟剛才也還蠻像的啊,
link |
07:51.000
前面兩個 loss 是一樣的,
link |
07:53.000
就是我要要求說這個 generator,
link |
07:55.000
它生出來的 output 要跟 input 值夠像,
link |
07:59.000
不管是在 token label 上面要像,
link |
08:01.000
或是在 sentence embedding label 要像,
link |
08:03.000
那另外一個 loss 呢,就是 defense loss,
link |
08:06.000
所謂的 defense loss 呢,
link |
08:07.000
就是我要要求說這個 classifier,
link |
08:10.000
它要有足夠的能力去辨識今天的 input,
link |
08:13.000
那這件事情就是說呢,
link |
08:17.000
當今天的 input 是 x 或是 x star,
link |
08:20.000
不管是這個正常 input 還是 adversarial input,
link |
08:24.000
我都希望它可以生出一個判斷,
link |
08:26.000
那這個就是 defense loss,
link |
08:28.000
所以它的這個 training 呢,
link |
08:30.000
會交替的在 attack 跟 defense 運作,
link |
08:33.000
那 attack 的時候呢,
link |
08:34.000
它就是 update 這個 generator,
link |
08:36.000
然後 defense 的時候呢,
link |
08:37.000
它就是同時 update 這兩個,
link |
08:39.000
那可能會有人好奇說,
link |
08:41.000
為什麼這個 defense 的時候,
link |
08:44.000
它也要訓練這個 autoencoder,
link |
08:47.000
如果,我想是這樣,
link |
08:50.000
如果你不訓練這個 autoencoder 的話,
link |
08:52.000
它產生的東西可能就會非常非常很爛,
link |
08:57.000
它如果一直產生很爛的東西的話,
link |
08:59.000
那,不是它會產生很爛的東西,
link |
09:03.000
是我想一下要怎麼講,
link |
09:08.000
如果你不訓練這個 autoencoder 的話,
link |
09:12.000
它就沒有辦法產生會讓它答對的東西,
link |
09:16.000
因為現在這個,
link |
09:17.000
在這個 defense step 的時候,
link |
09:19.000
我們的目標是要生成一個正常的 input,
link |
09:22.000
但是它是對 robust classifier 來說,
link |
09:25.000
它是正常的 input,
link |
09:27.000
所以如果你沒有 update 它的話,
link |
09:29.000
它就不會學到說,
link |
09:30.000
它要怎麼生成一個是 adversarial,
link |
09:34.000
但是可以讓 robust classifier 的 output 是正確的這個句子,
link |
09:41.000
所以大概是這個樣子。
link |
09:43.000
那這邊有兩個箭頭的意思是說,
link |
09:46.000
就是不管是 autoencoder 的 input 還是 output,
link |
09:49.000
都會被這個 test classifier 拿來重新做訓練,是嗎?
link |
09:56.000
對,就是這個樣子。
link |
09:57.000
OK,好。
link |
09:59.000
好,那其實剛才在講的時候,
link |
10:02.000
我忽略了一個小小的細節,
link |
10:06.000
這個細節是這樣子,
link |
10:07.000
就是當我們要從,
link |
10:10.000
我們要訓練這個 autoencoder 的時候,
link |
10:14.000
不管是在 attack step 還是在 defense step,
link |
10:17.000
我們都是要拿這邊的 output,
link |
10:19.000
然後算出來的 loss,
link |
10:21.000
然後對這個 autoencoder 的參數做為分之後,
link |
10:25.000
做 gradient descent,
link |
10:27.000
那這時候會有一個小問題,
link |
10:28.000
就是在 backward 的時候,
link |
10:30.000
這個 autoencoder 其實你是沒有辦法回分過去的。
link |
10:33.000
那這個是為什麼?
link |
10:35.000
這是為什麼呢?
link |
10:36.000
那我們來看一下下面這張圖。
link |
10:38.000
當我們把一個 input 丟到 generator 裡面的時候,
link |
10:42.000
它做的事情就是,
link |
10:43.000
它要 output 出一個 adversarial sample,
link |
10:46.000
那這個 adversarial sample 是怎麼被 output 出來的呢?
link |
10:50.000
這個 autoencoder,
link |
10:52.000
它在每一個 time step,
link |
10:54.000
它就 output 出這個 time step 的 token,
link |
10:59.000
它的一個 distribution,
link |
11:01.000
那假設說在這個 autoencoder,
link |
11:04.000
看完這個 input 句的時候,
link |
11:06.000
它 output 出來的第一個 token,
link |
11:08.000
它的 probability distribution 長得是這個樣子,
link |
11:12.000
那我們接下來做的事情呢,
link |
11:13.000
就是我們會去 sample 出一個 token,
link |
11:17.000
從這整個 probability distribution 裡面做 sample,
link |
11:20.000
那 sample 出來之後呢,
link |
11:24.000
就得到我們的 adversarial sample 的第一個 token,
link |
11:28.000
那這件事情就一直做一直做,
link |
11:30.000
做到這個 adversarial sample 的整個句子被產生出來之後,
link |
11:36.000
我們就得到一個 adversarial sample。
link |
11:38.000
那當我們要做這個 backward 的時候呢,
link |
11:42.000
會有一個問題啊,
link |
11:43.000
就是我們在 backward 的時候,
link |
11:44.000
sampling 的這個過程,
link |
11:47.000
它其實是不能回分的,
link |
11:52.000
所以你要 backward 的時候,
link |
11:54.000
它會直接卡在這個地方。
link |
11:57.000
那這件事情要怎麼解決呢?
link |
12:02.000
那在講解決的方法之前,
link |
12:03.000
我們先來看一下這個 autoencoder,
link |
12:07.000
它的 output 是怎麼被送到後面的 classifier 裡面,
link |
12:13.000
那我們可能會比較知道怎麼解決這個問題。
link |
12:16.000
那這個 autoencoder 呢,
link |
12:18.000
它的 output 經過 sample 之後,
link |
12:21.000
我們會得到一個句子,
link |
12:22.000
那得到這個句子之後呢,
link |
12:24.000
我們就會要把它丟到後面的 classifier 裡面。
link |
12:31.000
那我們要把一個句子丟到 classifier 的時候呢,
link |
12:35.000
我們要先做 embedding lookup,
link |
12:36.000
把這個句子裡面的每個 token 都轉換成它所對應的 embedding 的時候,
link |
12:41.000
它才可以被餵到 classifier 後面的一些 network 裡面。
link |
12:47.000
所以我們就對每個 token 做 embedding lookup 之後呢,
link |
12:51.000
得到這些 embedding。
link |
12:53.000
那這些 embedding 就丟到這個 classifier 裡面。
link |
12:58.000
那我們來看一下這邊這個過程是怎麼做的。
link |
13:02.000
那這個過程其實是這樣的,
link |
13:03.000
就是 autoencoder 它經過 sample 之後,
link |
13:06.000
它會產生一個 one-hot vector,
link |
13:09.000
那這個 one-hot vector 呢,
link |
13:10.000
假設以 i 這個 token 為例的話,
link |
13:13.000
那這個 one-hot vector 的第三個 entry 就代表
link |
13:18.000
在 classifier 的這個 embedding 裡面第三個 word embedding。
link |
13:25.000
那這個東西呢,
link |
13:26.000
當你去乘以 classifier 的這個 embedding table 的時候,
link |
13:30.000
你就會得到這個代表 i 的這個 word embedding。
link |
13:36.000
所以這個就是 embedding lookup 實際上在做的事情。
link |
13:39.000
好,那我們說呢,
link |
13:41.000
這個 sampling 的這個過程,
link |
13:45.000
它會讓它是不能為分的。
link |
13:47.000
所以我們就要想辦法做一件事情,
link |
13:50.000
讓這個東西產生出這個 one-hot vector 的,
link |
13:54.000
應該不能說 one-hot vector,
link |
13:56.000
這個就是 autoencoder 產生出來這個 vector,
link |
13:59.000
產生出這個 vector 的過程是一個可以為分的過程。
link |
14:03.000
那我們就介紹一個在 NLP 裡面
link |
14:06.000
很有代表性的一個方法,
link |
14:09.000
叫做 Gambel-Softmax 的 re-parameterization trick。
link |
14:13.000
那這件事情我先直接講一下它怎麼做的,
link |
14:16.000
然後我也沒有要講它數學上的推導,
link |
14:19.000
因為它數學有點複雜,
link |
14:21.000
我就直接講怎麼做就好了。
link |
14:23.000
它做法是這樣的,
link |
14:24.000
就是當我們從一個 autoencoder output 出來,
link |
14:29.000
得到一個機率分布,
link |
14:31.000
那我們把這個機率分布叫做 pi,
link |
14:33.000
然後假設它這個 pi 這個 distribution 呢,
link |
14:36.000
它上面有四個不同的這個,
link |
14:40.000
所以它長度是四啦,
link |
14:41.000
所以它有四個不同的 class,
link |
14:42.000
然後我們分別以 pi1, pi2, pi3, pi4 來表達。
link |
14:45.000
那我們接下來會做的事情就是,
link |
14:47.000
我們本來要做的事情是
link |
14:48.000
我們要從這個裡面做 sampling,
link |
14:50.000
然後做 sampling 之後呢,
link |
14:51.000
我們應該要得到一個 one-half vector,
link |
14:53.000
然後後面我們做的事情就是
link |
14:55.000
拿這個 one-half vector 去乘以
link |
14:57.000
這個 worry embedding table,
link |
14:59.000
我們就會得到我們要的那個 worry embedding。
link |
15:01.000
那我們有說呢,
link |
15:02.000
sampling 這件事情會讓我們不能為分,
link |
15:09.000
所以我們要想想看
link |
15:10.000
我們有沒有辦法做某件事情,
link |
15:12.000
然後呢,它可以達到 sampling 的功能,
link |
15:15.000
但這件事情又是可以為分的。
link |
15:17.000
那這個解決方法就是使用 Gauss-Belsof-Max,
link |
15:21.000
那它是怎麼做的呢?
link |
15:23.000
它是這樣做的啦,
link |
15:25.000
就是當你得到這個 output distribution pi 之後呢,
link |
15:28.000
你把它做一個 log transform,
link |
15:31.000
就是 pi1 變成 log pi1,
link |
15:35.000
pi2 變成 log pi2,
link |
15:36.000
pi3 變成 log pi3,
link |
15:38.000
pi4 變成 log pi4,
link |
15:40.000
然後呢,把這個得到的結果
link |
15:42.000
加上我們一個非常神秘的 distribution,
link |
15:44.000
那這個神秘的 distribution
link |
15:46.000
就是一樣是有四個不同的 class,
link |
15:49.000
然後它每一個東西
link |
15:51.000
我就用 g1, g2, g3, g4 來代表它。
link |
15:54.000
那這個神秘的 distribution 呢,
link |
15:56.000
它的每一個 class 的這個 probability 啊,
link |
16:00.000
它都是從一個叫做 Gauss-Belsof-Max
link |
16:03.000
01 的 distribution,
link |
16:05.000
那個 iid sample 出來的。
link |
16:07.000
所以假設你有這個 n 個 class,
link |
16:11.000
你就要從 Gauss-Belsof-Max 裡面
link |
16:13.000
做 n 次的 sampling,
link |
16:14.000
然後 sample 出這 n 個不同的
link |
16:16.000
這個機率出來。
link |
16:19.000
那 sample 出來之後呢,
link |
16:20.000
你再把你剛才經過 log
link |
16:22.000
transform 的這個 distribution pi
link |
16:24.000
加在一起得到一個我們叫做
link |
16:26.000
g of i 的這個 distribution,
link |
16:29.000
那得到 g of i 這個 distribution 之後呢,
link |
16:33.000
你把它取 arcmax,
link |
16:35.000
那這個 g of i 會是一個
link |
16:37.000
一樣是四個 class 的 distribution 嘛,
link |
16:41.000
那這個 distribution 你就可以取 arcmax,
link |
16:43.000
取 arcmax 的意思就是你要找說
link |
16:45.000
在這四個 class 裡面哪一個東西的
link |
16:48.000
哪一個 class 它的機率是最大的,
link |
16:50.000
或是值是最大的。
link |
16:52.000
那假設我們最後 gi 取出來呢,
link |
16:54.000
那可能最後結果是
link |
16:57.000
在這個第三個 class 它的機率是最大的,
link |
17:00.000
所以你就得到一個這樣的 distribution。
link |
17:02.000
那因為這個 gampil-softmax
link |
17:05.000
你從這個 gampil-01 這個 distribution 裡面
link |
17:07.000
做 RID sample 的時候呢,
link |
17:09.000
這個每一次 sample 的結果
link |
17:10.000
會是不一樣的嘛,
link |
17:11.000
所以有可能你這次 sample 出來的
link |
17:13.000
G2 比較大,
link |
17:15.000
然後加上原本的這個
link |
17:16.000
經過 log transform 的這個
link |
17:18.000
pi distribution 之後呢,
link |
17:19.000
它最後取 arcmax 有可能是
link |
17:21.000
V2 這個機率最大,
link |
17:23.000
那有時候可能是這個
link |
17:26.000
第四個 class 它的機率最大。
link |
17:28.000
所以呢,這個因為
link |
17:32.000
gampil sampling 的這個隨機性,
link |
17:36.000
所以會造成你最後取 arcmax
link |
17:38.000
的一個隨機性。
link |
17:40.000
那非常非常神奇的事情就是呢,
link |
17:42.000
這個隨機性啊,
link |
17:44.000
sample 出來的結果,
link |
17:46.000
不是,這個 arcmax 取 arcmax,
link |
17:49.000
就是 gi 這個 distribution 取 arcmax
link |
17:51.000
之後得到的這個結果,
link |
17:53.000
它會跟你從 pi 這個 distribution
link |
17:56.000
sample 出來的結果是一樣的。
link |
17:58.000
這個所謂的一樣,
link |
17:59.000
不是說你用這個 distribution
link |
18:01.000
去 sample 出來的答案,
link |
18:03.000
如果是 V3 最大的話,
link |
18:06.000
那你用 gampil sample next,
link |
18:08.000
你用 gampil,
link |
18:10.000
加上 gampil 這個 nodes,
link |
18:11.000
然後再取 arcmax 之後,
link |
18:12.000
就一定是這個 V3 的這個 class
link |
18:15.000
是最大的。
link |
18:16.000
不是這個意思,
link |
18:17.000
這個意思是說呢,
link |
18:18.000
這個東西取 arcmax 之後的
link |
18:20.000
機率分布啊,
link |
18:21.000
它符合 pi 這個分布,
link |
18:23.000
也就是說,
link |
18:24.000
第一個 class 它的,
link |
18:26.000
它是 G1 的最大的一個 class 的
link |
18:30.000
機率呢,
link |
18:31.000
會是 pi 1,
link |
18:32.000
然後 C2,
link |
18:33.000
也就是第二個 class,
link |
18:34.000
它會是 gi 的這個分布裡面
link |
18:36.000
最大的那個,
link |
18:37.000
它的機率是 pi 2,
link |
18:38.000
那 C3 這個 class,
link |
18:40.000
它的機率在 gi 裡面
link |
18:43.000
是最大的這個機率呢,
link |
18:45.000
是 pi 3,
link |
18:46.000
那第四個 class,
link |
18:47.000
是 gi 這個分布裡面
link |
18:50.000
最大的一個 class,
link |
18:52.000
它的機率會是 pi 4,
link |
18:53.000
所以呢,
link |
18:54.000
做這件事情啊,
link |
18:55.000
就是這個整個過程
link |
18:56.000
得到這個東西叫 gampil-softmax,
link |
18:58.000
因為 gampil-softmax 的這個分布啊,
link |
19:01.000
它其實會跟這個,
link |
19:02.000
你原本要 sample 這個東西
link |
19:04.000
同分布的,
link |
19:05.000
所以這個地方
link |
19:07.000
好像就已經解決說
link |
19:08.000
我們要做 sampling 的這個過程,
link |
19:10.000
因為我們已經找到一個
link |
19:12.000
這個分布,
link |
19:14.000
是我們可以不用做這個 sampling,
link |
19:17.000
但它可以跟我們有做 sampling
link |
19:19.000
達到同樣的效果。
link |
19:21.000
好,來,那個宇翔舉手了。
link |
19:25.000
不好意思,
link |
19:26.000
我有點聽不太懂,
link |
19:27.000
就是那為什麼我不直接
link |
19:29.000
對原本的機率
link |
19:30.000
做 argmax 就好了?
link |
19:32.000
對原本的機率做 argmax,
link |
19:35.000
它得到的這個 distribution
link |
19:38.000
永遠就是同一個,
link |
19:41.000
它就不會有 sample 的功能。
link |
19:43.000
然後我猜宇翔想要問的是,
link |
19:48.000
為什麼這裡 sampling 這件事這麼重要?
link |
19:51.000
為什麼不能做 argmax 呢?
link |
19:53.000
做 argmax 到底會有什麼問題?
link |
19:57.000
對。
link |
20:00.000
我覺得做 argmax 這邊會有的問題就是,
link |
20:03.000
假設我們做 argmax,
link |
20:05.000
那你會發現啊,
link |
20:06.000
如果你要計算 autoencoder 裡面的參數
link |
20:09.000
對最終結果的為分,
link |
20:11.000
你算出來會幾乎都是零,
link |
20:14.000
為什麼?
link |
20:15.000
因為當你 autoencoder 參數
link |
20:17.000
變的時候,
link |
20:19.000
pi 那個 distribution 稍微變了一下,
link |
20:22.000
但是最大的那個東西,
link |
20:25.000
最大的機率的那個 token,
link |
20:28.000
還是最大的機率,
link |
20:29.000
所以你做 argmax 以後,
link |
20:31.000
丟到接下來的 classifier 裡面啊,
link |
20:34.000
丟進去給 classifier 的東西
link |
20:36.000
是一模一樣的,
link |
20:37.000
所以最終你的整個 model,
link |
20:39.000
包括那個 classifier 的部分,
link |
20:41.000
最終的輸出會是固定的,
link |
20:43.000
就會變成說 autoencoder 參數有變,
link |
20:46.000
但是最後你的 loss 是完全沒有變的,
link |
20:49.000
所以根本就算不出那個 gradient,
link |
20:52.000
所以 gradient 算出來都是零。
link |
20:56.000
我這樣回答到宇翔的問題嗎?
link |
20:59.000
我覺得我好像要再想一下,
link |
21:01.000
但我好像,
link |
21:02.000
我再想一下好了,
link |
21:03.000
我待會有問題再問老師跟助教。
link |
21:07.000
誒,陳漢哥我這樣講,
link |
21:08.000
你覺得 ok 嗎?
link |
21:10.000
我覺得,
link |
21:11.000
好像還蠻合理的,
link |
21:13.000
好像還蠻合理的,
link |
21:15.000
對,
link |
21:16.000
我一直沒有很好的解釋,
link |
21:17.000
我覺得老師的解釋還蠻不錯的。
link |
21:21.000
好,那大家先想一下,
link |
21:23.000
那我們就先繼續吧。
link |
21:25.000
好,那我們就繼續講。
link |
21:28.000
那,
link |
21:29.000
這個,
link |
21:30.000
但是這邊還沒有解決那個問題啊,
link |
21:32.000
因為你不管這邊是取 sample 還是取 argmax,
link |
21:34.000
就是,
link |
21:35.000
這件事情不是不能回分的,
link |
21:37.000
就是,就算你這邊用了 compare solve max,
link |
21:39.000
這個 argmax,
link |
21:40.000
他也是不能回分的,
link |
21:41.000
所以你現在還是有一個,
link |
21:43.000
這個不能回分的問題啊,
link |
21:44.000
但這個問題呢,
link |
21:46.000
稍微比較好解釋,
link |
21:47.000
因為我們有一個方法可以讓,
link |
21:49.000
就是我們有一個方法可以,
link |
21:53.000
做到一個跟 argmax 很像的事情,
link |
21:55.000
就是我們要從這個 g i,
link |
21:57.000
變成這個 distribution,
link |
21:58.000
我們可以不用做 argmax,
link |
21:59.000
但是做到跟 argmax 很像的事情,
link |
22:01.000
那這個事情呢,就是,
link |
22:04.000
做一個叫做 solve max,
link |
22:06.000
然後 with temperature scaling,
link |
22:07.000
那 solve max 大家都很熟嘛,
link |
22:09.000
就是你,
link |
22:10.000
把所有的這個 distribution 每個元素,
link |
22:12.000
然後取一個 exponential 之後,
link |
22:15.000
做一個 normalization,
link |
22:19.000
那這邊跟一般的 solve max 不一樣的,
link |
22:21.000
就是他在取這個 exponential 的時候,
link |
22:23.000
他會先把原本的這個 g i,
link |
22:25.000
除以一個 T,
link |
22:26.000
這個除以一個 temperature,
link |
22:28.000
那只要你的 T 這個 temperature,
link |
22:30.000
T 我們叫 temperature,
link |
22:31.000
只要你 T 選的恰當的話,
link |
22:33.000
就可以讓你最後,
link |
22:34.000
output 出來的這個 distribution y,
link |
22:36.000
長得非常非常像是 one hard vector,
link |
22:40.000
那只要做到這件事情呢,
link |
22:44.000
我們就可以把原本,
link |
22:45.000
不能這個微分的這個,
link |
22:48.000
這個 sampling 過程,
link |
22:50.000
替換成一個可以微分的,
link |
22:51.000
這個 convert all solve max,
link |
22:53.000
然後 with temperature scaling,
link |
22:55.000
那我們來看一下,
link |
22:56.000
這個 T 你要怎麼選,
link |
22:58.000
這個其實還蠻直覺的,
link |
23:00.000
就是當你的 T 非常非常大的時候,
link |
23:02.000
假設我們 T 趨近無限大,
link |
23:03.000
那當 T 趨近無限大的時候,
link |
23:05.000
不管你 g i 是多少,
link |
23:06.000
每個都除以一個無限大的數字,
link |
23:08.000
他每個都看起來像是零,
link |
23:09.000
所以同樣 0 四方都是 1,
link |
23:11.000
所以他幾乎是一個,
link |
23:13.000
這個 uniform distribution,
link |
23:15.000
那如果你 T 取得非常非常小的話,
link |
23:18.000
那他對於那個區域裡面,
link |
23:23.000
最大的那個 class,
link |
23:25.000
他的機率就會看起來是,
link |
23:27.000
他就會比其他的 class 還要大非常非常多,
link |
23:30.000
所以對於那個區域裡面,
link |
23:32.000
最大的那個 class,
link |
23:33.000
他的 output 出來的機率,
link |
23:36.000
會非常非常接近 1,
link |
23:37.000
然後其他會非常非常接近 1,
link |
23:39.000
所以說呢,
link |
23:40.000
我們要讓這個 g i output 出來的東西,
link |
23:44.000
經過 softmax,
link |
23:45.000
temperature scaling,
link |
23:46.000
跟 argmax 的結果很像,
link |
23:48.000
那我們要做的事情就是,
link |
23:49.000
我們把 T 選得夠小就好,
link |
23:51.000
那這邊配合他做的事情是,
link |
23:53.000
他選的是 T 等於 0.1,
link |
23:56.000
所以最後的結果就是 T 選得很小,
link |
23:59.000
然後所以就可以讓,
link |
24:00.000
這邊出來的結果跟你 sampling,
link |
24:03.000
跟你做 sampling 出來的結果,
link |
24:05.000
非常非常像,
link |
24:07.000
那這樣子的話呢,
link |
24:08.000
你就可以用這個東西,
link |
24:10.000
去 backpropagate 到 autoencoder,
link |
24:14.000
autoencoder 他就可以被 update,
link |
24:16.000
那所以,
link |
24:18.000
這個實際上我們做的事情呢,
link |
24:20.000
就是 autoencoder output 出來的這個 part,
link |
24:23.000
就是 distribution,
link |
24:24.000
我們把他做一個 log transform,
link |
24:26.000
然後再加上一個,
link |
24:27.000
從 bundle 01 裡面,
link |
24:29.000
iid sample 出來的這個 noise,
link |
24:31.000
然後這個 noise 加上,
link |
24:33.000
原本經過 log transform 的 probability 之後呢,
link |
24:36.000
我們經過 softmax with temporary scaling 之後,
link |
24:39.000
就可以得到一個,
link |
24:40.000
非常接近 one-hot 的一個向量,
link |
24:45.000
也就是,
link |
24:47.000
在這個 vocabulary 上面的機率分布,
link |
24:50.000
那 i 這個 token 呢,
link |
24:53.000
他的機率就是 0.993,
link |
24:55.000
然後其他的都是非常非常接近一個數值,
link |
24:58.000
那接下來我們做的事情呢,
link |
24:59.000
就是我們就把這個機率,
link |
25:01.000
直接乘到這個 embedding table 上面,
link |
25:03.000
那我原本這個,
link |
25:05.000
原本我們如果直接取 sample softmax 的話,
link |
25:08.000
這邊會是一個 one-hot vector 嘛,
link |
25:11.000
就是如果以這個為例的話,
link |
25:13.000
他應該會是一個 0 0 1,
link |
25:15.000
然後剩下都是 0 的這個 one-hot vector,
link |
25:17.000
所以當你直接乘以這個 embedding table 之後呢,
link |
25:19.000
就會等於是你在這個 embedding table 做 logout,
link |
25:22.000
然後你選出來的是第三個,
link |
25:26.000
這個第三個字的 word embedding,
link |
25:29.000
那因為我們現在這邊,
link |
25:31.000
他不完全是一個 one-hot vector,
link |
25:32.000
他其實是一個很接近 one-hot vector,
link |
25:34.000
但是他並不是 one-hot vector 的一個向量,
link |
25:37.000
所以呢,他最後包覆出來的這個 word embedding,
link |
25:40.000
他不完全是裡面最大的這個東西的 word embedding,
link |
25:43.000
他會摻雜一些其他字的 word embedding,
link |
25:45.000
不過這個比例應該非常非常小,
link |
25:49.000
所以用了這個方法之後呢,
link |
25:52.000
我們就可以成功地做 backward regression,
link |
25:55.000
我們就可以成功地訓練這個 generator.
link |
25:59.000
好,所以呢,我們實際上做的事情啊,
link |
26:02.000
就是 autoencoder,
link |
26:04.000
包覆出來的東西我們要用
link |
26:06.000
Gambel softmax 來取,
link |
26:08.000
那 Gambel softmax 取到的 output,
link |
26:12.000
會是一個接近 one-hot,
link |
26:14.000
但不是 one-hot 的 vector,
link |
26:15.000
那我們把這個 one-hot vector 啊,
link |
26:17.000
乘以 embedding table,
link |
26:18.000
我們就會得到這個,
link |
26:20.000
我們要送到 classifier 裡面的這個 embedding,
link |
26:24.000
那這個 embedding 丟到 classifier 裡面呢,
link |
26:27.000
我們就是用這個 embedding 來做 forward,
link |
26:32.000
然後 backward 的時候呢,
link |
26:33.000
我們就是也是一樣,
link |
26:35.000
經過這個 word embedding 做 backward,
link |
26:37.000
所以他的 gradient 就可以 backward 到
link |
26:39.000
這個 autoencoder 裡面,
link |
26:41.000
那他這樣就可以訓練了,
link |
26:43.000
所以他不會有不可為分的問題,
link |
26:46.000
那這個就是用 Gambel softmax 來解決,
link |
26:49.000
解決不能為分的問題,
link |
26:52.000
那這個做法其實還蠻常見的,
link |
26:56.000
不只是在生成,
link |
26:59.000
那很多 NLP 的任務,
link |
27:01.000
當你要生成這個,
link |
27:05.000
你要做的事情是 sequence generation,
link |
27:08.000
然後你這個 sequence generation 的 output,
link |
27:10.000
還要經過另外一個 model,
link |
27:11.000
才能得到最後的 loss 的時候,
link |
27:16.000
常常會用 Gambel softmax 的方法,
link |
27:19.000
來讓他的 gradient 可以 propagate 到
link |
27:23.000
這個 generator 上面,
link |
27:25.000
那除了這個方法之外呢,
link |
27:27.000
也有不同的方法,
link |
27:29.000
就是你也可以直接用 RL 應勸這個 generator,
link |
27:33.000
那我們下面講的,
link |
27:35.000
就是用 reinforcement learning 來訓練
link |
27:38.000
這個 generator 的方式,
link |
27:40.000
那講到這邊,
link |
27:41.000
先看一下大家對這個方法有什麼問題,
link |
27:46.000
好,大家有問題想問嗎?
link |
27:55.000
如果 Gambel softmax 那邊,
link |
27:57.000
你聽了一時覺得有點 lost,
link |
27:59.000
那也沒有關係,
link |
28:00.000
反正他就是一個,
link |
28:02.000
這個訓練時候的技巧,
link |
28:04.000
如果你發現呢,
link |
28:05.000
你的模型中間有一個區域,
link |
28:08.000
是會 output discrete 的 token,
link |
28:11.000
那你可以用 Gambel softmax,
link |
28:13.000
來讓整個 network 還是可以 end-to-end trade,
link |
28:16.000
那假設你不知道 Gambel softmax 的話,
link |
28:18.000
也沒有關係,
link |
28:19.000
反正最慘的狀況,
link |
28:20.000
你還是可以用 RL 應勸你的模型,
link |
28:23.000
但 Gambel softmax,
link |
28:24.000
可能是一個比 RL 還要簡單的做法。
link |
28:33.000
不好意思,
link |
28:35.000
又是我,
link |
28:36.000
我覺得我好像還是沒有聽得很懂,
link |
28:39.000
就是老師剛才那邊說我們,
link |
28:41.000
我這邊有兩個問題,
link |
28:43.000
第一個問題是,
link |
28:44.000
在做 auto encoder 這邊,
link |
28:46.000
為什麼需要 sampling,
link |
28:48.000
我覺得我剛才還是沒有,
link |
28:49.000
我剛才想一下,
link |
28:50.000
我覺得好像還是沒有搞得很懂,
link |
28:51.000
所以想請老師跟助教再解釋一次,
link |
28:53.000
然後第二個是,
link |
28:56.000
就是 Gambel softmax,
link |
28:58.000
我可以這麼說嗎,
link |
28:59.000
就是如果是在模型中有這種,
link |
29:01.000
需要 sampling 這種,
link |
29:02.000
是 discrete 的行為的時候,
link |
29:04.000
可以考慮 Gambel 這個技巧,
link |
29:13.000
第二個問題是,
link |
29:19.000
第一個問題,
link |
29:21.000
我等下下課的時候想一下,
link |
29:23.000
我再回應你好不好,
link |
29:24.000
因為我現在可能沒有很好的答案,
link |
29:26.000
沒有關係,
link |
29:27.000
我也沒有很好的答案,
link |
29:28.000
謝謝助教,
link |
29:29.000
那我等下下課的時候想一下,
link |
29:31.000
好,謝謝,
link |
29:33.000
那如果沒有其他問題的話,
link |
29:34.000
我就先繼續講,
link |
29:36.000
好,那,
link |
29:39.000
好,然後再來要講,
link |
29:41.000
這個用 RL 生,
link |
29:42.000
生這個 adversarial sample 的方式,
link |
29:45.000
那想法跟剛才差不多,
link |
29:48.000
就是我要訓練一個 generator,
link |
29:49.000
然後這個 generator 做的事情,
link |
29:50.000
就是他要生一個 adversarial sample,
link |
29:53.000
那這個 generator 的目標呢,
link |
29:56.000
就是他要生出來的這個 adversarial sample,
link |
30:00.000
他可以成功的讓 classifier 他的 output 爛掉,
link |
30:06.000
所以原本這個 I highly recommend it,
link |
30:08.000
丟到 classifier 裡面,
link |
30:09.000
他應該會 output 出來的這個,
link |
30:12.000
他應該是 positive 的,
link |
30:14.000
但是你經過 generator 的 calculation 之後呢,
link |
30:17.000
他 output 出來的這個 positive 的機率呢,
link |
30:21.000
就下降到 0.48,
link |
30:23.000
那這個 generator 的目標,
link |
30:24.000
就是要讓這個東西越低越好,
link |
30:27.000
那當你要訓練這個,
link |
30:30.000
我們先講一下 generator 做的事情是什麼,
link |
30:33.000
那 generator 他做的事情啊,
link |
30:35.000
就是他這邊用的,
link |
30:37.000
這是另外一篇 paper,
link |
30:39.000
那這篇 paper 他在做的事情,
link |
30:41.000
他不是實際上去生一個 sequence,
link |
30:44.000
他做的事情呢,
link |
30:45.000
比較像是一個 sequence tagging test,
link |
30:47.000
就是他們對於 input 的每個字,
link |
30:49.000
他要決定他要做什麼樣的 action,
link |
30:52.000
那他的 action 呢,
link |
30:53.000
包含了這個五個不同的 action,
link |
30:56.000
那 0 這個 action 就代表說,
link |
30:58.000
我對這個 token 什麼事都不要做,
link |
31:00.000
那 1 這個 action 呢,
link |
31:03.000
代表說我要 replace 一個 super word,
link |
31:06.000
那這個,他的 action 呢,
link |
31:08.000
是替換的方式是從 wordnet 裡面,
link |
31:11.000
找一些跟他相關的字去做一些替換,
link |
31:15.000
那所謂的 super word,
link |
31:16.000
就是這個 super word,
link |
31:21.000
super word 我有點不太知道他的意思是什麼,
link |
31:24.000
然後他舉的例子是這樣,
link |
31:26.000
但我不確定 super word 的意思是什麼,
link |
31:28.000
是例子說什麼漢堡是一種三明治之類的,
link |
31:31.000
還是怎樣?
link |
31:32.000
可是我覺得感覺比較像是 subordinate word,
link |
31:35.000
就是,我知道了,
link |
31:37.000
好像,我忘記了,
link |
31:41.000
好像是,那可能是,
link |
31:43.000
一個是一個的,
link |
31:45.000
就是,對,漢堡是一種三明治,
link |
31:48.000
然後這個是,鮭魚是一種魚,
link |
31:51.000
對對對,
link |
31:52.000
ok ok,
link |
31:54.000
這兩個是相反的,
link |
31:56.000
然後另外也有一個 action 是
link |
31:59.000
他要 replace with 這個同義詞,
link |
32:01.000
然後第四個 action 是
link |
32:02.000
你要 replace with 一個 neighbor word,
link |
32:04.000
就是 wordnet 裡面有定義一些 neighbor word
link |
32:07.000
就是跟他相似,
link |
32:09.000
但是不是,不算是同義詞的那些字,
link |
32:12.000
就像 elsa 跟 donkey 這樣子,
link |
32:13.000
那以這個,原本這個,
link |
32:15.000
這邊這個例子為例的話呢,
link |
32:16.000
他就是,
link |
32:18.000
原本,這個 I highly recommend it,
link |
32:22.000
然後丟到 generator 裡面,
link |
32:24.000
那他對於這個句子的每一個 token,
link |
32:27.000
他決定要做的 action 就是
link |
32:28.000
第一個 token 不做任何事情,
link |
32:30.000
第二個 token 呢,
link |
32:31.000
他把它換成一個同義詞,
link |
32:33.000
就換成ordinate,
link |
32:35.000
那這個同義詞要怎麼換,
link |
32:36.000
就是你去這個 wordnet 裡面
link |
32:38.000
找一個同義詞,
link |
32:39.000
然後選出來換就好了,
link |
32:40.000
然後,這個,第三個字呢,
link |
32:44.000
我要把它換成一個同義詞,
link |
32:46.000
第四個字我不做任何事情,
link |
32:48.000
好,那這個一樣嘛,
link |
32:50.000
就是他這個 output 是一個
link |
32:52.000
discrete 的,
link |
32:54.000
不同 class 的一個 distribution,
link |
32:56.000
所以一樣會遇到不能為分的問題,
link |
32:58.000
那你當然也可以用港標解決啦,
link |
33:00.000
不過他這邊用的方式是
link |
33:01.000
他用 RL 直接硬 train 這個 generator,
link |
33:04.000
好,那他的做法呢,
link |
33:06.000
就是用 RL 來 train 嘛,
link |
33:08.000
那你在 train 一個,
link |
33:09.000
你要 reinforcement learning 來訓練的時候,
link |
33:12.000
你要去定義他的 reward 是什麼,
link |
33:15.000
才能訓練他,
link |
33:16.000
那他這邊定義的 reward 方式很簡單,
link |
33:18.000
他就是定義說,
link |
33:21.000
這個 reward 定義就是,
link |
33:23.000
這個原本的 ground truth 的
link |
33:26.000
變化量的負值,
link |
33:28.000
所以原本的 ground truth 是 1.0 嘛,
link |
33:31.000
然後他變成 0.48,
link |
33:32.000
所以就是 0.48 減掉 1.0,
link |
33:35.000
然後再取負號,
link |
33:36.000
就是他的這個 reward,
link |
33:38.000
所以我們就拿這個當成 reward,
link |
33:40.000
然後來訓練這個 generator,
link |
33:41.000
然後他用的是最簡單的
link |
33:42.000
那個 policy gradient,
link |
33:43.000
然後 with baseline,
link |
33:45.000
如果不知道 policy gradient 是什麼,
link |
33:47.000
應該也沒關係,
link |
33:48.000
反正他就是一個
link |
33:49.000
最養生的 reinforcement learning 的方式,
link |
33:53.000
好,那他就直接硬 train 這個 generator,
link |
33:57.000
好,那這個方法其實就這樣子,
link |
34:00.000
還蠻簡單的,
link |
34:04.000
好,那這個方法有人有問題嗎?
link |
34:13.000
好,大家有問題嗎?
link |
34:18.000
好,那如果沒有,我們就繼續吧!
link |
34:20.000
好,那 Edward 怎麼不講,
link |
34:23.000
有點瑣碎,
link |
34:26.000
那我們直接講 defense,
link |
34:28.000
直接講 defense 就好。
link |
34:30.000
好,那我們這個講完,
link |
34:32.000
怎麼去產生一個 adversarial sample 的
link |
34:35.000
很多不同的方法,
link |
34:38.000
那接下來我們要問的就是
link |
34:40.000
我們要怎麼去對抗這些惡意的攻擊,
link |
34:45.000
那對抗惡意的攻擊
link |
34:46.000
大概可以把它分成兩類型,
link |
34:49.000
第一種類型就是
link |
34:50.000
你就想辦法訓練一個
link |
34:52.000
比較強健的模型,
link |
34:55.000
那讓他可以抵禦這些攻擊,
link |
34:58.000
那另外一種方法就是
link |
35:00.000
你不特別在訓練的時候
link |
35:02.000
對模型做任何事情,
link |
35:03.000
但是你讓他在 testing
link |
35:05.000
或是說 inference 的時候呢,
link |
35:07.000
他要有能力去偵測說
link |
35:08.000
現在的 input 是不是 adversarial sample,
link |
35:11.000
那我們就把它分為這兩類來講,
link |
35:13.000
我們先看第一類,
link |
35:14.000
我們要怎麼去訓練一個
link |
35:16.000
比較強健的模型,
link |
35:18.000
那這個方法其實跟
link |
35:23.000
一般我們在 CD 上面
link |
35:25.000
或是 audio 上用的其實都差不多,
link |
35:27.000
那最簡單的方法當然就是
link |
35:29.000
adversarial training,
link |
35:30.000
那所謂的 adversarial training 呢,
link |
35:32.000
就是你在訓練的過程中
link |
35:35.000
一直用現在的模型去做 test,
link |
35:38.000
然後生出來的 adversarial sample
link |
35:40.000
再加到 training data 裡面,
link |
35:42.000
那也就是說
link |
35:43.000
一開始會有一些不耐,
link |
35:45.000
不耐就是良性,
link |
35:46.000
就是不是 adversarial 的 training data,
link |
35:48.000
那你就拿這些 training data 呢,
link |
35:50.000
先去訓練一個 classifier,
link |
35:52.000
然後訓練好之後呢,
link |
35:53.000
你就拿這個 training data 裡面的
link |
35:58.000
某些東西呢,
link |
35:59.000
去 attack 這個模型,
link |
36:02.000
然後 attack 出來的結果呢,
link |
36:04.000
你會得到一些 adversarial training data,
link |
36:07.000
那你再用這整個
link |
36:08.000
這個 benign 加上 adversarial training data
link |
36:10.000
的這個 combination,
link |
36:12.000
然後去訓練一個新的 test classifier,
link |
36:14.000
然後訓練出來之後呢,
link |
36:16.000
你再拿這個原本的 benign training data
link |
36:20.000
去 attack 這個新的 test classifier,
link |
36:23.000
然後你就會得到
link |
36:26.000
這個新一代的 adversarial training data,
link |
36:29.000
然後這些 adversarial training data
link |
36:30.000
再跟原本的 benign training data
link |
36:32.000
加在一起訓練另外一個新的
link |
36:34.000
更新的 test classifier,
link |
36:36.000
然後就一直做一直做一直做,
link |
36:38.000
然後你之後就可以得到一個
link |
36:40.000
比較 robust 的 test classifier,
link |
36:42.000
那這個方法呢,
link |
36:44.000
在 NLP 裡面最大的問題是
link |
36:46.000
就是在 NLP 裡面
link |
36:47.000
你要跑這個 attack algorithm
link |
36:49.000
其實非常非常花時間,
link |
36:51.000
舉例而言,
link |
36:52.000
這個 agnews 這個 dataset,
link |
36:54.000
如果你要
link |
36:56.000
光是要這個跑 testing data 裡面的
link |
36:59.000
attack 用 text folder,
link |
37:01.000
然後我們要使用 v100 跑
link |
37:03.000
就大概跑了十五個小時,
link |
37:05.000
那如果你只是要
link |
37:06.000
train 在這個 benign training data 裡面
link |
37:08.000
train 十個 epoch,
link |
37:09.000
用 v100 跑,
link |
37:10.000
你只要跑十分鐘就好了,
link |
37:12.000
所以等於是
link |
37:13.000
這個一個 epoch 大概是一分鐘啦,
link |
37:16.000
然後你這個跑完一個 epoch 之後
link |
37:18.000
attack 部分的
link |
37:20.000
這個 data 你就要 attack 十五個小時,
link |
37:23.000
然後再跑一分鐘的 training,
link |
37:26.000
然後再跑十五個小時的 attack,
link |
37:28.000
那這樣其實是非常非常浪費時間的,
link |
37:31.000
那為了解決這個問題,
link |
37:34.000
也不算是解決,
link |
37:35.000
就是大家就想要
link |
37:37.000
想一些方法,
link |
37:38.000
然後可以避免掉
link |
37:41.000
實際上要做 attack 的這件事情,
link |
37:43.000
因為最花時間的就是 attack 的步驟,
link |
37:45.000
那有人就提出來一個方法,
link |
37:48.000
就是這個 cv 上面
link |
37:50.000
我們的 attack 是直接做這個
link |
37:53.000
projected gradient descent 之類的東西,
link |
37:55.000
然後找到一個 adversarial sample,
link |
37:57.000
那我們有沒有辦法在 NLP 裡面
link |
37:59.000
也是一樣就是做
link |
38:01.000
projected gradient descent,
link |
38:02.000
然後我們找到一個 adversarial sample 之後,
link |
38:06.000
那我們就直接把這個 adversarial sample
link |
38:08.000
這個拿去 train 呢?
link |
38:12.000
那其實也有人是
link |
38:14.000
真的是做這樣的事情,
link |
38:15.000
那他們做的事情是這樣,
link |
38:16.000
就是假設我有一個正常的 benign 的
link |
38:19.000
training data,
link |
38:20.000
那這個 training data 的每一個字
link |
38:22.000
他都會有他對應的 word embedding,
link |
38:24.000
那當你把這個句子
link |
38:26.000
丟到這個 test file 裡面,
link |
38:28.000
他 forward 之後會得到一個 loss,
link |
38:31.000
那你把這個 loss 做 backward 之後呢,
link |
38:35.000
那他 backward 是 backward 到哪裡?
link |
38:37.000
就是用這個 loss
link |
38:38.000
對 word embedding 的
link |
38:39.000
每一個 input 的 embedding 做為一倍,
link |
38:43.000
那我們以 recommend 這個詞為例,
link |
38:46.000
這個對他做為一倍的時候呢,
link |
38:49.000
他做的事情就是
link |
38:50.000
我們在這個 word embedding space 裡面
link |
38:53.000
這個 recommend 這個 word embedding 的
link |
38:55.000
某一個這個 epsilon ball,
link |
38:57.000
所謂的 epsilon ball
link |
38:58.000
就是半近似 epsilon 的一個球體裡面,
link |
39:02.000
我們去找某一個某一個點,
link |
39:06.000
這個 epsilon ball 的某一個點,
link |
39:08.000
然後呢,這個他的 loss 是最大的,
link |
39:16.000
就是往這個方向移的時候
link |
39:18.000
他的 loss 會增加最多,
link |
39:20.000
所以有點像是
link |
39:21.000
這個 quadratic gradient descent
link |
39:22.000
在做的事情是一樣的,
link |
39:24.000
然後呢,
link |
39:25.000
當我們找到這個 epsilon ball 裡面
link |
39:27.000
這個讓 loss 最大的一個點之後呢,
link |
39:30.000
我們就把原本的這個 word embedding
link |
39:32.000
換成我們新找到這個
link |
39:34.000
讓 loss 會是最大的 word embedding,
link |
39:37.000
然後每一個字都做一樣的事情,
link |
39:39.000
然後我們就可以找到
link |
39:40.000
他們各自對應的 word embedding,
link |
39:42.000
然後我們再拿這些 word embedding
link |
39:44.000
投入到這個 test code 裡面,
link |
39:46.000
然後會得到一個 loss,
link |
39:47.000
然後我們現在訓練的
link |
39:48.000
objective 就是我們要去 minimize,
link |
39:50.000
用這些這個 adversarial word embedding 裡面
link |
39:54.000
所得到這個 loss,
link |
39:56.000
那這件事情這個
link |
39:58.000
為什麼會是合理的呢?
link |
40:00.000
這個合理的想法就是說
link |
40:05.000
我們會覺得說
link |
40:07.000
在某一個 word 的 word embedding 附近
link |
40:09.000
應該都要是他的這個同義詞,
link |
40:13.000
所以我們
link |
40:14.000
當我們要找一個 epsilon ball 裡面
link |
40:16.000
使得他 loss 最大的一個點的時候,
link |
40:19.000
就是概念上就是我們要找
link |
40:21.000
他的同義詞裡面
link |
40:23.000
使得這個 loss 會是最大的一個
link |
40:26.000
word embedding,
link |
40:27.000
那當然你最後找到這個東西
link |
40:30.000
他可能不會真的代表一個字,
link |
40:32.000
不過很神奇的就是
link |
40:33.000
這樣的方法其實還是會有效啦,
link |
40:35.000
所以還蠻有趣的,
link |
40:39.000
那這個可能只是因為
link |
40:40.000
他的那個 loss 的 landscape
link |
40:43.000
會比較平一點,
link |
40:44.000
就是你可以讓他說,
link |
40:46.000
因為你這樣做的事情就是
link |
40:47.000
等於是要求說
link |
40:49.000
他在每個字的 epsilon ball 裡面
link |
40:52.000
他的 output 不能變化太多嘛,
link |
40:55.000
所以可能會因為這樣
link |
40:58.000
讓他的 generalization 能力
link |
40:59.000
變得比較好,
link |
41:00.000
所以他不會因為你把
link |
41:02.000
每個字換掉之後,
link |
41:04.000
他的 output 就直接爛掉。
link |
41:06.000
好,那這個是
link |
41:09.000
這個 word label 的
link |
41:11.000
word embedding space 裡面的
link |
41:13.000
electrical encoding,
link |
41:14.000
所以這個方法跟剛剛這個
link |
41:16.000
剛剛上一頁講到
link |
41:18.000
那個 electrical encoding 最大的差別就是
link |
41:20.000
我們現在只要直接做微分,
link |
41:22.000
然後找到一個
link |
41:24.000
embedding 就好了,
link |
41:25.000
我們不用直接找到一個
link |
41:27.000
實際上的這個 token
link |
41:31.000
來做 adversarial training,
link |
41:32.000
那這樣效率上會比較好一點。
link |
41:35.000
好,那接下來我們來看一個
link |
41:39.000
這個另外一個
link |
41:41.000
一樣也是 adversarial training 的
link |
41:43.000
defense 的方法,
link |
41:45.000
那他要解決的就是
link |
41:47.000
這個,你用 epsilon ball
link |
41:50.000
來做這個
link |
41:52.000
就是你要選
link |
41:54.000
epsilon ball 裡面的某一個字
link |
41:56.000
當作是你的 adversarial sample,
link |
41:59.000
那最後有一個問題就是
link |
42:01.000
你這個 epsilon ball 的這個半徑
link |
42:03.000
你要是選得不好的話,
link |
42:05.000
你要是選得太小,
link |
42:06.000
假設這個是你原本的字,
link |
42:07.000
這紅色四個點是他的同義詞,
link |
42:10.000
那你要是選得太小呢,
link |
42:11.000
他有可能他的同義詞就
link |
42:13.000
沒有被包進去,
link |
42:14.000
那你要是選得太大呢,
link |
42:16.000
他可能有一些
link |
42:17.000
不應該包進去的東西
link |
42:18.000
也會包進去的,
link |
42:20.000
所以這是用這個
link |
42:22.000
epsilon ball 他會有的問題,
link |
42:25.000
那假設你用這個
link |
42:27.000
hyper-rectangle 就是高維空間中的
link |
42:29.000
長方體,
link |
42:31.000
假設這邊有四個
link |
42:33.000
四個同義詞,
link |
42:36.000
那他們的 word embed 你就取
link |
42:38.000
每個維度的最小值跟最大值
link |
42:40.000
就可以找到一個長方體
link |
42:41.000
把它包起來,
link |
42:43.000
那這個長方體包起來的空間
link |
42:44.000
其實他有一些空間並不是
link |
42:46.000
並不是他這個同義詞所
link |
42:49.000
構成的空間,
link |
42:51.000
他同義詞構成的最小的空間
link |
42:53.000
就是這邊這個
link |
42:55.000
灰色虛線所顯示的一個
link |
42:57.000
四方形,
link |
42:59.000
所以在這個
link |
43:00.000
我現在游標詞的這個地方
link |
43:01.000
他其實並不是由他的同義詞
link |
43:03.000
所填滿的空間,
link |
43:07.000
所以這個空間裡面
link |
43:09.000
如果你找這裡面的
link |
43:11.000
某個東西,
link |
43:12.000
當作 adversarial symbol,
link |
43:13.000
可能並不是太合理,
link |
43:14.000
所以我們理想上
link |
43:15.000
我們應該是要找一個
link |
43:17.000
由這些同義詞
link |
43:22.000
所形成的最小的一個
link |
43:26.000
突集合,convex set,
link |
43:28.000
那為什麼要選convex set呢?
link |
43:32.000
有兩個原因,
link |
43:33.000
一個原因是因為
link |
43:34.000
convex set會比較好找
link |
43:36.000
這個裡面的
link |
43:40.000
convex set會比較好找
link |
43:43.000
裡面的某一個
link |
43:46.000
word embedding,
link |
43:49.000
等一下,最後我重講一次,
link |
43:51.000
所以我們現在要做的事情
link |
43:52.000
是我們要在某一個空間裡面
link |
43:54.000
找一個adversarial symbol,
link |
43:55.000
那當我們這個空間是convex set的話,
link |
43:58.000
這個adversarial symbol
link |
43:59.000
就是這個symbol會比較好找,
link |
44:01.000
那所以我們就去找這個
link |
44:05.000
embedding,
link |
44:07.000
同義詞的embedding
link |
44:08.000
所形成的這個convex top,
link |
44:10.000
那所謂的convex top就是
link |
44:12.000
由這些這個點
link |
44:16.000
所形成的最小的convex set,
link |
44:20.000
叫做convex top,
link |
44:23.000
好,那這個template
link |
44:27.000
叫做adversarial sparse
link |
44:28.000
convex combination,
link |
44:29.000
那它做的事情就是
link |
44:30.000
我們現在要在這個convex top裡面
link |
44:32.000
找一個adversarial symbol,
link |
44:34.000
然後這個adversarial symbol
link |
44:36.000
可以使得這個
link |
44:39.000
loss被maximize,
link |
44:41.000
那我們就把這個
link |
44:42.000
找到的adversarial word embedding,
link |
44:45.000
就是在這個裡面的adversarial word embedding
link |
44:47.000
拿去當作adversarial symbol,
link |
44:51.000
然後去minimize這個loss
link |
44:53.000
來達到embedding的效果,
link |
44:55.000
那首先我們講一下
link |
44:57.000
這個convex top
link |
44:59.000
要怎麼被characterize,
link |
45:01.000
那我們就會知道說
link |
45:02.000
它要怎麼找這個adversarial symbol,
link |
45:05.000
那convex top
link |
45:06.000
就是假設說這個convex,
link |
45:08.000
我們要找說這個
link |
45:10.000
由SU1,SU2,SU3,SU4
link |
45:13.000
所形成的convex top,
link |
45:15.000
其實它有一個很簡單的表達方式,
link |
45:17.000
這個convex top
link |
45:18.000
它可以寫成是
link |
45:19.000
這四個不同點的線性組合,
link |
45:22.000
然後所以Wi就是
link |
45:25.000
這個線性組合的coefficient,
link |
45:27.000
然後線性組合就是
link |
45:29.000
我們要要求說
link |
45:32.000
這個每一個linear coefficient
link |
45:35.000
它要是
link |
45:37.000
每一個coefficient
link |
45:38.000
它要是非負的時數,
link |
45:41.000
然後這些coefficient加起來要是1,
link |
45:44.000
這就是一個convex set,
link |
45:47.000
所以我們要找的事情就是
link |
45:51.000
我們要在這個set裡面
link |
45:53.000
找一個點
link |
45:54.000
使得這個模型的loss會被maximize,
link |
45:58.000
那我們已經知道說
link |
46:00.000
我們已經知道說
link |
46:01.000
這個convex top的每一個點
link |
46:03.000
它可以被這個式子來characterize,
link |
46:06.000
就是這些同義式的embedding,
link |
46:08.000
V of S就是它的embedding名字,
link |
46:11.000
然後來characterize,
link |
46:12.000
所以我們就是要找說符合這個
link |
46:16.000
跟這個條件的這些點
link |
46:18.000
哪一個東西可以去maximize
link |
46:21.000
我們的這個loss,
link |
46:24.000
那它的constraint就是
link |
46:27.000
就是這個coefficient
link |
46:29.000
它要是非負的時數,
link |
46:33.000
然後它的和要是1,
link |
46:37.000
那這個constraint
link |
46:38.000
你要怎麼去讓它滿足呢?
link |
46:40.000
其實有一個很簡單的方法,
link |
46:41.000
就是你把你的變數
link |
46:44.000
定數是W hat,
link |
46:46.000
然後這些W hat
link |
46:49.000
你只要做subnet之後
link |
46:51.000
它就會滿足每一個W
link |
46:53.000
是一個非負的時數,
link |
46:55.000
然後它的和就是1,
link |
46:57.000
所以我們現在要做的事情
link |
47:00.000
就是我們要找一個
link |
47:02.000
given一個原本的字,
link |
47:07.000
然後given它的同義詞,
link |
47:09.000
我們就是要在這些同義詞
link |
47:11.000
所形成的convex hull裡面
link |
47:13.000
找某一個E hat of Xi,
link |
47:17.000
這個就是它的adversarial,
link |
47:19.000
這個是adversarial,
link |
47:23.000
這是convex hull裡面的某一個點,
link |
47:25.000
然後我們希望這個convex hull
link |
47:26.000
裡面的某一個點
link |
47:27.000
它是adversarial,
link |
47:28.000
所謂的adversarial就是說
link |
47:30.000
我希望把這個convex hull
link |
47:34.000
這個點丟到模型之後
link |
47:36.000
它可以maximize模型的loss,
link |
47:38.000
那我們的變數就是W hat,
link |
47:42.000
就是我們要找這個
link |
47:43.000
linear combination的coefficient,
link |
47:45.000
然後使得這個loss可以被maximize,
link |
47:48.000
那它除了要maximize這個loss,
link |
47:51.000
它還另外加了一個loss,
link |
47:54.000
那這個loss是
link |
47:55.000
它要去minimize
link |
47:57.000
這個linear coefficient的entropy,
link |
48:01.000
那所謂的minimize這個entropy
link |
48:07.000
它要做的事情就是
link |
48:08.000
我希望說這些不同的W,
link |
48:12.000
也就是這些we're embedding的weighting,
link |
48:16.000
它要越接近一個one-hot vector,
link |
48:19.000
或是它不要太平均比較好,
link |
48:21.000
我要它越不平均越好,
link |
48:23.000
那為什麼我會希望
link |
48:24.000
它越不平均越好呢?
link |
48:26.000
因為當它越不平均的時候
link |
48:28.000
它才會比較接近一個
link |
48:30.000
實際上的字的embedding,
link |
48:32.000
那這樣才會比較合理吧,
link |
48:33.000
因為我們現在實際上要做的事情
link |
48:37.000
就是我們希望它在
link |
48:38.000
面對同一詞替換攻擊的時候
link |
48:41.000
它可以能夠有有效的defense,
link |
48:44.000
因為你在做同一詞替換攻擊的時候
link |
48:45.000
你替換的一定是某一個we're embedding,
link |
48:47.000
你不會把它替換成
link |
48:49.000
convex-hot裡面的任意一個字,
link |
48:52.000
它一定是替換成某一個embedding,
link |
48:54.000
所以當你加上這個coefficient的時候
link |
48:56.000
它就會要求說
link |
48:57.000
我是有產生出來這個
link |
49:00.000
linear combination的weighting
link |
49:04.000
就是coefficient,
link |
49:05.000
它要越接近,
link |
49:06.000
要越不平均越好,
link |
49:08.000
所以它就可以比較
link |
49:10.000
靠近某一個特定的字的we're embedding,
link |
49:13.000
所以它這個
link |
49:15.000
在找這個zero sample的時候
link |
49:18.000
它的objective就是
link |
49:19.000
它要去maximize
link |
49:21.000
這個模型的loss,
link |
49:24.000
並且同時minimize這個
link |
49:26.000
線性組合的係數,
link |
49:31.000
然後它的變數是w hat,
link |
49:34.000
然後當它找到這個w hat的時候
link |
49:36.000
它就找到了這個
link |
49:38.000
可以maximize這個loss的we're embedding,
link |
49:41.000
然後它就把這個we're embedding
link |
49:43.000
丟下去模型裡面做adversarial training,
link |
49:46.000
那這個就是ASCC這個defense方式
link |
49:49.000
做的事情,
link |
49:50.000
那除了這個做adversarial training
link |
49:53.000
你也可以直接做adversarial data augmentation,
link |
49:56.000
那adversarial data augmentation
link |
49:58.000
它跟這個
link |
50:00.000
好,那個宇翔有舉手了
link |
50:03.000
宇翔
link |
50:05.000
主教不好意思打斷
link |
50:07.000
我有個問題
link |
50:09.000
有個問題想請教
link |
50:10.000
就是你剛剛說這四個點
link |
50:13.000
就是great, terrific, fantastic, amazing
link |
50:17.000
這四個點是怎麼找的
link |
50:18.000
是用word net找的嗎
link |
50:20.000
還是怎樣
link |
50:21.000
對,就是你會先有一個predefined的
link |
50:24.000
同義詞的set
link |
50:26.000
然後這個
link |
50:29.000
我剛剛前面在講說
link |
50:31.000
球跟正方形的問題那邊
link |
50:34.000
我好像沒有聽得很懂
link |
50:37.000
那球跟正方形的問題是什麼
link |
50:40.000
球的問題就是
link |
50:44.000
球的問題是說你會不知道說
link |
50:47.000
球的問題是這樣
link |
50:48.000
就是假設你已經知道有這四個
link |
50:51.000
這四個
link |
50:53.000
我重新講一次
link |
50:55.000
假設你不知道它這四個字的
link |
51:00.000
word
link |
51:01.000
你不知道它的同義詞是什麼
link |
51:02.000
那你要直接設一個
link |
51:05.000
半徑
link |
51:06.000
那你不能保證說這個半徑
link |
51:07.000
一定會包含你所有的同義詞
link |
51:09.000
那它有可能不包含
link |
51:12.000
假設以這個圖上的例子而言
link |
51:15.000
它就是沒有包含到這個同義詞
link |
51:17.000
那當你拿這個東西去
link |
51:19.000
attack這個模型的時候
link |
51:20.000
這個模型還是會爛掉
link |
51:21.000
那當你用一個
link |
51:23.000
假設你知道這幾個
link |
51:25.000
同義詞是這樣
link |
51:26.000
那所以你就說
link |
51:27.000
好,那我就選最大的這個半徑
link |
51:28.000
那你選最大的半徑的時候
link |
51:30.000
它裡面就會有
link |
51:31.000
這個input and output裡面
link |
51:33.000
它就會包含某些其他不是同義詞的字
link |
51:35.000
那但是當你
link |
51:37.000
把這個半徑設那麼大的時候
link |
51:39.000
對這些不是同義詞的字
link |
51:42.000
你把它計算進去的時候
link |
51:43.000
它也會要求說模型的output
link |
51:45.000
要是正確的
link |
51:46.000
那這個是不合理的
link |
51:47.000
所以這個是用這個
link |
51:49.000
input and output的問題
link |
51:50.000
那用這個rectangle
link |
51:52.000
跟那個半徑太大的input and output的問題是一樣的
link |
51:56.000
就是這個rectangle
link |
51:58.000
它一定會是比原本這個convex set還要大
link |
52:01.000
所以它裡面就會包含到一些
link |
52:03.000
不應該被包含到的字
link |
52:04.000
所以當你把這個
link |
52:07.000
當你把原本正常的句子裡面
link |
52:10.000
換成這些
link |
52:12.000
不應該被視為同義詞的字的時候
link |
52:15.000
模型也會把它當成是一個同義詞
link |
52:17.000
來判斷
link |
52:18.000
那這樣是有問題的
link |
52:20.000
這樣回答到你的問題嗎?
link |
52:21.000
有有有
link |
52:22.000
那我想再接續問一個問題
link |
52:25.000
就是那這個convex hole
link |
52:27.000
就是他們怎麼
link |
52:28.000
因為他們都一直強調這個convex hole
link |
52:30.000
這個convex的性質
link |
52:32.000
但是我其實
link |
52:33.000
因為其實說在embedded space到底長怎樣
link |
52:35.000
我相信應該沒有人是真的有概念
link |
52:37.000
那他們是怎麼去控制說這個
link |
52:39.000
他們找出來的這個
link |
52:41.000
hole它確實是convex的嗎?
link |
52:43.000
其實convex這件事情他們都沒有控制
link |
52:45.000
就只是找了四個同義詞
link |
52:47.000
然後去做限定組合
link |
52:48.000
就是這樣
link |
52:49.000
就是這個東西會保證
link |
52:52.000
就是這個convex hole就是
link |
52:54.000
convex hole就是一個
link |
52:56.000
我想一下
link |
52:58.000
convex hole它by definition
link |
52:59.000
它就一定是convex
link |
53:00.000
所以就是當你用這個東西
link |
53:02.000
去characterize它的時候
link |
53:04.000
這個東西形成的結合
link |
53:06.000
它就一定是一個convex
link |
53:07.000
ok ok 我了解
link |
53:09.000
謝謝 謝謝主管
link |
53:13.000
link |
53:15.000
那我就繼續講
link |
53:17.000
link |
53:19.000
好 那就繼續講
link |
53:26.000
link |
53:27.000
那個adversarial data augmentation
link |
53:29.000
那adversarial data augmentation
link |
53:31.000
它做的事情也很簡單
link |
53:33.000
就是你先訓練了一個unrobust classifier
link |
53:38.000
你拿這個classifier去attack
link |
53:43.000
那attack在乾淨的data上面
link |
53:46.000
就會得到一些adversarial training data
link |
53:48.000
那拿這些adversarial training data
link |
53:50.000
再加上原本乾淨的training data之後
link |
53:53.000
訓練一個新的classifier
link |
53:56.000
然後這樣子就叫做adversarial data augmentation
link |
54:01.000
那其實這個就是
link |
54:03.000
這個就是adversarial training的
link |
54:06.000
第一個步驟而已
link |
54:08.000
那為什麼要這樣做呢
link |
54:10.000
這樣做的意義不只是說
link |
54:12.000
因為用這個adversarial training的時候
link |
54:16.000
你跑很多這個
link |
54:18.000
跑很多次attack會太浪費時間
link |
54:21.000
所以說我們才要attack一次就好了
link |
54:26.000
所以這個其實講起來蠻簡單的啦
link |
54:30.000
那這個接下來我們就看一個
link |
54:33.000
在testing的時候做的defense
link |
54:37.000
那testing的時候做的defense
link |
54:39.000
它要做的事情就是
link |
54:41.000
當它今天有一個testing data進來的時候
link |
54:44.000
那這個模型啊
link |
54:47.000
它要去判斷說今天這個input
link |
54:50.000
它是不是惡意攻擊
link |
54:54.000
那如果是惡意攻擊的話
link |
54:55.000
就要想辦法把它變成不是惡意攻擊的版本
link |
54:59.000
然後我們再對它做訓練的事情
link |
55:01.000
那如果是正常的
link |
55:03.000
當然就不應該對它做任何事情
link |
55:05.000
那我們首先介紹第一個方法
link |
55:07.000
第一個方法叫做
link |
55:09.000
discriminate probation
link |
55:11.000
那它做的事情呢
link |
55:13.000
就是它先偵測這個input是不是adversarial
link |
55:16.000
那如果是adversarial
link |
55:17.000
它就把它變成一個
link |
55:20.000
不是adversarial的版本
link |
55:22.000
所以呢當今天進來一個正常的data
link |
55:24.000
它不應該對它做任何事情
link |
55:26.000
那今天假設進來的是一個adversarial sample的時候呢
link |
55:29.000
就要把它改成一個
link |
55:33.000
不是adversarial sample的版本
link |
55:35.000
那這個方法呢
link |
55:37.000
這個disc這個module
link |
55:39.000
它有三個小的submodule
link |
55:42.000
那這三個小的submodule呢
link |
55:43.000
第一個是一個perturbation discriminator
link |
55:46.000
那這個discriminator的功能呢
link |
55:48.000
就是它要去分辨說今天的input
link |
55:51.000
有沒有被perturb過
link |
55:53.000
所以今天假設有一個input進來
link |
55:56.000
那這個它的perturbation discriminator
link |
55:59.000
它其實就是一個birth
link |
56:01.000
那這個birth呢
link |
56:02.000
它就會去抽出每一個字的contextualized embedding
link |
56:05.000
然後假設最後一層的contextualized embedding長這樣
link |
56:08.000
它就拿這些最後的contextualized embedding
link |
56:11.000
每一個token的contextualized embedding
link |
56:13.000
去做classification
link |
56:15.000
那classification的目的呢
link |
56:17.000
是要分說這個input的token
link |
56:19.000
有沒有被perturb過
link |
56:23.000
那舉例而言這個i它沒有被perturb過
link |
56:26.000
所以output就是沒有
link |
56:28.000
這個highly它也沒有被改過
link |
56:30.000
所以它output也是沒有
link |
56:31.000
那這個recommence它也已經被改過
link |
56:34.000
那模型就會說它也被改過
link |
56:37.000
那這個a也沒有被改過
link |
56:38.000
所以模型也會說它沒有被改過
link |
56:40.000
那這整個
link |
56:42.000
這個模型在做的事情
link |
56:44.000
其實就很像是
link |
56:46.000
這個electra後面那個discriminator在做的事情
link |
56:49.000
那當這個第一個presentation discriminator
link |
56:53.000
已經判斷出
link |
56:55.000
每個token有沒有被perturb過的時候
link |
56:58.000
就可以進到下一個階段
link |
57:01.000
那下一個階段就是embedding estimator
link |
57:03.000
那這個embedding estimator
link |
57:05.000
它要做的事情就是
link |
57:06.000
它要去recover那個被perturb的token
link |
57:10.000
它的for embedding
link |
57:12.000
那它的做法是這樣子的
link |
57:14.000
就是原本的那個input sequence
link |
57:17.000
假設某一個token它被perturb過
link |
57:20.000
那你就把它mask起來
link |
57:23.000
那mask起來之後
link |
57:24.000
一樣丟到一個birth initialized的模型
link |
57:28.000
那這個模型做的事情
link |
57:29.000
就是它要去估計說這個mask的token
link |
57:32.000
是一個
link |
57:35.000
是一個什麼樣的embedding
link |
57:38.000
所以它真正的embedding
link |
57:39.000
沒有被perturb過的那個版本
link |
57:41.000
應該是什麼
link |
57:42.000
然後所以它會去用一個regression head
link |
57:44.000
去估計出來這個embedding長什麼樣子
link |
57:47.000
那估計完這個embedding長什麼樣子之後
link |
57:49.000
你要實際上找到這個embedding
link |
57:51.000
對應的這個token是哪個token
link |
57:54.000
所以要進入到第三個階段
link |
57:55.000
就是token recovery
link |
57:57.000
那token recovery呢
link |
57:59.000
做的事情呢
link |
58:00.000
就是給它一個
link |
58:03.000
這個估計出來的embedding之後
link |
58:07.000
挑在一個既有的這個embedding tokens
link |
58:10.000
那這個embedding tokens裡面
link |
58:11.000
就會記錄說
link |
58:12.000
每個字它對應的embedding是什麼
link |
58:14.000
所以它其實就是一個embedding table
link |
58:16.000
然後它要去做kernel的logout
link |
58:18.000
然後找到跟這個
link |
58:20.000
這個估計出來的embedding
link |
58:22.000
最接近的一個embedding
link |
58:23.000
那假設我們找出來之後
link |
58:25.000
我們就發現說regman這個字
link |
58:26.000
跟原本估計出來的是最接近的話
link |
58:29.000
那我們就把regman這個字
link |
58:32.000
換到原本被perturb過的那個句子裡面
link |
58:37.000
那把它丟到我們原本的classifier裡面
link |
58:42.000
就做後面的事情
link |
58:45.000
所以這個disk的這個方法
link |
58:50.000
它有分為training跟testing兩階段
link |
58:53.000
training這個階段就是
link |
58:54.000
你要訓練這個perturbation discriminator
link |
58:56.000
跟embedding estimator
link |
58:58.000
那訓練的方法其實很簡單
link |
59:00.000
就是你要自己去
link |
59:01.000
construct一下一個zero sample
link |
59:03.000
你只要有zero sample的話
link |
59:04.000
你就可以去訓練這個
link |
59:06.000
perturbation discriminator跟embedding estimator
link |
59:09.000
那當你訓練完之後呢
link |
59:12.000
這個你就可以拿這兩個東西
link |
59:14.000
去實際上用
link |
59:16.000
那實際上的這個使用就是
link |
59:18.000
當先有一個attacker
link |
59:19.000
把queen的testing data
link |
59:21.000
變成一個髒的perturb testing data之後呢
link |
59:25.000
你就會先用perturbation discriminator
link |
59:27.000
去看說哪一個token有被換過
link |
59:30.000
然後再來呢
link |
59:33.000
你就會用embedding estimator去估計說
link |
59:36.000
這些被換過的東西應該要
link |
59:38.000
本來比較有可能是什麼東西的
link |
59:40.000
void embedding
link |
59:41.000
然後再經過這個embedding lookup
link |
59:44.000
或是說KMM的lookup之後呢
link |
59:47.000
你去找說
link |
59:48.000
在原本的這個token embedding course裡面
link |
59:51.000
最接近的那個void embedding是哪一個
link |
59:54.000
然後把它換回去之後
link |
59:57.000
再build out model
link |
59:58.000
做final prediction
link |
01:00:00.000
那這就是disk的整個流程
link |
01:00:02.000
那這個disk它比較大的問題
link |
01:00:04.000
當然就是你要先知道說
link |
01:00:06.000
你的adversary是什麼
link |
01:00:08.000
你才能去control對應的x2 sample
link |
01:00:10.000
不然要是這個
link |
01:00:12.000
你在這個training的時候
link |
01:00:14.000
你剛剛看過的全部都是
link |
01:00:16.000
全部都是同一時間段攻擊的話
link |
01:00:18.000
結果你testing的時候做的是
link |
01:00:21.000
去改它的inflectional motion的這個攻擊
link |
01:00:25.000
那你的模型就會
link |
01:00:27.000
你的這個disk的這個
link |
01:00:29.000
這個方法可能就會直接失敗
link |
01:00:31.000
那這個是disk的這個方法
link |
01:00:35.000
好來那個呂翔有問題要問
link |
01:00:39.000
不好意思問題真的比較多
link |
01:00:41.000
就是那個
link |
01:00:43.000
我想問一下
link |
01:00:45.000
前面那個regression hat是什麼
link |
01:00:47.000
是指說它會有一個
link |
01:00:49.000
例如說768維的regression
link |
01:00:51.000
然後讓它去固定embedding是這樣
link |
01:00:53.000
可能是一個768維
link |
01:00:55.000
轉到一個你的embedding
link |
01:00:57.000
實際的embedding的一個維度
link |
01:00:59.000
ok然後它就很簡單的
link |
01:01:01.000
就是用一個模型
link |
01:01:03.000
然後去直接呂翔刷這樣
link |
01:01:05.000
就是去做一個
link |
01:01:07.000
那因為這個東西聽起來
link |
01:01:09.000
這個做法聽起來真的跟electra非常像
link |
01:01:11.000
所以我其實還蠻好奇就是
link |
01:01:13.000
那像electra這種模型它有
link |
01:01:15.000
就是它天生的就是這種
link |
01:01:17.000
defense能力有比較強嗎
link |
01:01:19.000
因為這個做法聽起來
link |
01:01:21.000
跟electra真的非常像
link |
01:01:23.000
這個我沒有辦法回答
link |
01:01:25.000
因為它的parameter沒有寫
link |
01:01:27.000
但是我覺得
link |
01:01:29.000
electra的perturbation跟
link |
01:01:31.000
這個的perturbation
link |
01:01:33.000
有點
link |
01:01:35.000
也不能這樣講
link |
01:01:37.000
你要看你的attack的perturbation是什麼
link |
01:01:39.000
如果你的perturbation真的就是
link |
01:01:41.000
你就是用Bird MLM做perturbation的話
link |
01:01:43.000
那electra的確就跟
link |
01:01:45.000
它在做的事情是很像的
link |
01:01:47.000
如果你的perturbation是同時激光攻擊
link |
01:01:49.000
或是它是
link |
01:01:51.000
那個
link |
01:01:53.000
改inflection模型
link |
01:01:55.000
那electra可能就沒有
link |
01:01:57.000
學過說它要去判斷這些東西
link |
01:01:59.000
所以它不一定可以有好的表現
link |
01:02:01.000
ok
link |
01:02:03.000
那就是
link |
01:02:05.000
這個模型它本身的
link |
01:02:07.000
特色到底是
link |
01:02:09.000
它本身特色是reconstruct嗎
link |
01:02:11.000
還是它本身就是有標榜說
link |
01:02:13.000
它就是其實比較
link |
01:02:15.000
比較robust的
link |
01:02:17.000
就是你其實一個
link |
01:02:19.000
汙染過的資料就可以正確的判斷
link |
01:02:21.000
還是它就是必須一遍可以經過
link |
01:02:23.000
因為我剛剛想的是
link |
01:02:25.000
假如它這個做法也用的話
link |
01:02:27.000
那是不是代表說
link |
01:02:29.000
somehow它的模型應該
link |
01:02:31.000
很適應
link |
01:02:33.000
attack的動作
link |
01:02:35.000
那這樣somehow感覺
link |
01:02:37.000
不見得需要reconstruct嗎
link |
01:02:39.000
所以它強調的是
link |
01:02:41.000
它有reconstruct的設計嗎
link |
01:02:43.000
你如果沒有reconstruct的話
link |
01:02:45.000
你就沒有辦法正確判斷
link |
01:02:47.000
你如果只是偵測說
link |
01:02:49.000
它是一個attack sample
link |
01:02:51.000
link |
01:02:53.000
你當然也可以直接把它丟掉
link |
01:02:55.000
不過就是
link |
01:02:57.000
能夠正確的判斷它當然是最好
link |
01:02:59.000
所以你如果要正確判斷它
link |
01:03:01.000
你就要知道它是attack
link |
01:03:03.000
然後把它是attack的部分換成它
link |
01:03:05.000
正常的版本
link |
01:03:07.000
這樣才會有辦法正確的判斷
link |
01:03:09.000
所以它的這個方法其實比較不像是說
link |
01:03:11.000
我直接train一個很robust的模型
link |
01:03:13.000
比較像是說ok
link |
01:03:15.000
我今天不管你給我什麼sample
link |
01:03:17.000
我都可以透過reconstruct這個步驟
link |
01:03:19.000
然後把它當然是正確的
link |
01:03:21.000
然後再去
link |
01:03:23.000
再去判斷
link |
01:03:25.000
就是detection的這一類
link |
01:03:27.000
都是這樣子
link |
01:03:29.000
ok謝謝主講
link |
01:03:31.000
好我們鼓勵大家
link |
01:03:33.000
多問問題
link |
01:03:35.000
大家多發問
link |
01:03:37.000
不然我越講越快
link |
01:03:39.000
好啊
link |
01:03:41.000
那我再講
link |
01:03:43.000
下一個方法
link |
01:03:45.000
下一個方法叫做frequency guiding word substitution
link |
01:03:47.000
FGWS
link |
01:03:49.000
那它這個做法其實
link |
01:03:51.000
是建立在某一個有趣的觀察上面
link |
01:03:53.000
就是有人發現說NLP的evasion attack
link |
01:03:55.000
他們
link |
01:03:57.000
的attack方式其實就是
link |
01:03:59.000
把一些常見的字換成頻率很低的字
link |
01:04:01.000
那上一段好像有提到這件事情
link |
01:04:03.000
舉例而言
link |
01:04:05.000
這個acquired blend of fact and fiction
link |
01:04:07.000
這是SST2這個Movie Review的Dataset裡面
link |
01:04:09.000
這個選出來的一個example
link |
01:04:11.000
那你用基因演算法
link |
01:04:13.000
那個attack方式得到的
link |
01:04:15.000
這個sample是
link |
01:04:17.000
長這個樣子
link |
01:04:19.000
那他就把clever這個字改成braining
link |
01:04:21.000
braining這個字我好像
link |
01:04:23.000
從來都沒有聽過幾次
link |
01:04:25.000
然後上面的這個數字代表
link |
01:04:27.000
他在training data裡面的
link |
01:04:29.000
log frequency
link |
01:04:31.000
frequency然後再取log之後的
link |
01:04:33.000
數字
link |
01:04:35.000
那FGWS這個方法
link |
01:04:37.000
上一段有講過
link |
01:04:39.000
它應該是用
link |
01:04:41.000
對它是用bird MLM來做的
link |
01:04:43.000
link |
01:04:45.000
好像不是MML
link |
01:04:47.000
好像是沒有mask的MML
link |
01:04:49.000
的這個reconstruction
link |
01:04:51.000
那他就把clever換成
link |
01:04:53.000
這個我不會唸的字
link |
01:04:55.000
然後blame換成blending
link |
01:04:57.000
然後fiction換成fabrication
link |
01:05:01.000
然後這個blending呢
link |
01:05:03.000
跟fabrication這兩次呢
link |
01:05:05.000
在training data裡面都只有出現一次
link |
01:05:07.000
所以他把一個頻率很高的字
link |
01:05:09.000
換成頻率很低的字
link |
01:05:11.000
這件事情呢這個artifact
link |
01:05:13.000
就是可以幫助我們來判斷說
link |
01:05:15.000
你的input有沒有被recept過
link |
01:05:17.000
你就去看他有沒有一些
link |
01:05:19.000
頻率很低的字
link |
01:05:21.000
就可以知道他有沒有被recept過
link |
01:05:23.000
所以FGWS這個方法呢
link |
01:05:25.000
他做的事情呢第一個步驟就是
link |
01:05:27.000
他去找那些字頻率過低的
link |
01:05:29.000
他就要想辦法處理那些字
link |
01:05:31.000
所以當今天有一個句子
link |
01:05:33.000
進來的時候呢
link |
01:05:35.000
我們就去看每一個字
link |
01:05:37.000
他在training data裡面的頻率
link |
01:05:39.000
之後的數值
link |
01:05:41.000
那假設這個input這個句子啊
link |
01:05:43.000
我們去算他的log occurrence
link |
01:05:45.000
之後得到這個是13
link |
01:05:47.000
這個是0 這個是7.1 這個是12.1
link |
01:05:49.000
之類的
link |
01:05:51.000
那我們要去設一個threshold就是說
link |
01:05:53.000
低於某一個threshold的
link |
01:05:55.000
log frequency
link |
01:05:57.000
我就要把它當作是一個
link |
01:05:59.000
可疑的字
link |
01:06:01.000
舉例而言假設我定的這個threshold是
link |
01:06:03.000
delta等於4
link |
01:06:05.000
當這個training data的log occurrence
link |
01:06:07.000
小於這個delta之後呢
link |
01:06:09.000
我們就要把它當成是一個可疑的字
link |
01:06:11.000
這裡面最可疑的字就是
link |
01:06:13.000
emodern而已 因為他在training data裡面
link |
01:06:15.000
只有出現一次而已
link |
01:06:17.000
當我們知道這件事情之後呢
link |
01:06:19.000
我們就要想辦法去
link |
01:06:21.000
這個
link |
01:06:23.000
處理掉這個字嘛
link |
01:06:25.000
那我們要怎麼處理呢
link |
01:06:27.000
就是我們要把這個
link |
01:06:29.000
input裡面所有被我們覺得
link |
01:06:31.000
可疑的字呢 都把它換掉
link |
01:06:33.000
換成什麼東西呢 就把它換成
link |
01:06:35.000
它的高頻率的同義詞
link |
01:06:37.000
所以你會有一個
link |
01:06:39.000
這個list
link |
01:06:41.000
這個list會告訴你說
link |
01:06:43.000
emodern這個字呢 它其實跟
link |
01:06:45.000
highly,extremely,strongly這三個字
link |
01:06:47.000
是同義詞 不過呢
link |
01:06:49.000
這三個字呢 在training data裡面的
link |
01:06:51.000
occurrence,log occurrence分別是7.4
link |
01:06:53.000
9.2跟8.2
link |
01:06:55.000
那所以很明顯9.2這個是最高的嘛
link |
01:06:57.000
你就要把emodern這個字
link |
01:06:59.000
換成extremely 選擇得到一個
link |
01:07:01.000
highly,extremely recommended這個句子
link |
01:07:03.000
好 那我們最後來判斷說
link |
01:07:05.000
這個句子是不是
link |
01:07:07.000
adversarial 那我們要怎麼判斷呢
link |
01:07:09.000
那我們做的事情是這樣子
link |
01:07:11.000
我們就把這兩個句子呢
link |
01:07:13.000
分別丟到原本
link |
01:07:15.000
這個test classifier裡面
link |
01:07:17.000
那這個test classifier就會output出
link |
01:07:19.000
這個
link |
01:07:21.000
這個機率分布嘛 那我們就看說
link |
01:07:23.000
它原本這個
link |
01:07:25.000
inordinately recommended
link |
01:07:27.000
對於這個模型來說
link |
01:07:29.000
它output出來 它覺得最有可能的這個class
link |
01:07:31.000
是negative 它機率有0.76
link |
01:07:33.000
那當我們把它換掉之後呢
link |
01:07:35.000
它negative這個class的機率
link |
01:07:37.000
變成0.01
link |
01:07:39.000
那我們就看說呢
link |
01:07:41.000
這個原本predict
link |
01:07:43.000
這個class的機率變化是多少
link |
01:07:45.000
那這個變化是
link |
01:07:47.000
0.76
link |
01:07:49.000
乘以0.01 是0.75
link |
01:07:51.000
那我們就定義說 假設說
link |
01:07:53.000
這個機率的
link |
01:07:55.000
變化量超過某一個我們
link |
01:07:57.000
既定的這個
link |
01:07:59.000
threshold gamma的話
link |
01:08:01.000
那我們就要
link |
01:08:03.000
把它當成是一個
link |
01:08:05.000
atmospheric sample
link |
01:08:07.000
這邊應該是flag 不是flag
link |
01:08:09.000
所以因為這個gamma我們假設我們定是
link |
01:08:11.000
0.4嘛 然後這邊這個變化是
link |
01:08:13.000
0.75 所以它已經大於我們這個threshold
link |
01:08:15.000
所以我們就會把這個
link |
01:08:17.000
inordinately recommended當作是一個
link |
01:08:19.000
這個atmospheric sample
link |
01:08:21.000
那我們也已經知道說
link |
01:08:23.000
它的本來
link |
01:08:25.000
就是正常的concept class是這個
link |
01:08:27.000
所以我們就可以直接把這個東西丟到
link |
01:08:29.000
classifier裡面 它就可以正確
link |
01:08:31.000
判斷 所以前面這兩個
link |
01:08:33.000
方法就是在
link |
01:08:35.000
inference的時候對
link |
01:08:37.000
input做一些偵測的動作
link |
01:08:39.000
然後並且把atmospheric sample
link |
01:08:41.000
換成不是atmospheric sample的
link |
01:08:43.000
版本 那這樣我們就可以達到
link |
01:08:45.000
這個增加
link |
01:08:47.000
testing的時候的
link |
01:08:49.000
強健性的一些
link |
01:08:51.000
方法 那這些方法
link |
01:08:53.000
就是有一些
link |
01:08:55.000
需要的假設
link |
01:08:57.000
像disk這個方法裡面你就需要說
link |
01:08:59.000
你要知道這個atmospheric sample
link |
01:09:01.000
它應該會是長什麼樣子
link |
01:09:03.000
你才能去訓練那兩個module
link |
01:09:05.000
那在這個
link |
01:09:07.000
FGDLS的
link |
01:09:09.000
情況呢
link |
01:09:11.000
最大的假設就是
link |
01:09:13.000
同一池的Q1攻擊真的是
link |
01:09:15.000
把這些池換成低頻的
link |
01:09:17.000
版本 假設今天
link |
01:09:19.000
你的這個攻擊
link |
01:09:21.000
你去攻擊它的是一個
link |
01:09:23.000
inflectional morpheme的攻擊
link |
01:09:25.000
那inflectional morpheme應該不會有所謂
link |
01:09:27.000
比我頻率高的問題
link |
01:09:29.000
所以當你拿FGDLS去
link |
01:09:31.000
偵測inflectional morpheme
link |
01:09:33.000
的時候它一樣會爛掉
link |
01:09:35.000
所以它有一些
link |
01:09:37.000
它的scenario
link |
01:09:39.000
那另外就是這個方法
link |
01:09:41.000
它還需要設這個delta跟gamma
link |
01:09:43.000
這兩個threshold 所以它也會有
link |
01:09:45.000
一些tradeoff 你要怎麼
link |
01:09:47.000
去選這些delta跟gamma
link |
01:09:49.000
然後你也需要一個
link |
01:09:51.000
development set 你才能去設一個好的
link |
01:09:53.000
threshold 那這些threshold
link |
01:09:55.000
也不能保證你在test的時候會有好的結果
link |
01:09:59.000
好 所以
link |
01:10:01.000
我們終於講完那個
link |
01:10:03.000
inflectional attack 那
link |
01:10:05.000
我們先休息個五分鐘好了
link |
01:10:07.000
好啊
link |
01:10:09.000
好 那我們五分鐘後回來喔