自注意力與 Transformer
簡介
近年來,注意力(Attention)機制被廣泛應用於計算機視覺和自然語言處理領域,僅 CVPR2020 接收的論文中,使用到 Attention 的文章達到 60 篇。隨着 Attention 的廣泛研究,很多不同的 Attention 方法被提出,谷歌機器翻譯團隊於 NIPS2017 發表的《Attention is all you need》引起了廣泛的關注,其中,大量使用自注意力機制(self-attention)構建 Transformer 結構,自此自注意力成爲了研究熱點並在各種任務取得了相當優秀的結果。
背景
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 的思路如下圖左側,其中表示輸入序列的第 i 個位置的特徵,表示對應的輸出,RNN 的原理這裏不多提及,它的後一個輸出是依賴前面輸出的信息的,所以 RNN 的推理只能串行,self-attention 能得到同樣的輸出,但可以並行計算。
上圖右側就是自注意力模塊的黑盒模型,顯然,各個輸入之間的關係通過自注意力模塊捕捉到了,那麼具體是如何實現的呢?
首先,基於原始的 Attention,定義三個向量,分別爲(query,與其他的進行匹配),(key,被其他的匹配)以及(value,提取到的特徵信息),它們的計算式如下。
其示意圖如下圖,注意,對每個不同的輸入提取的權重是相同的,這就是爲什麼後面使用multi-head結構的一個原因。
通過權重學習到了每個輸入的向量後,接着就是計算當前輸入的得到的與所有之間的Attention ,計算方式採用Scaled Dot-Product Attention,計算式如下,其中dot-product表示點積,scaled表示通過除以進行尺度調整,原因是如果query和key的每一個元素是mean=0,std=1,那麼dot product的mean=0,std=d0.5,所以除以d0.5可以normalize dot product。
這樣,每個輸入的都會輸出(n是輸入a的數目或者維度)個輸出,將它們softmax後得到的與對應的點乘後求和,即得到對應的輸出,示意如下圖。
所有的組合到一起,就是類似上面RNN的輸出,可以看到,每個都與其他的輸入產生運算後得到輸出,也就是說每個位置的輸出都包含了與其他位置的相關性信息,這就是自注意力。
多頭注意力
顯然,上述這個過程是可以矩陣化的,也就是可以GPU並行加速。上面這個這麼複雜的操作其實引入的權重只有提取的三個矩陣,這顯然只能學到一種任務有關的信息,要想學到更豐富的信息,就是使用更多的提取方法,這就是multi-head self-attention,它的思路就是反覆進行自注意力,得到多種輸出。因此,就像李宏毅老師PPT中下圖所示的,不同的head只有輸入是共享的,每個head的只能與當前head的和進行運算得到不同的(j最大爲head數),最後concat到一起再通過一個權重矩陣進行降維得到。
位置編碼
使用multi-head有助於捕獲不同類型的特徵,但是縱觀上面的attention過程,可以發現,每個輸入都會去與所有的輸入得到的信息進行運算,所以這個過程可以矩陣化並行,但是,這就帶來一個很嚴重的問題:順序信息的丟失,也就是位置信息的丟失。 舉個例子,對某個單詞而言,只使用詞嵌入作爲輸入的話,它與某個單詞計算attention,那無論這個單詞在它前面還是後面,得到的信息都是一樣的,這顯然不合理,對NLP而言,語序是一個非常重要的信息。
那麼Transformer如何解決這個問題的呢?它通過引入一個與詞嵌入同維的位置編碼向量來補充位置信息,這個位置編碼並非從數據中獲得,而是人爲指定的與原來的詞嵌入相加得到的結果輸入網絡,至於的計算方法實際上是通過一個固定的與onthot編碼運算得到的,這個在原論文裏是通過一個很複雜的式子求得的,具體可以查看原論文。
Transformer
通過上述的自注意力模塊堆疊而成的Transformer模型如下圖,左側表示編碼器,右側表示解碼器。首先看編碼器部分,詞嵌入和位置編碼相加後輸入多頭注意力模塊,該模塊上文已經分析了,隨後的Add和Norm分別表示殘差連接和layer norm,該結構重複N次後輸入一個feed forward網絡得到encoder 的輸出。再看右側的解碼器部分,輸入的outputs是前一個time得到的output,輸入的masked multi-head attention模塊表示只會與產生的序列進行attention,下一個attention模塊則可以attend到encoder的輸出,然後類似encoder重複N次,得到輸出結果。
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 可以評論或者私信我獲取。