back to index
【機器學習 2022】各式各樣神奇的自注意力機制 (Self-attention) 變型

link |
好,現場的同學、線上的同學大家好,那我們就開始上課吧!
link |
今天要講的是各式各樣的Self-Attention的技術。
link |
假設你已經看過跟Self-Attention相關的上課錄影,你已經知道Self-Attention是什麼,
link |
然後我們來告訴你其實Self-Attention有各式各樣的變形。
link |
在這個上課錄影的結尾已經告訴你說,其實Self-Attention並不是只有我們上課說的那種樣子。
link |
我們上課有說Self-Attention就是產生Q、K、B三種vector,
link |
然後這個Q跟K之間會兩兩算這個大發達,然後對value做weighted sum,然後做Self-Attention。
link |
假設你對這整個系列的機制已經非常的清楚,但是Self-Attention不只這樣子。
link |
在Self-Attention之前的影片裡面,我們就停在這個頁面告訴你說,
link |
Self-Attention其實有各式各樣的變化,他們往往都用什麼former、什麼former、什麼former作為結尾,
link |
但那是另外一個很長的故事了,今天我們就要來講這個故事。
link |
先很簡短的複習一下什麼是Self-Attention,還有它的難點、它的痛點在哪裡呢?
link |
我們知道Self-Attention的存在是為了要處理如果你的input是一個sequence的狀態,
link |
假設你要處理的input是一個sequence,這個sequence的長度我們用N來表示。
link |
這個sequence可能是各種不同的資料型態,它可能是一個句子,句子裡面的每一個token或詞彙當作是一個單位。
link |
或者是你的input可能是一段語音訊號,語音訊號裡面的一個frame當作一個單位。
link |
甚至最近常常有人把Self-Attention用在影像處理上,你的輸入是一張圖片,圖片裡面的每一個pixel當作一個單位。
link |
那Self-Attention它要做的事情就是處理一個input的sequence,那現在假設sequence的長度是N。
link |
那input一個sequence以後呢,我們會產生這個N個key的vector跟N個query的vector。
link |
那這個N個key的vector跟這個N個query的vector會兩兩之間做搭發的。
link |
那有N個key有N個query那叫做N平方次搭發的。
link |
把N平方次搭發的結果集合起來,你就得到一個N乘以N的矩陣,那這個矩陣呢叫做Attention的matrix。
link |
那我們根據這個Attention的matrix對value vector,那這個value vector我就沒有畫在這個圖片上了。
link |
我們得到這個Attention的matrix以後呢,對value vector做歸題上,那這個都是過去已經跟大家講過的內容。
link |
那我們在之前的錄影裡面也已經跟大家講過說,Self-Attention的痛點就是這個N乘以N的矩陣,它的計算量可能會非常的驚人。
link |
尤其是你的input sequence非常長的時候,這個N乘以N的Attention的matrix它的計算量會非常的大,
link |
所以就有一系列的方法想辦法加速Attention這個機制的計算。
link |
但是在開始之前呢,這邊要提醒大家,其實Self-Attention往往只是一個你的巨大network的其中一個module。
link |
舉例來說,假設你要用的是Transformer,上課錄影照理說你已經聽過Transformer了。
link |
假設我們要用的是Transformer,Transformer裡面不是只有Self-Attention,除了Self-Attention以外還有其他的module。
link |
所以今天呢,雖然我們說Self-Attention它的運算量跟N平方是成正比的,
link |
跟sequence的長度,input sequence的長度的平方是成正比的。
link |
但是假設這個Self-Attention它的運算沒有dominate整個network的運算的話,
link |
那你加快Self-Attention的運算,那可能幫助不一定會很大。
link |
就有很多同學會,他用了這個新的Self-Attention的技術,
link |
在Transformer裡面發現計算的加速還蠻有限的。
link |
那因為很有可能整個network裡面,V-forward的部分,
link |
他所需要耗費的運算量也許根本比Self-Attention大。
link |
那你加快Self-Attention也許幫助就非常有限。
link |
那什麼時候Self-Attention會dominate這整個network呢?
link |
什麼時候這整個network最主要的運算會來自於Self-Attention呢?
link |
當input的sequence,也就是這個N的長度非常長的時候,
link |
整個Transformer裡面最主要的運算就會來自於Self-Attention。
link |
所以今天sequence很長的時候,加快Self-Attention才有幫助。
link |
所以這就是為什麼等一下你會看到的這些Self-Attention的變形,
link |
加快Self-Attention的方式往往最早都是用在影像處理上面。
link |
因為當很多人想要把Self-Attention用在影像處理上面的時候,
link |
怎麼說呢?假設你要處理的是256x256的一張image,
link |
那256x256的image也不是太大的image。
link |
那假設你今天硬是要用Self-Attention處理的話,
link |
如果你要用Self-Attention處理一張圖片,
link |
那你可能會把圖片裡面的每一個pixel當作一個單位。
link |
這個時候你input sequence的長度,
link |
就把這個圖片裡面的pixel全部拉直,變成256x256。
link |
如果今天Self-Attention它的運算量是正比於256x256的平方,
link |
不是只有256平方喔,是256x256再平方,
link |
我們等一下看到的種種Self-Attention的變形,
link |
當input sequence非常長的時候,
link |
以下看到的那些招數才有可能會發揮真正的效用。
link |
好,那有什麼樣Self-Attention的變形呢?
link |
有什麼樣的方法可以加快Self-Attention這個機制的運算呢?
link |
那我們剛才說Self-Attention這個機制的運算,
link |
它最大的bottleneck來自於我們需要計算一個N乘以N的矩陣。
link |
有沒有辦法加快這個N乘以N的矩陣的運算呢?
link |
也許我們並不需要把N乘以N的這個Attention Matrix裡面的每一個數值都計算出來。
link |
也許有一些位置,有一些位置的Attention的value應該是多少,
link |
我們不需要算,我們根據人類對這個問題的理解,
link |
可以直接知道Attention的value應該是多少。
link |
這樣講也許很抽象,我們先舉第一個例子。
link |
有時候我們在做Attention的時候,
link |
有些問題不一定需要看整個sequence,
link |
也許有一些問題在做Attention的時候,
link |
在每一個位置上你只需要看左右的鄰居就可以得到正確的答案,
link |
就可以理解一個Token,一個位置它存有什麼樣的資訊。
link |
所以今天假設我們在做Self-Attention的時候,
link |
其實只有左右的鄰居的資訊是需要知道的,
link |
那也許你可以把更長的距離的Self-Attention的Attention的weight就直接設為0。
link |
你的Attention Matrix可以直接畫成這個樣子。
link |
在這個圖上,灰色的部分代表我們直接把Attention的weight設為0,
link |
就不算了,不需要去計算灰色的位置的Attention weight,
link |
然後你只需要去計算有圖顏色的,不是灰色的,
link |
藍色這個部分的Attention的數值,
link |
因為灰色的部分你都不算用Attention了,
link |
只算藍色的部分,那就可以加快這個矩陣產生的速度。
link |
那像這樣子的方法叫做Local Attention,
link |
或者叫Truncated Attention。
link |
但像這種Local Attention或Truncated Attention,
link |
就是每次你在做Attention的時候,
link |
那這樣子做的話,那Attention跟CNN就沒什麼差別了,對不對?
link |
我們上課的時候其實已經跟大家講過CNN跟Attention的關係。
link |
我們有說,如果今天Attention都是Attend在一個很小的範圍內,
link |
所以如果我們今天用Local Attention,
link |
那就等於是做CNN,那你就直接用CNN就好啦。
link |
所以Local Attention它是一個可以加快Self-Attention運算的方法,
link |
那除了Local Attention以外,還有各式各樣的變形。
link |
比如說有人說,你既然覺得Local Attention不好,
link |
只看鄰居不好,那我們就看比較遠一點的鄰居。
link |
比如說在每一個位置,我們不是看下一個位置的資訊,
link |
和三個位置之後的資訊,三個位置之前的資訊。
link |
那這樣就可以看到比較大的範圍內的資訊。
link |
那如果把它畫成Attention Matrix的話,
link |
你的Attention Matrix就長這個樣子。
link |
那這種方法叫做Stripe Attention。
link |
當你用Stripe Attention的時候,在這個圖上灰色的部分,
link |
我們只計算有圖青色的部分,有顏色的部分。
link |
那有人可能會問說,那為什麼是空兩格,
link |
然後你也可以空三格,這個完全是你自己決定的。
link |
決定說你的Stripe Attention應該要長什麼樣子。
link |
那還有其他的方法,有一個方法叫做Global Attention。
link |
那不管是剛才看過的Local Attention,
link |
還是Stripe Attention,都是以某一個位置作為中心,
link |
看這個位置左右兩邊發生什麼樣的事情。
link |
那如果我們今天想要知道一整個Sequence發生什麼事,
link |
那也許你可以用Global Attention。
link |
那Global Attention是什麼意思呢?
link |
在做Global Attention的時候,
link |
你會在你原來的Sequence裡面,
link |
要做Global Attention。
link |
那Global Attention它會做兩件事。
link |
第一個事情是Global Attention,
link |
它會Attain到Sequence裡面的每一個Token。
link |
它會從Sequence裡面的每一個Token都去收集資訊。
link |
它要做的事情就是先來收集一下整個句子的資訊,
link |
整個input的Sequence裡面發生了什麼樣的事情。
link |
所有人都會去看這個特別的Token,
link |
看看這個特別的Token裡面有發生什麼樣的事情,
link |
它們會Attain到所有的Token,
link |
另外它們會被所有的TokenAttain。
link |
怎麼做這個Global Attention呢?
link |
你在你原來的Sequence裡面就直接Assign一些人,
link |
大家都知道說Vert的每一個句子的開頭,
link |
其實在一般用Transformer來處理文字的時候,
link |
也許我們就直接把那個開頭的Token當作Special Token,
link |
也許我們可以把句號當作Special Token。
link |
所以這種Special Token怎麼來?
link |
你從原來就有的Input Sequence裡面,
link |
今天不管Input的Sequence是什麼,
link |
他們會Attain到所有其他的Token,
link |
所有其他的Token也都會Attain到這兩個Token。
link |
那如果要把它的Attention Matrix畫出來的話,
link |
這一個Input的Sequence裡面,
link |
頭兩個位置就是Special的Token,
link |
叫做Global Attention的Special的Token。
link |
在這一個Attention的Matrix裡面,
link |
全部都是要計算Attention的,
link |
前兩個位置他們代表Special Token,
link |
他們的Query要去Attain到所有其他人的Key。
link |
代表說除了Special Token以外的那些Token,
link |
他們的Query都會Attain到第一個位置跟第二個位置。
link |
每一個不是Special Token的位置,
link |
他們都Attain到Special Token,
link |
現在這個例子裡面是句子前面的前兩個Token。
link |
這個Global Token要Attain到所有人,
link |
其他的Token彼此之間就沒有往來了。
link |
在這個Attention的Matrix裡面,
link |
只有頭兩個Row跟頭兩個Column是有顏色的,
link |
其他位置的Attention直接塗綠色,
link |
其他的Token不是Special Token,
link |
彼此之間互相就不做任何Attention,
link |
Special Token就是Token中的里長伯。
link |
這個就是Special Token的作用。
link |
這個是Global Attention,
link |
決定的這一種Self-Attention的Matrix,
link |
有Stride的Attention,
link |
有Global的Attention,
link |
一個Self-Attention裡面,
link |
它是有Multiple Head的,
link |
有的Head是Local Attention,
link |
有的Head是Stride Attention,
link |
有的Head是Global Attention,
link |
這個Self-Attention的變形,
link |
Long-Former就是把Local Attention,
link |
加Stride Attention,
link |
加Global Attention,
link |
這個Self-Attention的變形,
link |
那Big Bird其實就是Long-Former,
link |
加Random Attention,
link |
就是原來Long-Former裡面的東西,
link |
它有Local Attention,
link |
有Global Attention,
link |
叫做Random Attention,
link |
至於這個Random Attention,
link |
可以看一下Big Bird這篇Paper,
link |
為什麼要有這個Random的Attention,
link |
哪一些位置就不需要算Self-Attention,
link |
也許人類設計的這些Attention,
link |
哪一些地方不需要算Attention,
link |
而是用Data-Driven的方法呢?
link |
今天在一個Self-Attention的Matrix裡面,
link |
它的Value,Attention的Weight就是特別大,
link |
它的Attention的Value就是特別小。
link |
其實你可以把Attention的Value特別小的位置,
link |
把Attention的Value特別小的位置,
link |
也許對你這樣子有變成0跟沒有變成0,
link |
那也許我們簡化以後的Attention,
link |
在一個Attention的Matrix裡面,
link |
我們猜它可能本來Attention的Value就會很小,
link |
哪些位置可能有大的AttentionValue,
link |
哪些位置可能有小的AttentionValue,
link |
在Reformer跟Routing Transformer,
link |
他們用了Clustering這個技術,
link |
就是你先把你的Query跟Key拿出來,
link |
它們相近的程度做Clustering,
link |
比較遠的就屬於不同的Cluster,
link |
我們把Query跟Key做Clustering,
link |
在這個例子裡面分成四個Cluster,
link |
如果今天Clustering這件事情,
link |
也跟Sequence的平方有關的話,
link |
也許根本沒有辦法加速Search Attention的運算,
link |
Clustering有很多可以加速的方法,
link |
所以這邊在做Clustering的時候,
link |
來把這一些Query跟Key的Vector進行分群,
link |
那在Reformer還有Routing Transformer裡面,
link |
就採取了不同的Clustering的方法,
link |
來快速的把相近的Query跟Key,
link |
那把Query跟Key歸在同一群裡面以後,
link |
我們才去計算Attention的位置,
link |
這個紅色的Query跟這三個Key,
link |
紅色的這個Query跟其他的這五個Key,
link |
直接把它們的Attention設為零,
link |
它跟另外這兩個Key在同一個Cluster裡面,
link |
所以只有這兩個位置需要計算Attention,
link |
這整個Attention的Matrix裡面,
link |
只有屬於同一個Cluster的Query跟Key,
link |
我們才計算它的Attention位,
link |
那這樣就可以加快這個Attention的Matrix的計算。
link |
好,那這個是Clustering的方法。
link |
我們怎麼決定哪一些位置要計算Cluster,
link |
不管是前面我們講的Local Attention, Global Attention,
link |
Clustering是假設說比較近的Vector,
link |
我們才去計算它的Attention,
link |
那有沒有辦法把要不要計算Attention這件事情,
link |
有一個方法叫做Synhome Sorting Network,
link |
哪些地方要不要計算Attention,
link |
我們直接用Learn的來決定這件事情。
link |
所以呢,我們要計算Attention的時候,
link |
那這邊呢,塗深色的代表1,塗淺色的代表0,
link |
只有塗深色的地方需要去計算Attention,
link |
淺色的地方就當作Attention是0,
link |
所以哪一個Key要跟哪一個Query計算Attention,
link |
哪一些地方要計算Attention都是人決定的,
link |
但是在Synhome Sorting Network裡面,
link |
他決定直接Learn一個Network,
link |
來決定哪些地方需要計算Attention。
link |
這個是你的Input Sequence,
link |
然後呢,你把Input Sequence的每一個Position,
link |
通過一個Network產生一個Vector,
link |
這個Vector的長度要跟你的Sequence一樣,
link |
所以Input Sequence的每一個Vector,
link |
跟你的Attention的Matrix一樣。
link |
可是這個決定要不要計算Attention的Matrix,
link |
那可是Network的Output,
link |
那這就是這篇Network的一個重點,
link |
把這個本來不是Binary的Matrix,
link |
所以最後你在Train這個NN的時候,
link |
它是跟你的整個Network一起Train出來的,
link |
從Continuous的Matrix,
link |
變成Binary的Matrix的這個過程,
link |
Syntax Sorting Network是怎麼運作的,
link |
什麼位置要不要計算Attention。
link |
這個是Syntax Sorting Network。
link |
它會不會和原本Tension的很像,
link |
如果在這個Syntax Sorting Network。
link |
我們不直接Output Attention的Matrix呢?
link |
所以這個Syntax Sorting Network的同一批作者,
link |
直接Output Attention的Weight就好啦,
link |
本來Synthesizer是在這個投影片的最後一頁,
link |
這樣的話不是對於感覺有點喪失了Attention的那個計算很快速的性質,
link |
就是它變成每一個Input它就要去算個恩恩,
link |
欸,我們今天用恩恩來產生這個Matrix,
link |
它真的會比原來用Key跟Value算出這個Attention Matrix還要快嗎?
link |
假設我們每一個Input我們都要產生一個Vector,
link |
其實你的運算量跟原來的Attention Matrix其實差不多的,
link |
在Synthome Sorting Network裡面,
link |
好幾個Input的Vector會共用同一個Vector,
link |
也就是說假設你Input一個很長的Sequence,
link |
10個Vector一起通過Network以後產生一個Vector,
link |
那10個Vector要共用同一個Vector,
link |
也就是那10個Vector最後會共用同一個Column,
link |
同樣不要算Attention的地方。
link |
所以說產生出來的這個NN的Matrix,
link |
對,就假設你這邊本來要算100x100的Matrix,
link |
就你Attention其實是100x100的Attention,
link |
但是在Synthome Sorting Network裡面,
link |
到目前為止都想要產生一個NxN的Matrix,
link |
只是我們說NxN的Matrix裡面,
link |
但是我們真的需要一個NxN的Attention Matrix嗎?
link |
如果你真的把這個Attention的Matrix拿出來看,
link |
你會發現裡面有很多Redundant的Color,
link |
我是特別畫很多Color的Value都是一樣的,
link |
他去計算這個Attention Matrix的Rank,
link |
這些Attention的Matrix其實都是LowRank的Matrix,
link |
這個Attention的Matrix很多Color都是Dependent的,
link |
很多Color可能是其他Color做Duplicate,
link |
或是其他Color的Linear Combination。
link |
也許我們根本不需要一個N乘以N的Matrix,
link |
因為這個N乘以N的Matrix裡面,
link |
那我們能不能夠把某一些重複的Color就把它拿掉,
link |
產生一個比較小的Attention Matrix,
link |
我們只計算這個比較小的Attention Matrix,
link |
那我們就可以加快Attention這件事情的運算速度。
link |
那這個就是Link Format這篇Paper要做的事情。
link |
每一個都拿來跟Query計算的Attention太多了,
link |
也許我們只需要選最具代表性的K跟Key出來就好了。
link |
你就不需要算一個完整的N乘以N的Attention Matrix了,
link |
你就可以把這個Attention的Matrix變瘦,
link |
我們只算一個N乘以K的Attention Matrix。
link |
那產生這個Attention Matrix以後,
link |
接下來你要怎麼用這個Attention Matrix,
link |
產生Self-Attention Layer的Output呢?
link |
你一樣要挑出K個具代表性的Value。
link |
每一個Key其實都有一個對應的Value Vector,
link |
但你有K個Value Vector。
link |
你把K個Key對第一個Query Vector算出來的Attention Weight,
link |
對這K個Vector做Weighted Sum,
link |
把這四個Value再跟K個Vector,
link |
把這K個Value跟這四個Vector再做Weighted Sum,
link |
你就可以得到整個Self-Attention Module的Output。
link |
為什麼我們不選有代表性的Query呢?
link |
我們為什麼不能把Query的數目也變成另外一個數值,
link |
那這樣子我們的Attention Matrix不是變得更小,
link |
你確實也可以把Query的數目變少,
link |
你確實也可以只選有代表性的Query,
link |
你會遇到你的Output Sequence的Length就縮短了對不對?
link |
因為你Output Sequence的Length跟你的Query的Length是一樣的。
link |
那你Output Sequence就變成原來的一半。
link |
有些任務是讀一整個Sequence,
link |
那就是大家在作業裡面做的Speaker Classification,
link |
你真的可以選有代表性的Query出來就好了。
link |
但是假設你今天的任務是Input Sequence裡面的每一個位置,
link |
你都需要Output一個Label,
link |
像我們在作業2裡面做的Phoning的Classification,
link |
就是每一個Friend你都要給他一個Phoning的Label。
link |
假設你今天Output的長度變短了,
link |
那你的Label的數目不就有錯了嗎?
link |
所以假設你今天你需要每一個位置都下一個Label,
link |
每一個位置都做一遍Classification給他一個Label,
link |
你沒有辦法只選有代表性的Query出來。
link |
有一篇Paper叫做Compress Attention,
link |
他做的事情是說,你Input很多的很長的一個Key的Sequence,
link |
那你用CNN來掃過一個Sequence以後,
link |
這個Sequence的長度就變短了,
link |
那這個短的Sequence就當作是有代表性的Key。
link |
所以我們可以用CNN來把一個長的Sequence變成短的Sequence,
link |
那把短的Sequence當作有代表性的Key。
link |
那另外一個是Link Form的這篇Paper裡面的做法,
link |
他說Input的這些Key集合起來,
link |
那把這個D乘以N的矩陣去乘一個N乘以K的矩陣,
link |
把D乘以N的矩陣乘上N乘以K的矩陣,
link |
它的每一個Column,它的K個Column,
link |
你會知道說,把這個D乘以N的矩陣乘上這個N乘以K的矩陣,
link |
你實際上做的事情是,這邊這K個Vector,
link |
都是這N個Vector的Linear Combination。
link |
你把這N個Vector做不同的Linear Combination,
link |
做K種不同的Linear Combination,
link |
所以可以說,如果你從Link Forward的時候,
link |
做不同方式的Linear Combination,
link |
這個就是Link Forward在做的事情。
link |
其實Attention的整個Process,
link |
它其實說穿了,就是一連串矩陣的相乘。
link |
Attention這一個Mechanism,
link |
而假設Input,我們當作一個Matrix叫做I。
link |
我們會把I這個大I這個Matrix,
link |
乘上一個Linear Transform,
link |
D是你的Query Vector的Dimension。
link |
那同樣的道理,I乘以另外一個Transform,
link |
把I乘上另外一個Transform,
link |
那把所有的Value Vector集合起來,
link |
它們的Dimension必須要一樣啦,
link |
Dimension不一樣不能做大發達。
link |
你會直接就把它們Dimension設成一樣,
link |
特別說Value的Vector是Dπ,
link |
Query跟Key的這個Dimension都是D,
link |
你會把Key乘以一個Transpose,
link |
得到一個Attention的Matrix,
link |
所以整個Attention的Mechanism,
link |
就是Input一個Sequence表示成I,
link |
Output另外一個Sequence表示成O,
link |
我們先假設我們沒有做Softmax這件事情。
link |
它就是K的Transpose乘上Q。
link |
所以其實做Attention這件事情,
link |
就是把V跟K的Transpose跟Q,
link |
我們就得到Self-Attention Module的Output,
link |
這個K的Transpose是一個N乘以D的矩陣,
link |
Transpose以後就變成N乘以D。
link |
然後我們先把Q跟K的Transpose進行相乘以後,
link |
我們得到O,它就是一個D'乘以N的矩陣,
link |
這是Self-Attention做的事情。
link |
我們先把K的Transpose跟Q乘起來,
link |
先把V跟K的Transpose相乘,
link |
同樣是V乘以K的Transpose乘以Q,
link |
先把K的Transpose乘Q再乘V,
link |
跟先把V乘以K的Transpose再乘Q,
link |
如果你沒有修過我的線性代數也沒有關係,
link |
這邊把N乘以D的矩陣乘上D乘以N的矩陣,
link |
就是第一個矩陣的RAW的數目乘上第一個矩陣的COLUMN的數目乘上第二個矩陣的COLUMN的數目。
link |
就是把兩個矩陣相乘的時候需要做的乘法次數。
link |
就是我們的Attention Matrix。
link |
把Attention Matrix再乘上V,
link |
就是第一個矩陣的RAW的數目乘COLUMN的數目再乘第二個矩陣的COLUMN的數目。
link |
V乘以A的時候乘法的次數是D'乘以N乘以N。
link |
你的這個乘法的次數跟N平方是乘正比的。
link |
那如果我們今天交換一下乘法的順序會變成怎樣呢?
link |
把V乘上K的乘透需要的乘法的次數是D'乘以N乘以D。
link |
非常直覺是一個attention的matrix。
link |
這是兩倍的D'乘以D乘以N次的乘法。
link |
所以你發現說當我們改變矩陣相乘的順序的時候,
link |
其實我們需要的乘法的次數是有很大的差距的。
link |
這個時候我們得到這個O的乘法次數是D加D'乘以N平方。
link |
我們需要的乘法的次數是遠大於V跟K先相乘的。
link |
不要忘了這個N是sequence的長度,
link |
所以D加D'的N平方可能會遠大於兩倍的D'乘以D乘以N。
link |
所以其實我們只要改變矩陣相乘的順序,
link |
如果你沒有那麼喜歡看到數學的notation的話,
link |
講到這邊你可以當作你已經知道我要講的東西是什麼了,
link |
因為你覺得拿掉softmax讓你覺得有點不爽的話,
link |
接下來告訴你放回softmax是怎麼樣運作的。
link |
原來的self-attention是怎麼被計算的?
link |
原來self-attention是說,
link |
如果要計算input sequence是A1到A4,
link |
如果你要計算第一個位置的輸出B1的話,
link |
你會把第一個位置的query Q1,
link |
跟所有位置的key算個attention,
link |
再把alpha prime跟每一個位置的value vector,
link |
所以B1是summation over i等於1到n,
link |
然後把alpha 1i prime,就是Q1跟每一個key的attention的value,
link |
這是有經過softmax normalize以後的value,
link |
然後把這些value對V1做weighted sum得到B1。
link |
如果你想要把它的計算過程算出來的話,
link |
它是分子的地方是Q1跟Ki做大quota,
link |
分母的地方是summation over整個sequence,
link |
把Q1對整個sequence裡面所有的key,
link |
都做大quota,成exponential,
link |
做大quota,去exponential,
link |
然後再對Vi做weighted sum。
link |
這些是原來的self-attention的計算過程。
link |
首先exponential Q跟K的大quota,
link |
可以拆解成phiQ跟phiK的大quota。
link |
你有一個transform叫做phi,
link |
他會給你另外一個vector叫做phiQ。
link |
得到phiQ跟phiK兩個vector,
link |
把這兩個vector做大quota,
link |
就是可以讓exponential Q跟K的大quota,
link |
等於phiQ跟phiK的大quota。
link |
你就可以把這邊所有的exponential,
link |
exponential Q1Ki的大quota,
link |
exponential Q1Kj的大quota,
link |
這邊有一個summation over i等於1到n,
link |
所以可以把它拿到summation i等於1到n的外面。
link |
分母的地方是summation j等於1到n,
link |
分子的地方是summation i等於1到n,
link |
那summation i等於1到n的時候,
link |
我們會對phi做weighted sum,
link |
這個weight是phiQ1跟phiKi的大quota。
link |
我們這邊summation j等於1到n,
link |
你會發現phiQ1其實跟j沒有關係,
link |
summation j等於1到n的phiKj啊,
link |
它是vi的weighted sum,
link |
那weight就是phiQi跟phiKi的大quota。
link |
展開的話,就是phiQ1.phiK1乘以v1,
link |
但phiQ1.phiK1這個是一個scalar哦,
link |
這個weight是一個數值,乘上v1,
link |
加上phiQ1.phiK2乘上v2,
link |
我們把它裡面每一個component展開的話,
link |
呈現出來用notation來表示的話,
link |
我們把phiQ1表示成Q上標1下標1,
link |
第二個component就是Q上標1下標2,
link |
所以呢,我們phiQ1到phiK1,
link |
v1到vn的linear combination,
link |
另外一組linear combination。
link |
就是v1到vn的weighted sum,
link |
那你把v1到vn用另外一組weight
link |
他是看5Q1的dimension的。
link |
其實就是看5Q1的dimension有多少。
link |
所以假設5Q1的dimension是大N的話,
link |
那這每一個vector都乘上一個weight,
link |
這個weight是Q1.1,Q1.2,
link |
如果5Q1有N個dimension的話。
link |
他們是第一個value vector的linear combination,
link |
所以實際上分子的地方做的事情是什麼呢?
link |
你先把你所有的value vector拿出來,
link |
你有大N個value vector,
link |
跟input sequence的長度是一樣的。
link |
然後把他們通過find這個function
link |
把這些向量的第一個element都拿出來,
link |
對大N個value vector做weighted sum,
link |
就得到這一個矩陣裡面的第一個vector。
link |
然後把這些5K的第二個element拿出來,
link |
所以他們的第二個element總共有N個數值。
link |
對V1到VN做weighted sum,
link |
你就得到這邊的第二個vector一次類推。
link |
那如果5K的dimension是大N的話,
link |
就只是比較複雜的數學運算跟notation而已,
link |
我們在計算第一個位置的output的時候,
link |
跟第一個位置有關的只有query的vector而已。
link |
還有放在分母的地方的這個黃色的向量,
link |
其實跟V1的這個1是沒有任何關係的。
link |
還有把這個黃色的vector求出來,
link |
你只需要把這些藍色的vector複製過來,
link |
再乘上findQ2,你就計算出V2了。
link |
所以這個藍色的vector跟黃色的vector,
link |
跟原來的self-attention,
link |
我們input是一個sequence A1到A4,
link |
每一個input的位置都產生K跟V,
link |
你先把K都通過一個transform,
link |
第一個dimension的element拿出來,
link |
對V1到V4做weighted sum,
link |
第二個dimension的element拿出來,
link |
去跟V1、V2、V3、V4做weighted sum,
link |
你這個5K有多少的dimension,
link |
那每一個dimension都會產生一個vector出來,
link |
每一個dimension都會產生一個vector出來,
link |
有M的dimension就產生M的vector。
link |
在process整個sequence的時候,
link |
Q1要通過一個transform變成5Q1,
link |
接下來把5Q1的第一個dimension
link |
第二個dimension乘上第二個vector,
link |
Q跟K他們通過這個transform,
link |
5以後他們的dimension是一模一樣的,
link |
所以Q有M個value在他的vector裡面,
link |
把這M個value乘上這M個vector
link |
那分母這一項其實也是非常類似的概念,
link |
然後你就可以把B1的分子這一項算出來,
link |
你把Q2過一個transform得到5Q2,
link |
然後把5Q2的每一個dimension的value
link |
拿去對這M個vector做weighted sum,
link |
5Q2的第一個dimension乘上第一個vector,
link |
第二個dimension乘上第二個vector,
link |
有M個dimension正好乘M個vector,
link |
你就先把M個vector算出來以後,
link |
如果你想要理解一下這個東西有什麼意思的話,
link |
之前做self-attention非常的直觀,
link |
你可以說我們就是要找哪一個位置跟哪一個位置有關聯,
link |
這邊要強調一下這個做法跟一般的self-attention
link |
然後我們把它做weighted sum,
link |
這整個sequence裡面總共有M個重要的template,
link |
就是拿這些template做linear combination,
link |
那產生這個fineQ是要去這M個template裡面
link |
那這個template是整個sequence每一個位置都共用的,
link |
這M個template產生出來以後,
link |
每一個位置選擇不同的template組合起來作為輸出。
link |
也許這是一個可以理解這種新的self-attention運算方法的概念。
link |
那exponential Q.K怎麼拆解成fineQ.fineK呢?
link |
所以不管是efficient attention,
link |
linear transformer,
link |
random feature attention,
link |
他們做的都是我剛才前幾個投影片跟你講的簡化,
link |
不一樣的地方就是怎麼把exponential Q.K拆成fineQ.fineK。
link |
好,那接下來我們就可以再進一步思考,
link |
如果要產生self-attention,
link |
一定要用Q跟K做inner product來產生attention嗎?
link |
你可以參考一個做法叫做synthesizer,
link |
synthesizer做法是這個樣子的,
link |
你要做self-attention,
link |
你的目標是input一個sequence,
link |
output另外一個sequence,
link |
那我們先把input的sequence每一個位置產生一個value vector,
link |
接下來跟一般的self-attention一樣,
link |
我們把這些value vector做weighted上,
link |
而這些value一樣是本來有一個attention的matrix,
link |
這個matrix做完softmax以後,
link |
可以得到normalized以後的value,
link |
normalized的value做weighted上,
link |
那跟一般的self-attention不一樣的地方是,
link |
在synthesizer裡面不需要Q跟K,
link |
其實在synthesizer裡面有兩個不同的版本,
link |
有一個版本跟那個synthome sorting level很像,
link |
他就是拿A1到A4去產生這個matrix,
link |
把這個matrix當作network的一部分,
link |
這個matrix裡面有n乘以n個數值對不對,
link |
這n乘以n個數值就是network裡面的n乘以n個參數,
link |
我們知道network裡面如果neuron有weight有bias嘛,
link |
現在多加了attention weight,
link |
attention weight是network的參數,
link |
這樣你在做self-attention的時候,
link |
你連計算attention weight這個步驟都免了,
link |
沒有計算attention weight這件事了,
link |
他本來就已經在network裡面了,
link |
如果attention weight是network的參數,
link |
那不是input不同的sequence,
link |
那個attention的weight都是一樣的嗎?
link |
所以這個synthesizer讓我們重新思考,
link |
到底attention的價值是什麼,
link |
過去我們會覺得input不同的sequence,
link |
attention的matrix應該不一樣,
link |
但是當我們把attention的matrix
link |
作為network的參數一部分的時候,
link |
因為network的參數不會隨著input不一樣的不一樣嘛,
link |
這代表attention的matrix,
link |
不管input是什麼永遠都是一樣的,
link |
那這樣performance其實是不會掉太多的,
link |
這重新讓我們思考attention的價值到底是什麼,
link |
處理sequence一定要用attention嗎?
link |
有沒有attention-free的方法,
link |
過去人們已經丟掉了recurrent,
link |
接下來人們要丟掉attention,
link |
就是一般的Fully Connected Network,
link |
這一張圖是Long Range Arena,
link |
就是我們說這個self-attention有一個Benchmark的Compass,
link |
叫做Long Range Arena,
link |
你可以去計算一個self-attention的方法,
link |
代表這個self-attention的方法表現越好,
link |
就是每一秒鐘可以處理多少個sequence,
link |
代表這個方法需要用到的memory越大,
link |
最原始的self-attention,
link |
然後把各種不同人設計的attention放在一起,
link |
比原來的Transformer好一點,
link |
Synthesizer就是我剛才說的,
link |
Reformer就是做clustering的方法,
link |
看起來其實他performance不一定很好喔,
link |
Local Attention就是一個速度很快,
link |
但是performance有點慘的方法,
link |
來決定說哪些位置要上Attention,
link |
相較於原來的Transformer,
link |
還有Linear Transformer,
link |
他們的performance相較於原來的Transformer,
link |
相較於原來的Transformer,
link |
跟Linear Transformer,
link |
Linear Transformer不是Linformer這樣,
link |
並不是Linear Transformer的縮寫,
link |
而Linear Transformer跟Performer,
link |
這就是Linear Transformer跟Performer,
link |
我們就把Long Range Arena裡面的每一種Transformer都介紹過了,