back to index

【機器學習2021】自注意力機制 (Self-attention) (上)


link |
00:01.000
好,接下來要講什麼呢?
link |
00:03.000
講完了CNN以後
link |
00:05.000
我們要講另外一個常見的Network架構
link |
00:08.000
這個架構叫做Self-Attention
link |
00:12.000
而這個Self-Attention想要解決的問題是什麼呢?
link |
00:15.000
它想要解決的問題是
link |
00:17.000
到目前為止啊
link |
00:19.000
我們的Network的input都是一個項量
link |
00:23.000
不管是在預測YouTube觀看人數的問題上啊
link |
00:27.000
還是影像處理上啊
link |
00:29.000
我們的輸入都可以看作是一個項量
link |
00:33.000
然後我們的輸出可能是一個數值
link |
00:36.000
這個是regression
link |
00:37.000
可能是一個類別
link |
00:38.000
這是classification
link |
00:40.000
但假設我們遇到更複雜的問題呢?
link |
00:42.000
假設我們說輸入是一排項量呢?
link |
00:47.000
而且這個輸入的項量的數目是會改變的呢?
link |
00:51.000
我們剛才在講影像辨識的時候
link |
00:53.000
我還特別跟你強調說
link |
00:54.000
我們假設輸入的影像大小都是一樣
link |
00:58.000
那現在假設我們的輸入會不一樣呢?
link |
01:02.000
每次我們model輸入的sequence的數目
link |
01:04.000
sequence的長度都不一樣呢?
link |
01:06.000
那這個時候應該要怎麼處理?
link |
01:10.000
那有什麼樣的例子是輸入是一個sequence
link |
01:14.000
而且長度會改變的呢?
link |
01:16.000
第一個例子是文字處理
link |
01:19.000
假設我們今天要Network的輸入
link |
01:21.000
是一個句子的話
link |
01:23.000
每個句子的長度都不一樣嘛
link |
01:25.000
每個句子裡面詞彙的數目都不一樣嘛
link |
01:27.000
如果我們把一個句子裡面的每一個詞彙
link |
01:30.000
都描述成一個項量
link |
01:31.000
用一個項量來表示的話
link |
01:33.000
那我們的model的輸入
link |
01:35.000
就會是一個vector的set
link |
01:37.000
而且這個vector set的大小
link |
01:39.000
每次都不一樣
link |
01:40.000
句子的長度不一樣
link |
01:41.000
那你的vector set的大小就不一樣
link |
01:44.000
那有同學可能會問說
link |
01:46.000
那怎麼把一個詞彙表示成一個項量呢?
link |
01:49.000
那簡單來說
link |
01:50.000
最簡單的做法是one-half的encoding
link |
01:54.000
你就開一個很長很長的項量
link |
01:57.000
這個項量的長度啊
link |
01:59.000
跟世界上存在的詞彙的數目是一樣多的
link |
02:03.000
假設英文是十萬個詞彙
link |
02:05.000
就開一個十萬維的項量
link |
02:07.000
每一個維度對應到一個詞彙
link |
02:09.000
apple就是100, bag就是010, cat就是001
link |
02:13.000
以此類推
link |
02:14.000
但是這樣子的表示方法
link |
02:16.000
有一個非常嚴重的問題
link |
02:18.000
怎麼樣嚴重的問題呢?
link |
02:19.000
它假設所有的詞彙
link |
02:21.000
彼此之間都是沒有關係的
link |
02:24.000
從這個項量裡面你看不到說
link |
02:26.000
也許cat跟dog都是動物
link |
02:28.000
所以他們比較接近
link |
02:29.000
cat跟apple一個動物一個植物
link |
02:32.000
所以他們比較不相像
link |
02:34.000
看不出來這件事情
link |
02:35.000
這個項量裡面沒有任何語意的資訊
link |
02:39.000
有另外一個方法叫做word embedding
link |
02:42.000
word embedding就是
link |
02:43.000
我們會給每一個詞彙一個項量
link |
02:45.000
而這個項量是有語意的資訊的
link |
02:47.000
如果你把word embedding畫出來的話
link |
02:50.000
你會發現所有的動物可能聚集成一團
link |
02:52.000
所有的植物可能聚集成一團
link |
02:54.000
所有的動詞可能聚集成一團等等
link |
02:57.000
那word embedding是怎麼得到的呢?
link |
02:59.000
這個就不是今天講課的重點了
link |
03:01.000
如果你有興趣的話
link |
03:02.000
可以看一下以下的錄影
link |
03:05.000
總之你現在在網路上
link |
03:06.000
可以載到一種東西叫做word embedding
link |
03:08.000
這個word embedding
link |
03:09.000
會給每一個詞彙一個項量
link |
03:12.000
而一個句子
link |
03:13.000
就是一排長度不一的項量
link |
03:18.000
接下來還有什麼樣的例子
link |
03:20.000
我們需要把一個項量的sequence
link |
03:24.000
當作輸入呢?
link |
03:25.000
舉例來說,作業2
link |
03:27.000
一段聲音訊號其實是一排項量
link |
03:32.000
怎麼說呢?
link |
03:33.000
我們會把一段聲音訊號取一個範圍
link |
03:36.000
這個範圍叫做一個window
link |
03:38.000
把這個window裡面的資訊
link |
03:40.000
描述成一個項量
link |
03:41.000
這個項量就叫做一個frame
link |
03:44.000
在語音上
link |
03:45.000
我們會把一個項量叫做一個frame
link |
03:48.000
通常這個window的長度
link |
03:50.000
就是25ms
link |
03:52.000
那怎麼把這麼一個小段的聲音訊號
link |
03:54.000
變成一個frame
link |
03:55.000
變成一個項量呢?
link |
03:56.000
這邊就有白白一種做法了
link |
03:59.000
這邊就不細講
link |
04:01.000
就是有各式各樣的做法
link |
04:02.000
可以用一個項量來描述
link |
04:04.000
一小段25ms裡面的語音訊號
link |
04:08.000
然後呢
link |
04:09.000
你為了要描述一整段的聲音訊號
link |
04:11.000
你會把這個window往右移一點
link |
04:14.000
通常移動的大小是10ms
link |
04:18.000
有人就會問說
link |
04:19.000
為什麼這邊是25ms
link |
04:20.000
為什麼這個10ms
link |
04:21.000
這個問題就很難回答
link |
04:23.000
這個古聖先賢幫你調好了
link |
04:25.000
你知道嗎
link |
04:26.000
這個你自己調通常都是比較差
link |
04:28.000
古聖先賢已經把所有的可能都試過了
link |
04:30.000
然後調一個最好的結果
link |
04:32.000
然後就這樣
link |
04:34.000
link |
04:35.000
那總之呢
link |
04:36.000
一段聲音訊號
link |
04:37.000
你就是用一串項量來表示
link |
04:40.000
而因為每一個window
link |
04:43.000
他們往右移都是移動10ms
link |
04:45.000
所以一秒鐘的聲音訊號
link |
04:48.000
有幾個項量呢
link |
04:49.000
有100個
link |
04:51.000
所以一分鐘的聲音訊號
link |
04:52.000
就有100乘以60
link |
04:55.000
就有6000個項量
link |
04:57.000
所以語音其實很複雜的
link |
04:58.000
一小段的聲音訊號
link |
04:59.000
它裡面包含的資訊量
link |
05:01.000
其實是非常可觀的
link |
05:03.000
所以聲音訊號也是一堆項量
link |
05:07.000
還有什麼東西是一堆項量呢
link |
05:10.000
一個graph
link |
05:11.000
一個graph一個圖
link |
05:12.000
也是一堆項量
link |
05:15.000
怎麼說呢
link |
05:16.000
我們知道說
link |
05:17.000
social network就是一個graph
link |
05:20.000
在social network上面
link |
05:21.000
每一個節點就是一個人
link |
05:24.000
然後節點跟節點之間的age
link |
05:26.000
就是他們兩個
link |
05:27.000
比如說是不是朋友等等
link |
05:29.000
而每一個節點
link |
05:31.000
可以看做是一個項量
link |
05:34.000
你可以拿每一個人的
link |
05:36.000
比如說他的profile裡面的資訊
link |
05:38.000
他的性別
link |
05:39.000
他的年齡
link |
05:40.000
他的工作
link |
05:41.000
等等
link |
05:42.000
把這些資訊
link |
05:43.000
用一個項量來表示
link |
05:45.000
所以一個social network
link |
05:46.000
一個graph
link |
05:47.000
你也可以看做是
link |
05:48.000
一堆的項量所組成的
link |
05:52.000
那還有什麼例子
link |
05:53.000
跟graph有關呢
link |
05:54.000
舉例來說
link |
05:55.000
一個分子
link |
05:57.000
它也可以看做是一個graph
link |
05:59.000
那現在像這種
link |
06:00.000
drug discovery的應用
link |
06:02.000
非常的受到重視
link |
06:03.000
尤其是在COVID-19這段時間
link |
06:05.000
很多人都期待
link |
06:06.000
也許用機器學習
link |
06:07.000
可以在drug discovery上面
link |
06:09.000
做到什麼突破
link |
06:10.000
那這個時候
link |
06:11.000
你就需要把一個分子
link |
06:13.000
當做是你的模型的輸入
link |
06:16.000
而一個分子
link |
06:17.000
可以看做是一個graph
link |
06:19.000
分子上面的每一個球
link |
06:21.000
就是一個原子
link |
06:22.000
你就是一個項量
link |
06:25.000
那一個原子
link |
06:26.000
怎麼用一個項量來表示呢
link |
06:27.000
你可以用one-half vector來表示
link |
06:30.000
你可以說氫就是1000
link |
06:32.000
碳就是0100
link |
06:34.000
然後氧就是0010
link |
06:37.000
你可以用one-half vector
link |
06:38.000
來表示每一個原子
link |
06:40.000
那一個分子
link |
06:42.000
就是一個graph
link |
06:43.000
它就是一堆項量
link |
06:46.000
好 那輸出是什麼
link |
06:48.000
我們剛才已經看說
link |
06:49.000
輸入是一堆項量
link |
06:51.000
它可以是文字
link |
06:52.000
可以是語音
link |
06:53.000
可以是graph
link |
06:54.000
那這個時候
link |
06:55.000
我們有可能
link |
06:56.000
有什麼樣的輸出呢
link |
06:57.000
有三種可能性
link |
07:00.000
第一種可能性是
link |
07:01.000
每一個項量
link |
07:03.000
都有一個對應的label
link |
07:06.000
也就是說
link |
07:07.000
每一個模型
link |
07:08.000
看到輸入是四個項量的時候
link |
07:10.000
它就要輸出四個label
link |
07:13.000
那每一個label
link |
07:14.000
它可能是一個數值
link |
07:15.000
那就是regression的問題
link |
07:16.000
如果每一個label
link |
07:17.000
是一個class
link |
07:18.000
那就是一個classification的問題
link |
07:21.000
但是在第一種可能性裡面
link |
07:23.000
輸入跟輸出的長度是一樣的
link |
07:25.000
所以模型不需要去煩惱
link |
07:27.000
要輸出多少的label
link |
07:29.000
輸出多少的scalar
link |
07:30.000
反正輸入是四個項量
link |
07:32.000
輸出就是四個項量
link |
07:33.000
輸入五個項量
link |
07:36.000
輸出就是五個label
link |
07:38.000
這是第一種類型
link |
07:39.000
那什麼樣的application
link |
07:42.000
會用到第一種類型的輸出呢
link |
07:44.000
舉例來說
link |
07:45.000
在文字處理上
link |
07:47.000
假設你今天要做的是pos tagging
link |
07:51.000
pos tagging是什麼呢
link |
07:52.000
pos tagging就是詞性標註
link |
07:55.000
你要讓機器自動決定說
link |
07:57.000
每一個詞彙
link |
07:58.000
它是什麼樣的詞性
link |
08:00.000
它是名詞還是動詞
link |
08:01.000
還是形容詞等等
link |
08:02.000
那這個任務
link |
08:03.000
其實並沒有很容易
link |
08:05.000
舉例來說
link |
08:06.000
你現在看到一個句子
link |
08:07.000
I saw a soul
link |
08:09.000
這並不是打錯
link |
08:10.000
並不是你看一個看
link |
08:11.000
而是我看到一個句子
link |
08:13.000
這個第二個soul
link |
08:14.000
當名詞用的時候
link |
08:16.000
它是句子
link |
08:18.000
而不是sentence那個句子
link |
08:19.000
是可以句東西的句子
link |
08:21.000
知道嗎
link |
08:22.000
所以機器要知道說
link |
08:23.000
第一個soul是個動詞
link |
08:25.000
第二個soul
link |
08:26.000
雖然它也是個soul
link |
08:27.000
但它是名詞
link |
08:29.000
但是每一個輸入的詞彙
link |
08:32.000
都要有一個對應的輸出的詞性
link |
08:36.000
這個任務就是
link |
08:38.000
輸入跟輸出的長度是一樣的case
link |
08:41.000
這個就是屬於
link |
08:42.000
第一個類型的輸出
link |
08:44.000
那如果是語音的話
link |
08:46.000
你可以想想看
link |
08:47.000
我們作業2
link |
08:48.000
就是這樣子的任務
link |
08:49.000
雖然我們作業2
link |
08:50.000
沒有給大家一個完整的sequence
link |
08:52.000
我們是把每一個每一個
link |
08:54.000
每一個vector分開給大家了
link |
08:56.000
但是串起來就是
link |
08:57.000
一段聲音訊號裡面
link |
08:58.000
有一串vector
link |
09:00.000
每一個vector
link |
09:01.000
要決定它是哪一個phony
link |
09:04.000
也就是哪一個
link |
09:05.000
如果不知道phony是什麼
link |
09:06.000
就是當作音標來看
link |
09:07.000
就是哪一個音標
link |
09:08.000
當然這個不是真正的語音辨識
link |
09:10.000
這是一個語音辨識的簡化版
link |
09:13.000
或者是如果是social network的話
link |
09:16.000
就是給一個graph
link |
09:17.000
給一個social network
link |
09:18.000
那你的machine
link |
09:19.000
你的model
link |
09:20.000
要決定每一個節點
link |
09:22.000
它有什麼樣的特性
link |
09:23.000
比如說
link |
09:24.000
它會不會買某一個商品
link |
09:26.000
這樣我們才知道說
link |
09:27.000
要不要推薦某一個商品給它
link |
09:30.000
以上呢
link |
09:31.000
就是舉輸入跟輸出
link |
09:33.000
數目一樣的例子
link |
09:35.000
這是第一種可能的輸出
link |
09:37.000
第二種可能的輸出是什麼
link |
09:39.000
第二種可能的輸出是
link |
09:41.000
我們一整個sequence
link |
09:43.000
只需要輸出一個label就好
link |
09:46.000
舉例來說
link |
09:47.000
如果是文字的話
link |
09:50.000
我們就說sentiment analysis
link |
09:52.000
sentiment analysis是什麼呢
link |
09:54.000
sentiment analysis就是
link |
09:55.000
給機器看一段話
link |
09:56.000
它會決定說
link |
09:57.000
這一段話是正面的還是負面的
link |
10:00.000
那可以想像說這種應用很有用
link |
10:01.000
假設你的公司開發了一個產品
link |
10:04.000
這個產品上線了
link |
10:05.000
你想要知道網友的評價怎麼樣
link |
10:06.000
但是你又不可能一則一則
link |
10:08.000
網友的留言都去分析
link |
10:10.000
那也許你就可以用這種
link |
10:11.000
sentiment analysis的技術
link |
10:13.000
讓機器自動去判讀說
link |
10:15.000
當一則貼文裡面
link |
10:16.000
有提到某個產品的時候
link |
10:17.000
它是正面的還是負面的
link |
10:20.000
那就可以知道你的產品
link |
10:21.000
在網友心中的評價怎麼樣
link |
10:23.000
這個是sentiment analysis
link |
10:25.000
給一整個句子
link |
10:27.000
只需要一個label
link |
10:29.000
positive or negative
link |
10:31.000
那這個就是第二類的輸出
link |
10:34.000
那如果是語音的例子的話
link |
10:36.000
在作業室裡面
link |
10:37.000
我們會做語者辨認
link |
10:38.000
機器要聽一段聲音
link |
10:40.000
然後決定它是誰講的
link |
10:42.000
這個也是第二種輸出的例子
link |
10:45.000
或者是如果是graph的話
link |
10:47.000
今天你可能想要給一個分子
link |
10:49.000
然後要預測說這個分子
link |
10:51.000
比如說它有沒有毒性
link |
10:53.000
或者是它的清水性如何
link |
10:55.000
那這就是給一個graph
link |
10:57.000
輸出一個label
link |
10:58.000
這也是第二個例子
link |
11:01.000
那還有第三個可能的輸出
link |
11:03.000
第三個可能的輸出就是
link |
11:05.000
我們不知道應該輸出多少個label
link |
11:09.000
機器要自己決定
link |
11:11.000
應該要輸出多少個label
link |
11:14.000
可能你輸入是n個向量
link |
11:17.000
輸出可能是n'的label
link |
11:19.000
為什麼是n'
link |
11:20.000
機器自己決定
link |
11:23.000
那這種任務又叫做
link |
11:25.000
sequence-to-sequence的任務
link |
11:27.000
那我們在作業5會有
link |
11:29.000
sequence-to-sequence的作業
link |
11:30.000
所以這個之後我們還會再講
link |
11:33.000
那可以想像說翻譯
link |
11:35.000
就是sequence-to-sequence的任務
link |
11:37.000
因為輸入輸出是不同的語言
link |
11:39.000
他們的詞彙的數目
link |
11:40.000
本來就不會一樣多
link |
11:42.000
或者是語音辨識
link |
11:43.000
也是真正的語音辨識
link |
11:46.000
也是一個sequence-to-sequence的任務
link |
11:48.000
輸入一句話
link |
11:49.000
然後輸出一段文字
link |
11:50.000
這也是一個sequence-to-sequence的任務
link |
11:54.000
那第三種類型之後會講
link |
11:56.000
今天我們只講第一種類型
link |
11:59.000
第二種類型
link |
12:01.000
我們有作業4
link |
12:03.000
你可以自己去看看作業4的程式
link |
12:05.000
看看第一種類型的問題
link |
12:07.000
是怎麼處理的
link |
12:09.000
因為上課時間有限
link |
12:10.000
所以上課我們今天就先只講
link |
12:13.000
第一個類型
link |
12:14.000
也就是輸入跟輸出
link |
12:16.000
數目一樣多的狀況
link |
12:18.000
那這種輸入跟輸出
link |
12:19.000
數目一樣多的狀況
link |
12:21.000
它又叫做sequence labeling
link |
12:24.000
要給sequence裡面的每一個項量
link |
12:26.000
都給它一個label
link |
12:29.000
那要怎麼解sequence labeling的問題呢
link |
12:32.000
直覺的想法就是
link |
12:34.000
就跟作業2一樣
link |
12:36.000
我們就拿個fully connected的network
link |
12:39.000
然後雖然這個輸入是一個sequence
link |
12:41.000
但我們就各個擊破
link |
12:43.000
不要管它是不是一個sequence
link |
12:45.000
各個擊破
link |
12:46.000
把每一個項量
link |
12:48.000
分別輸入到
link |
12:50.000
fully connected的network裡面
link |
12:52.000
然後fully connected的network
link |
12:54.000
就會給我們輸出
link |
12:55.000
那現在看看你要做的是
link |
12:56.000
regression還是classification
link |
12:57.000
產生正確的對應的輸出
link |
12:59.000
就結束了
link |
13:01.000
但這麼做
link |
13:02.000
顯然有非常大的瑕疵
link |
13:04.000
什麼叫非常大的瑕疵呢
link |
13:06.000
假設今天是
link |
13:08.000
磁性標記的問題
link |
13:10.000
你給機器一個句子
link |
13:11.000
I saw a soul
link |
13:13.000
對fully connected network來說
link |
13:15.000
這個soul跟這個soul
link |
13:17.000
完全一模一樣
link |
13:19.000
它們是同一個詞彙
link |
13:21.000
既然fully connected的network
link |
13:23.000
輸入同一個詞彙
link |
13:24.000
它沒有理由輸出不同的東西
link |
13:27.000
但實際上
link |
13:28.000
你期待第一個soul
link |
13:30.000
要輸出動詞
link |
13:31.000
第二個soul要輸出名詞
link |
13:33.000
但對network來說
link |
13:34.000
它不可能做到
link |
13:35.000
因為這兩個soul
link |
13:36.000
明明是一模一樣的
link |
13:37.000
你叫它這個要輸出動詞
link |
13:39.000
這個要輸出名詞
link |
13:40.000
它會非常的困惑
link |
13:41.000
完全不知道要怎麼處理
link |
13:44.000
所以怎麼辦
link |
13:45.000
有沒有可能
link |
13:46.000
讓fully connected的network
link |
13:48.000
考慮更多的
link |
13:50.000
比如說上下文的context的資訊呢
link |
13:53.000
這是有可能的
link |
13:55.000
怎麼做
link |
13:56.000
你就把這一個項量
link |
13:58.000
前後幾個項量
link |
14:00.000
都串起來
link |
14:01.000
一起丟到fully connected的network
link |
14:03.000
就結束了
link |
14:04.000
事實上在作業2裡面
link |
14:06.000
助教也已經這麼做了
link |
14:08.000
在作業2裡面
link |
14:09.000
我們不是只看一個frame
link |
14:11.000
去判斷這個frame
link |
14:12.000
屬於哪一個風鈴
link |
14:14.000
也就是屬於哪一個音標
link |
14:16.000
而是看這個frame的
link |
14:17.000
前面5個加後面5個
link |
14:19.000
也就是總共看11個frame
link |
14:20.000
來決定它是哪一個音標
link |
14:24.000
所以我們可以給
link |
14:25.000
fully connected的network
link |
14:26.000
一整個window的資訊
link |
14:28.000
讓它可以考慮一些上下文的
link |
14:31.000
跟我現在要考慮的這個項量
link |
14:33.000
相鄰的其他項量的資訊
link |
14:37.000
但是這樣子的方法
link |
14:38.000
還是有極限
link |
14:40.000
如果是在作業2
link |
14:42.000
其實用這個方法就夠好了
link |
14:44.000
作業2就算是
link |
14:45.000
給你sequence的資訊
link |
14:46.000
你考慮整個sequence
link |
14:47.000
你可能也很難再做得更好啦
link |
14:49.000
作業2考慮前後5個frame
link |
14:52.000
其實就可以得到
link |
14:53.000
很不錯的結果了
link |
14:54.000
所以你要過strong baseline
link |
14:56.000
重點並不在於
link |
14:57.000
考慮整個sequence
link |
14:58.000
你就不需要往那個方向想了
link |
15:00.000
用助教現有給你的data
link |
15:02.000
你就可以輕易地過strong baseline
link |
15:05.000
但是真正的問題
link |
15:06.000
但是如果今天
link |
15:07.000
我們有某一個任務
link |
15:08.000
不是考慮一個window
link |
15:10.000
就可以解決的
link |
15:11.000
而是要考慮一整個sequence
link |
15:13.000
才能夠解決的話
link |
15:15.000
那要怎麼辦呢
link |
15:16.000
那有人可能會想說
link |
15:17.000
這個還不容易
link |
15:18.000
我就把window開大一點
link |
15:20.000
大到可以把整個sequence蓋住
link |
15:23.000
不就結束了嗎
link |
15:25.000
但是不要忘了
link |
15:26.000
今天sequence的長度
link |
15:28.000
是有長有短的
link |
15:30.000
我剛才有說
link |
15:31.000
我們輸入給我們的model
link |
15:33.000
sequence的長度
link |
15:34.000
每次可能都不一樣
link |
15:35.000
如果你今天說
link |
15:36.000
我真的要開一個window
link |
15:37.000
把整個sequence蓋住
link |
15:39.000
那你可能要統計一下
link |
15:40.000
你的訓練資料
link |
15:42.000
然後看看你的訓練資料裡面
link |
15:44.000
最長的sequence有多長
link |
15:46.000
然後開一個window
link |
15:47.000
比最長的sequence還要長
link |
15:48.000
才有可能把整個sequence蓋住
link |
15:51.000
但是你開一個這麼大的window
link |
15:53.000
意味著說
link |
15:54.000
你的fully connected network
link |
15:55.000
它需要非常多的參數
link |
15:57.000
那可能不只運算量很大
link |
15:59.000
可能還容易overfitting
link |
16:02.000
所以有沒有更好的方法
link |
16:04.000
來考慮整個input sequence的
link |
16:06.000
資訊呢
link |
16:08.000
這就要用到
link |
16:09.000
我們接下來要跟大家介紹的
link |
16:11.000
Self-Attention這個技術
link |
16:14.000
那Self-Attention是怎麼運作的呢
link |
16:16.000
Self-Attention的運作方式就是
link |
16:18.000
Self-Attention會吃一整個
link |
16:21.000
sequence的資訊
link |
16:23.000
然後你input幾個vector
link |
16:25.000
它就輸出幾個vector
link |
16:28.000
比如說你這邊input一個
link |
16:29.000
深藍色的vector
link |
16:30.000
這邊就給你另外一個vector
link |
16:32.000
這邊給個淺藍色
link |
16:33.000
它就給你另外一個vector
link |
16:35.000
你這邊輸入四個vector
link |
16:36.000
它就output四個vector
link |
16:38.000
那這四個vector
link |
16:39.000
有什麼特別的地方呢
link |
16:40.000
這四個vector
link |
16:41.000
它們都是考慮
link |
16:43.000
一整個sequence以後才得到的
link |
16:45.000
那等一下我會講說
link |
16:46.000
Self-Attention
link |
16:47.000
怎麼考慮一整個sequence的資訊
link |
16:50.000
所以這邊每一個向量
link |
16:52.000
我們特別給它一個
link |
16:54.000
黑色的框框
link |
16:55.000
代表說它不是一個
link |
16:56.000
普通的向量
link |
16:57.000
它是考慮了整個句子以後
link |
16:59.000
才得到的資訊
link |
17:00.000
再把這個有考慮
link |
17:01.000
整個句子的向量
link |
17:02.000
丟進fully connected的network
link |
17:04.000
然後再來決定說
link |
17:06.000
它應該是什麼樣的東西
link |
17:08.000
什麼樣的類別
link |
17:09.000
或output什麼樣的數值
link |
17:10.000
那你用這個方法
link |
17:11.000
如此一來
link |
17:12.000
你這個fully connected的network
link |
17:14.000
它就不是只考慮
link |
17:15.000
一個非常小的範圍
link |
17:16.000
或一個小的window
link |
17:17.000
而是考慮整個sequence的資訊
link |
17:19.000
再來決定
link |
17:20.000
現在應該要輸出
link |
17:22.000
什麼樣的結果
link |
17:24.000
這個就是Self-Attention
link |
17:26.000
那Self-Attention
link |
17:27.000
不是只能用一次
link |
17:29.000
你可以疊加很多次
link |
17:30.000
你可以說
link |
17:31.000
我這個Self-Attention的輸出
link |
17:33.000
通過fully connected network以後
link |
17:35.000
得到fully connected network的輸出
link |
17:37.000
fully connected network的輸出
link |
17:39.000
再做一次Self-Attention
link |
17:41.000
fully connected network
link |
17:42.000
再過一次Self-Attention
link |
17:44.000
再重新考慮一次
link |
17:46.000
整個input sequence的資訊
link |
17:48.000
再丟到另外一個
link |
17:50.000
fully connected network
link |
17:51.000
最後再得到最終的結果
link |
17:54.000
所以你可以把fully connected network
link |
17:56.000
跟Self-Attention交替使用
link |
17:58.000
就是Self-Attention
link |
17:59.000
處理整個sequence的資訊
link |
18:01.000
fully connected network
link |
18:02.000
專注於處理某一個位置的資訊
link |
18:04.000
然後你可以再用Self-Attention
link |
18:06.000
把整個sequence的資訊
link |
18:08.000
再處理一次
link |
18:09.000
然後交替使用Self-Attention
link |
18:11.000
跟fully connected network
link |
18:13.000
那有關Self-Attention
link |
18:15.000
最知名的相關的文章
link |
18:17.000
就是Attention is all you need
link |
18:20.000
那在這篇paper裡面
link |
18:22.000
Google提出了
link |
18:23.000
Transformer這樣的network架構
link |
18:25.000
那Transformer就是變形金剛
link |
18:27.000
所以提到這個network的時候
link |
18:29.000
我們就會有變形金剛這個形象
link |
18:32.000
那在Transformer裡面
link |
18:33.000
一個最重要的module
link |
18:34.000
Transformer我們今天還不會講到
link |
18:36.000
但我們之後會講到
link |
18:37.000
Transformer裡面一個
link |
18:38.000
最重要的module
link |
18:39.000
就是Self-Attention
link |
18:41.000
它就是變形金剛的活種源
link |
18:43.000
那這篇paper最厲害的地方
link |
18:45.000
就是它有一個霸氣的名字
link |
18:47.000
霸氣的名字就是
link |
18:48.000
Attention is all you need
link |
18:51.000
那其實像Self-Attention
link |
18:52.000
這樣的架構
link |
18:53.000
最早我並不會說
link |
18:54.000
它是出現在
link |
18:55.000
Attention is all you need
link |
18:56.000
這樣的paper
link |
18:57.000
因為其實很多更早的paper
link |
18:58.000
就有提出過類似的架構
link |
19:00.000
只是不見得叫做Self-Attention
link |
19:02.000
比如說叫做Self-Matching
link |
19:04.000
或者是叫別的名字
link |
19:06.000
不過是Attention is all you need
link |
19:08.000
這篇paper
link |
19:09.000
把Self-Attention這個module
link |
19:11.000
把它發揚光大
link |
19:13.000
那Self-Attention是怎麼運作的呢
link |
19:16.000
Self-Attention的input
link |
19:18.000
它就是一串的vector
link |
19:21.000
那這個vector
link |
19:22.000
可能是你整個network的input
link |
19:24.000
它也可能是
link |
19:26.000
某個hidden layer的output
link |
19:28.000
所以我們這邊
link |
19:29.000
不是用X來表示它
link |
19:30.000
我們用A來表示它
link |
19:31.000
代表說
link |
19:32.000
它有可能是
link |
19:33.000
前面已經做過一些處理
link |
19:35.000
它是某個hidden layer的output
link |
19:38.000
那input一排A這個向量以後
link |
19:41.000
Self-Attention要output
link |
19:42.000
另外一排B這個向量
link |
19:45.000
那這個B呢
link |
19:46.000
每一個B呢
link |
19:48.000
都是考慮了
link |
19:49.000
所有的A以後
link |
19:51.000
才生成出來的
link |
19:52.000
所以我這邊刻意畫了
link |
19:53.000
非常非常多的箭頭
link |
19:54.000
告訴你說
link |
19:55.000
B1考慮了A1到A4產生的
link |
19:58.000
B2考慮A1到A4產生的
link |
20:00.000
B3、B4也是一樣
link |
20:02.000
考慮了整個input的sequence
link |
20:04.000
才產生出來的
link |
20:07.000
好 那接下來呢
link |
20:08.000
就是要跟大家說明
link |
20:10.000
怎麼產生B1這個向量
link |
20:12.000
那你知道怎麼產生
link |
20:13.000
B1這個向量以後
link |
20:14.000
你就知道怎麼產生
link |
20:15.000
剩下B2、B3、B4
link |
20:17.000
剩下的向量
link |
20:19.000
好 怎麼產生B1這個向量呢
link |
20:21.000
第一個步驟是
link |
20:23.000
根據A1
link |
20:25.000
找出這個sequence裡面
link |
20:28.000
跟A1相關的其他向量
link |
20:32.000
我們知道說
link |
20:33.000
今天我們要做
link |
20:34.000
Self-Attention目的
link |
20:35.000
就是為了要考慮
link |
20:36.000
整個sequence
link |
20:37.000
但是我們又不希望
link |
20:38.000
把整個sequence
link |
20:39.000
所有的資訊
link |
20:40.000
包在一個window裡面
link |
20:41.000
所以我們有一個特別的機制
link |
20:43.000
這個機制是
link |
20:44.000
根據A1這個向量
link |
20:45.000
找出說
link |
20:46.000
整個很長的sequence裡面
link |
20:48.000
到底哪些部分是重要的
link |
20:50.000
哪些部分跟判斷
link |
20:51.000
A1是哪一個label
link |
20:53.000
是有關係的
link |
20:54.000
哪些部分
link |
20:55.000
是我們要決定
link |
20:56.000
A1的class
link |
20:57.000
決定A1的regression數值的時候
link |
20:59.000
所需要用到的資訊
link |
21:02.000
好 那每一個向量
link |
21:04.000
跟A1的關聯的程度
link |
21:06.000
我們用一個數值
link |
21:08.000
叫alpha來表示
link |
21:10.000
再來的問題就是
link |
21:12.000
這個Self-Attention的module
link |
21:14.000
怎麼自動決定
link |
21:15.000
兩個向量之間的關聯性呢
link |
21:18.000
你給他兩個向量
link |
21:19.000
A1跟A4
link |
21:20.000
他怎麼決定
link |
21:21.000
A1跟A4有多相關
link |
21:23.000
然後給他一個數值alpha呢
link |
21:26.000
那這邊呢
link |
21:27.000
你就需要一個
link |
21:28.000
計算Attention的模組
link |
21:30.000
這個計算Attention的模組呢
link |
21:32.000
他就是拿兩個向量
link |
21:33.000
做為輸入
link |
21:34.000
然後他就直接輸出
link |
21:36.000
alpha那個數值
link |
21:37.000
就可以把alpha那個數值
link |
21:38.000
當作兩個向量的
link |
21:40.000
關聯的程度
link |
21:42.000
那怎麼計算
link |
21:43.000
這個alpha的數值呢
link |
21:45.000
這邊就有各種
link |
21:46.000
不同的做法
link |
21:48.000
那比較常見的做法呢
link |
21:49.000
叫做用dapada
link |
21:52.000
那dapada怎麼做呢
link |
21:53.000
你把輸入的這兩個向量
link |
21:55.000
分別乘上兩個不同的矩陣
link |
22:00.000
左邊這個向量乘上
link |
22:01.000
WQ這個矩陣
link |
22:02.000
右邊這個向量乘上
link |
22:03.000
WK這個矩陣
link |
22:05.000
接下來得到Q跟K
link |
22:07.000
這兩個向量
link |
22:08.000
那你再把Q跟K
link |
22:09.000
做dapada
link |
22:11.000
就是把他們做
link |
22:12.000
analyze的相乘
link |
22:13.000
再全部加起來以後
link |
22:15.000
就得到
link |
22:16.000
就把Q跟K做dapada以後
link |
22:17.000
得到一個scalar
link |
22:18.000
這個scalar就是alpha
link |
22:20.000
這是一種計算alpha的方式
link |
22:22.000
那其實還有其他的計算方式
link |
22:24.000
比如說右邊呢
link |
22:25.000
有另外一個叫做
link |
22:26.000
additive的計算方式
link |
22:27.000
那它的計算方法就是
link |
22:29.000
同樣這兩個向量
link |
22:30.000
通過WQWK
link |
22:32.000
得到Q跟K
link |
22:33.000
那我們不是把它做dapada
link |
22:35.000
是把它這個串起來
link |
22:38.000
然後丟到這個
link |
22:39.000
過一個activation function
link |
22:41.000
然後再通過一個transform
link |
22:42.000
然後得到alpha
link |
22:43.000
總之有非常多不同的方法
link |
22:46.000
可以計算attention
link |
22:47.000
可以計算這個alpha的數值
link |
22:49.000
可以計算這個關聯的程度
link |
22:51.000
但是在接下來的討論裡面
link |
22:54.000
我們都只用左邊這個方法
link |
22:56.000
這也是今日最常用的方法
link |
22:58.000
也是用在transformer裡面的方法
link |
23:02.000
好那接下來
link |
23:04.000
我們就要講
link |
23:05.000
怎麼計算出這個alpha
link |
23:08.000
好那講完這個
link |
23:12.000
這邊我們就快要講到一個段落
link |
23:14.000
那講到一個段落
link |
23:15.000
我們就可以下課
link |
23:17.000
或是看看大家有沒有問題
link |
23:18.000
總之呢
link |
23:19.000
我們就是用這兩個vector
link |
23:21.000
可以計算出alpha
link |
23:23.000
那接下來
link |
23:24.000
怎麼把它套用在
link |
23:26.000
self-attention裡面呢
link |
23:28.000
那你就要把這邊的A1
link |
23:30.000
去跟這邊的A2 A3 A4
link |
23:32.000
分別都去計算
link |
23:35.000
它們之間的關聯性
link |
23:37.000
也就是去計算它們之間的alpha
link |
23:40.000
那怎麼做呢
link |
23:41.000
你把A1乘上WQ
link |
23:44.000
得到Q1
link |
23:46.000
那這個Q有一個名字
link |
23:48.000
我們叫做query
link |
23:49.000
它就像是你搜尋引擎的時候
link |
23:51.000
去搜尋相關文章的問題
link |
23:54.000
搜尋相關文章的關鍵字
link |
23:56.000
所以這邊叫做query
link |
23:58.000
然後接下來呢
link |
24:00.000
A2 A3 A4
link |
24:02.000
你都要去把它乘上WK
link |
24:04.000
得到K這個vector
link |
24:06.000
那K這個vector呢
link |
24:07.000
有一個名字叫做key
link |
24:10.000
那你把這個query Q1
link |
24:12.000
跟這個key K2
link |
24:14.000
算inner product
link |
24:15.000
就得到alpha
link |
24:17.000
我們這邊用alpha12來代表說呢
link |
24:19.000
是query是1提供的
link |
24:22.000
key是2提供的時候
link |
24:24.000
這個1跟2它們之間的關聯性
link |
24:27.000
這個我們用alpha12來表示
link |
24:29.000
那這個alpha這個關聯性
link |
24:31.000
也有一個稱號
link |
24:32.000
叫做attention的score
link |
24:34.000
叫做attention的分數
link |
24:36.000
那Q1跟K2
link |
24:38.000
也就是A1跟A2
link |
24:40.000
你計算出他們的attention的分數
link |
24:42.000
計算出他們的關聯性以後
link |
24:44.000
接下來也要跟A3 A4來計算
link |
24:46.000
那怎麼跟A3 A4計算呢
link |
24:48.000
你就把A3乘上WK
link |
24:50.000
得到K3
link |
24:52.000
得到另外一個key
link |
24:53.000
A4乘上WK
link |
24:54.000
得到K4
link |
24:55.000
得到另外一個key
link |
24:56.000
然後你再把K3這個key
link |
24:58.000
跟Q1這個query
link |
25:00.000
做inner product
link |
25:01.000
得到1跟3之間的關聯性
link |
25:03.000
得到1跟3的attention
link |
25:05.000
你把K4跟Q1
link |
25:06.000
做double product
link |
25:07.000
得到alpha14
link |
25:08.000
得到1跟4之間的關聯性
link |
25:10.000
你就把A1去計算
link |
25:12.000
他跟A2 A3 A4的關聯性
link |
25:14.000
這個關聯性
link |
25:15.000
用attention score alpha
link |
25:17.000
來表示他
link |
25:19.000
那其實啊
link |
25:20.000
一般在實作的時候
link |
25:22.000
Q1也會跟自己算關聯性
link |
25:24.000
所以你也會把A1
link |
25:26.000
乘上WK得到K1
link |
25:27.000
把Q1跟K1
link |
25:29.000
去計算他的關聯性
link |
25:31.000
自己跟自己計算關聯性
link |
25:32.000
那自己跟自己計算關聯性
link |
25:33.000
這件事情有多重要呢
link |
25:35.000
你可以自己
link |
25:36.000
在做作業的時候試試看
link |
25:38.000
看看這件事情的影響大不大
link |
25:40.000
好那我們計算出
link |
25:42.000
A1跟每一個
link |
25:44.000
向量的關聯性以後
link |
25:45.000
接下來啊
link |
25:46.000
這邊會做一個softmax
link |
25:49.000
這邊有點有
link |
25:50.000
這邊這個softmax
link |
25:52.000
跟分類的時候的那個softmax
link |
25:54.000
是一模一樣的
link |
25:55.000
我們就把這邊的alpha
link |
25:58.000
全部乘上exponential
link |
26:00.000
然後呢
link |
26:01.000
再把exponential的值
link |
26:02.000
全部加起來
link |
26:03.000
做normalize
link |
26:04.000
得到alpha prime
link |
26:05.000
所以softmax的輸出
link |
26:06.000
就是一排alpha prime
link |
26:09.000
所以本來有一排alpha
link |
26:10.000
通過softmax
link |
26:11.000
就得到alpha prime
link |
26:13.000
那你可能會問說
link |
26:15.000
這邊為什麼要用softmax
link |
26:17.000
剛才你說
link |
26:19.000
這個分類用softmax
link |
26:20.000
你說有一串道理
link |
26:21.000
只是沒有講而已
link |
26:22.000
那這邊有道理嗎
link |
26:24.000
這邊就沒有什麼道理
link |
26:26.000
這邊你不一定要用softmax
link |
26:28.000
你可以用別的東西
link |
26:30.000
也沒問題
link |
26:31.000
比如說有人嘗試過說
link |
26:33.000
做個relu啊
link |
26:35.000
把這邊通通做個relu啊
link |
26:37.000
結果發現還比softmax好一點
link |
26:39.000
所以這邊你不一定要用softmax
link |
26:40.000
這邊你要用什麼
link |
26:42.000
activation function都行
link |
26:43.000
你高興就好
link |
26:44.000
你可以試試看
link |
26:45.000
那softmax是最常見的
link |
26:47.000
那你可以自己試試看
link |
26:48.000
看能不能試出
link |
26:49.000
比softmax更好的結果
link |
26:52.000
那得到這個alpha prime以後
link |
26:55.000
接下來呢
link |
26:56.000
得到這個alpha prime以後
link |
26:58.000
接下來啊
link |
26:59.000
我們就要根據這個alpha prime
link |
27:02.000
去抽取出這個sequence裡面
link |
27:04.000
重要的資訊
link |
27:06.000
根據這個alpha
link |
27:07.000
我們已經知道說
link |
27:08.000
哪些向量
link |
27:10.000
跟A1是最有關係的
link |
27:12.000
接下來我們要根據這個關聯性
link |
27:14.000
根據這個attention的分數
link |
27:16.000
來抽取重要的資訊
link |
27:18.000
怎麼抽取重要的資訊呢
link |
27:20.000
我們會把A1到A4這邊
link |
27:21.000
每一個向量
link |
27:22.000
乘上WB
link |
27:24.000
得到新的向量
link |
27:25.000
那這邊分別就是用
link |
27:26.000
V1 V2 V3 V4來表示
link |
27:29.000
接下來啊
link |
27:30.000
把這邊的V1到V4
link |
27:32.000
每一個向量
link |
27:33.000
都去乘上
link |
27:34.000
attention的分數
link |
27:35.000
都去乘上alpha prime
link |
27:36.000
然後呢
link |
27:37.000
再把它加起來
link |
27:39.000
我們把式子寫在這邊
link |
27:41.000
我們就是把這邊的
link |
27:42.000
每一個V都乘上alpha prime
link |
27:44.000
得到B1
link |
27:46.000
那你可以想見說
link |
27:47.000
如果某一個向量
link |
27:50.000
它得到的分數越高
link |
27:52.000
比如說如果A1跟A2的
link |
27:53.000
關聯性很強
link |
27:54.000
這個alpha prime得到的值很大
link |
27:56.000
那我們今天在做weighted sum以後
link |
27:57.000
得到的B1的值
link |
27:59.000
就可能會比較接近B2
link |
28:02.000
所以這邊
link |
28:03.000
誰的值最大
link |
28:04.000
誰的那個
link |
28:06.000
attention的分數最大
link |
28:07.000
誰的那個V
link |
28:09.000
就會dominate
link |
28:10.000
抽出來的結果
link |
28:12.000
所以這邊呢
link |
28:13.000
我們就講了
link |
28:14.000
怎麼從一整個sequence
link |
28:16.000
得到B1