Transformer论文解读
簡介
近年來,注意力(Attention)機制被廣泛應用于計算機視覺和自然語言處理領域,僅 CVPR2020 接收的論文中,使用到 Attention 的文章達到 60 篇。隨著 Attention 的廣泛研究,很多不同的 Attention 方法被提出,谷歌機器翻譯團隊于 NIPS2017 發表的《Attention is all you need》引起了廣泛的關注,其中,大量使用自注意力機制(self-attention)構建 Transformer 結構,自此自注意力成為了研究熱點并在各種任務取得了相當優秀的結果。
-
論文標題
Attention Is All You Need
-
論文地址
https://arxiv.org/abs/1706.03762
-
論文源碼
https://github.com/tensorflow/tensor2tensor
背景
Attention 機制最早出現于計算機視覺領域,《Neural Machine Translation by Jointly Learning to Align and Translate》首次利用 Attention 機制在機器翻譯上將翻譯與對齊同時進行,這也是首次 Attention 機制被用在 NLP 任務中,隨后以 Attention 機制為基礎的神經網絡模型被廣泛使用在 NLP 領域。2017 年,谷歌機器翻譯團隊提出 Transformer,大量使用自注意力機制而放棄 RNN 和 CNN 學習文本表示。到 2020 年,已經有不少研究將自注意力機制帶回到計算機視覺任務中,并取得了不錯的成果,如 2020 年的《End-to-End Object Detection with Transformers》將自注意力引入目標檢測中。
注意力機制(Attention Mechanism)
Attention 機制本質上來自于人類的注意力感知機制,當人們用肉眼感知事物的時候并不會從頭到尾每次都看全視野中的內容,而是根據需求注意特定的一部分,當習慣于場景中某個部分出現自己感興趣的東西時,人類會學會下次出現類似場景時將注意力移到該部分(由于這個學習過程幾乎就是本能,我們很少注意這個過程)。例如,看到如下這個圖像,我們第一眼關注的就是圖像中的貓而不是周圍的綠葉和露水,這就是我們的大腦長期“訓練”的結果。
視覺注意力分好幾種,其核心思路是基于原有的數據找到其之間的關聯性然后突出某些重要的特征(即將有限的注意力放到更重要的信息上從而防止“遺忘”),一般有通道注意力、像素注意力、自注意力等,其應用領域如用于捕捉圖像上的感受野等。在實現上,attention 算法其實有很多種,但其本質都可以概括為加權求和。
Transformer 解讀
Transformer 是一個典型的基于自注意力的 seq2seq 模型,就如論文題目《Attention is all you need》所說,在該模型中不會出現 RNN 和 CNN 結構,有的只是一個自注意力模塊以及前饋網絡。
自注意力模塊
此前,對于針對序列數據的建模多采用 RNN 及其變種(包括 LSTM、GRU 等)或采用復雜堆疊的 CNN,RNN 的思路如下圖左側,其中aia^iai表示輸入序列的第 i 個位置的特征,bib^ibi表示對應的輸出,RNN 的原理這里不多提及,它的后一個輸出是依賴前面輸出的信息的,所以 RNN 的推理只能串行,self-attention 能得到同樣的輸出,但可以并行計算。
上圖右側就是自注意力模塊的黑盒模型,顯然,各個輸入之間的關系通過自注意力模塊捕捉到了,那么具體是如何實現的呢?
首先,基于原始的 Attention,定義三個向量,分別為qqq(query,與其他的進行匹配),kkk(key,被其他的匹配)以及vvv(value,提取到的特征信息),它們的計算式如下。
qi=Wqaiq^{i}=W^{q} a^{i}qi=Wqai
ki=Wkaik^{i}=W^{k} a^{i}ki=Wkai
vi=Wvaiv^{i}=W^{v} a^{i}vi=Wvai
其示意圖如下圖,注意,對每個不同的輸入提取q,k,vq,k,vq,k,v的權重WWW是相同的,這就是為什么后面使用multi-head結構的一個原因。
通過權重學習到了每個輸入的q,k,vq,k,vq,k,v向量后,接著就是計算當前輸入的aia^iai得到的qiq^iqi與所有kj(j∈(1,4))k^j(j\in{(1,4)})kj(j∈(1,4))之間的Attention α1,j\alpha_{1,j}α1,j?,計算方式采用Scaled Dot-Product Attention,計算式如下,其中dot-product表示點積,scaled表示通過除以d\sqrtozvdkddzhkzdd?進行尺度調整,原因是如果query和key的每一個元素是mean=0,std=1,那么dot product的mean=0,std=d0.5mean=0,std=d^{0.5}mean=0,std=d0.5,所以除以d0.5d^{0.5}d0.5可以normalize dot product。
α1,i=q1?ki/d\alpha_{1, i}=q^{1} \cdot k^{i} / \sqrtozvdkddzhkzdα1,i?=q1?ki/d?
這樣,每個輸入的aia^iai都會輸出nnn(n是輸入a的數目或者維度)個輸出α1,j\alpha_{1, j}α1,j?,將它們softmax后得到的α1,j^\hat{\alpha_{1, j}}α1,j?^?與對應的kjk_jkj?點乘后求和,即得到對應的輸出bib^ibi,示意如下圖。
所有的bib^ibi組合到一起,就是類似上面RNN的輸出,可以看到,每個bbb都與其他的輸入產生運算后得到輸出,也就是說每個位置的輸出都包含了與其他位置的相關性信息,這就是自注意力。
多頭注意力
顯然,上述這個過程是可以矩陣化的,也就是可以GPU并行加速。上面這個這么復雜的操作其實引入的權重只有提取q,k,vq,k,vq,k,v的三個WWW矩陣,這顯然只能學到一種任務有關的信息,要想學到更豐富的信息,就是使用更多的q,k,vq,k,vq,k,v提取方法,這就是multi-head self-attention,它的思路就是反復進行自注意力,得到多種bbb輸出。因此,就像李宏毅老師PPT中下圖所示的,不同的head只有輸入aaa是共享的,每個head的qqq只能與當前head的kkk和vvv進行運算得到不同的bjb^{j}bj(j最大為head數),最后concat到一起再通過一個權重矩陣進行降維得到bib^ibi。
位置編碼
使用multi-head有助于捕獲不同類型的特征,但是縱觀上面的attention過程,可以發現,每個輸入都會去與所有的輸入得到的信息進行運算,所以這個過程可以矩陣化并行,但是,這就帶來一個很嚴重的問題:順序信息的丟失,也就是位置信息的丟失。 舉個例子,對某個單詞而言,只使用詞嵌入作為輸入的話,它與某個單詞計算attention,那無論這個單詞在它前面還是后面,得到的信息都是一樣的(本質上沒有區別),這顯然不合理,對NLP而言,語序是一個非常重要的信息。
那么Transformer如何解決這個問題的呢?它通過引入一個與詞嵌入同維的位置編碼向量來補充位置信息。這個位置編碼怎么理解呢,其實也就是對一個輸入的不同位置對應的不同的embedding加上一個表示位置信息的向量eie_iei?(若對(n,512)(n,512)(n,512)的輸入,那n個位置每個位置的位置編碼都是一個512維的向量),此時ei+aie_i+a_iei?+ai?才是真正的輸入,它參與后面自注意力計算的過程。
不過,在原始的論文中,這個eie_iei?是人為設定的,關于為什么直接加到輸入上而不是concat到輸入上,李宏毅老師以onehot形式的位置編碼進行了推導,本質是它們就等同于concat的計算,不會導致位置信息混入特征向量中。
不過,這個位置編碼(Position Encoding,PE)在原始的Transformer中式手工設計的,它的計算公式如下,其中pos表示當前token在序列中的位置,如第一個詞位置為0。下面的iii(嚴格來說2i2i2i和2i+12i+12i+1)則表示位置編碼某個位置的元素,iii的取值范圍是(0,dmodel/2)(0, d_{model} / 2)(0,dmodel?/2),以位置1為例,其位置編碼則為下面第三個式子。
PE(pos,2i)=sin?(pos/100002i/dmodel?)PE(pos,2i+1)=cos?(pos/100002i/dmode?l)\begin{aligned} P E_{(p o s, 2 i)} &=\sin \left(p o s / 10000^{2 i / d_{\text {model }}}\right) \\ P E_{(p o s, 2 i+1)} &=\cos \left(p o s / 10000^{2 i / d_{\text {mode }} l}\right) \end{aligned} PE(pos,2i)?PE(pos,2i+1)??=sin(pos/100002i/dmodel??)=cos(pos/100002i/dmode??l)?
PE(1)=[sin?(1/100000/512),cos?(1/100000/512),sin?(1/100002/512),cos?(1/100002/512),…]P E(1)=\left[\sin \left(1 / 10000^{0 / 512}\right), \cos \left(1 / 10000^{0 / 512}\right), \sin \left(1 / 10000^{2 / 512}\right), \cos \left(1 / 10000^{2 / 512}\right), \ldots\right] PE(1)=[sin(1/100000/512),cos(1/100000/512),sin(1/100002/512),cos(1/100002/512),…]
上面這個式子有一個玄學的地方,就是這個底為什么選10000,這點論文中也沒有說明白。位置編碼的好處是,序列中每個位置會有一個唯一的編碼,且對于超出設定的位置也可以通過計算得到對應編碼。不過后來也誕生了一些新的位置編碼設計思路,如可學習的位置編碼、二維位置編碼等。
Transformer
上面理清了Transformer的一些核心結構和模式,下面就來看看這個模型究竟是怎樣的。
通過上述的自注意力模塊堆疊而成的Transformer模型如下圖,左側表示編碼器,右側表示解碼器。首先看編碼器部分,詞嵌入和位置編碼相加后輸入多頭注意力模塊,該模塊上文已經分析了,隨后的Add和Norm分別表示殘差連接和layer norm,該結構重復N次后輸入一個feed forward網絡得到encoder 的輸出。顯然,encoder的輸出和輸入是一樣的,即都是(n,dmodel)(n,d_{model})(n,dmodel?),encoder的結果可以理解為對各個位置信息的一次集成精煉后的內容信息。
再看右側的解碼器部分,輸入的outputs是前一個time step得到的output,它和位置編碼相加之后進入重復N次的一個塊中。這個塊首先是一個Masked Multi-Head Self-attention(這個所謂的mask是限制模型只會對已經產生的序列做attention,這是很常規的思路,不存在的東西怎么能做attention呢),經過這個Masked Multi-Head Self-attention得到的輸出作為query進入后面的Multi-head Attention中,這里的key和value就是encoder的輸出,之后就是正常的前向網絡和做任務的head了。這里需要注意的是,編碼(encoder)可以并行計算,一次性全部計算出來,但解碼(decoder)不是一次把所有序列解出來的,而是像RNN一樣一個一個解出來的,因為要用上一個位置的輸出當作attention的query。
雖然是這么說,但是實際上訓練時是可以直接并行計算出來的,但是推理時不行,否則就是一種作弊(向后看),因此引入mask來隱藏不該看到的信息。
因此,從整體上看,Decoder的Key和Value其實來自Encoder的輸出,所以可以看做句子或者圖像的內容信息,而Query表達了一種查詢要求,即我希望查到什么結果,可以看做引導信息。將它們通過多頭注意力結合在一起的過程就相當于是把我們需要的內容信息通過指導信息查詢出來。顯然,聰明的同學已經發現了,這個Query其實可操作空間非常大(賦予其特殊的含義),事實上后來不少工作都是在Query上做的文章,如DETR等。
DETR
Facebook提出的《End-to-End Object Detection with Transformers》,簡稱DETR,將目標檢測直接作為一個集合預測問題來處理,它由一個Transformer encoder-decoder作為核心結構,通過基于集合的全局損失進行訓練,該全局損失通過二分匹配強制進行唯一預測。給定固定的學習對象查詢集,則DETR會依據對象與全局圖像上下文之間的關系,并行輸出最終的預測集,因而效率很高。
其pipeline如下圖,官方開源代碼鏈接給出。
總結
雖然 Transformer 的本質結構就是 Attention 和全連接的堆疊,但是其設計思路因徹底放棄 RNN 和 CNN 已經足夠超前了,值得深度學習研究者品味;在速度方面,并行化的推理速度遠超了 RNN 這種模型,同時也使得以超長序列為輸入的任務成為可能,并行結構也是最適合 GPU 加速運算的結構。
雖然粗暴地放棄 RNN 和 CNN 是挺“狂妄”的,但是 local 信息的獲取能力就丟失了,因此現在,組合 Transformer 和 RNN 及 CNN 是更好的選擇;而且,Transformer 通過位置編碼補充了順序信息,該位置編碼是固定得出的,對其他任務未必合適,這也是該結構優化需要考慮的。
補充說明
本文對近幾年在 CV 中有著不錯潛力的 Transformer 結構進行較為通俗粗淺的分析,文章部分的示例圖片參考了李宏毅老師關于 Transformer 的解讀視頻這是一節非常不錯的課,相對 Transformer 深入理解的可以去看看該視頻或者Transformer的原論文,相關 PPT 可以評論或者私信我獲取。國外一個大佬也寫了很不錯的解析博客,英文不錯的也可以看看。
總結
以上是生活随笔為你收集整理的Transformer论文解读的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Markdown-VScode打造Mar
- 下一篇: SciencePlots科研绘图