原文鏈接:
http://www.cnblogs.com/robert-dlut/p/8638283.html
點擊文末閱讀原文
隨著注意力機制的深入研究,各式各樣的attention被研究者們提出。在2017年6月google機器翻譯團隊在arXiv上放出的《Attention is all you need》論文受到了大家廣泛關注,自注意力(self-attention)機制開始成為神經網路attention的研究熱點,在各個任務上也取得了不錯的效果。本人就這篇論文中的self-attention以及一些相關工作進行了學習總結(其中也參考借鑒了張俊林博士的博客”深度學習中的注意力機制(2017版)”和蘇劍林的”《Attention is All You Need》淺讀(簡介+代碼)”),和大家一起分享。
1
背景知識
Attention
機制最早是在視覺圖像領域提出來的,應該是在九幾年思想就提出來了,但是真正火起來應該算是
2014
年
google mind
團隊的這篇論文《
Recurrent Models of Visual Attention
》,他們在
RNN
模型上使用了
attention
機制來進行圖像分類。隨後,
Bahdanau
等人在論文《
Neural Machine Translation by Jointly Learning to Align and Translate
》中,使用類似
attention
的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將
attention
機制應用到
NLP
領域中。接著
attention
機制被廣泛應用在基於
RNN/CNN
等神經網路模型的各種
NLP
任務中。
2017
年,
機器翻譯團隊發表的《
Attention is all you need
》中大量使用了自注意力(
self-attention
)機制來學習文本表示。自注意力機制也成為了大家近期的研究熱點,並在各種
NLP
任務上進行探索。下圖維
attention
研究進展的大概趨勢。
Attention
機制的本質來自於人類視覺注意力機制。人們視覺在感知東西的時候一般不會是一個場景從到頭看到尾每次全部都看,而往往是根據需求觀察注意特定的一部分。而且當人們發現一個場景經常在某部分出現自己想觀察的東西時,人們會進行學習在將來再出現類似場景時把注意力放到該部分上。
下面我先介紹一下在
NLP
中常用
attention
的計算方法(裡面借鑒了張俊林博士
“
深度學習中的注意力機制
(2017
版
)”
里的一些圖)。
Attention
函數的本質可以被描述為一個查詢(
query
)到一系列(鍵
key-
值
value
)對的映射,如下圖。
在計算
attention
時主要分為三步,第一步是將
query
和每個
key
進行相似度計算得到權重,常用的相似度函數有點積,拼接,感知機等;然後第二步一般是使用一個
softmax
函數對這些權重進行歸一化;最後將權重和相應的鍵值
value
進行加權求和得到最後的
attention
。目前在
NLP
研究中,
key
和
value
常常都是同一個,即
key=value
。
2 Attention is all you need[1]
接下來我將介紹《
Attention is all you need
》這篇論文。這篇論文是
機器翻譯團隊在
2017
年
6
月放在
arXiv
上,最後發表在
2017
年
nips
上,到目前為止
學術顯示引用量為
119
,可見也是受到了大家廣泛關注和應用。這篇論文主要亮點在於
1
)不同於以往主流機器翻譯使用基於
RNN
的
seq2seq
模型框架,該論文用
attention
機制代替了
RNN
搭建了整個模型框架。
2
)提出了多頭注意力(
Multi-headed attention
)機制方法,在編碼器和解碼器中大量的使用了多頭自注意力機制(
Multi-headed self-attention
)。
3
)在
WMT2014
語料中的英德和英法任務上取得了先進結果,並且訓練速度比主流模型更快。
該論文模型的整體結構如下圖,還是由編碼器和解碼器組成,在編碼器的一個網路塊中,由一個多頭
attention
子層和一個前饋神經網路子層組成,整個編碼器棧式搭建了
N
個塊。類似於編碼器,只是解碼器的一個網路塊中多了一個多頭
attention
層。為了更好的優化深度網路,整個網路使用了殘差連接和對層進行了規範化(
Add&Norm
)。
下面我們重點關注一下這篇論文中的
attention
。在介紹多頭
attention
之前,我們先看一下論文中提到的放縮點積
attention
(
scaled dot-Product attention
)。對比我在前面背景知識里提到的
attention
的一般形式,其實
scaled dot-Product attention
就是我們常用的使用點積進行相似度計算的
attention
,只是多除了一個(為
K
的維度)
起到調節作用,使得內積不至於太大。
多頭
attention
(
Multi-head attention
)結構如下圖,
Query
,
Key
,
Value
首先進過一個線性變換,然後輸入到放縮點積
attention
,注意這裡要做
h
次,其實也就是所謂的多頭,每一次算一個頭。而且每次
Q
,
K
,
V
進行線性變換的參數
W
是不一樣的。然後將
h
次的放縮點積
attention
結果進行拼接,再進行一次線性變換得到的值作為多頭
attention
的結果。可以看到,
提出來的多頭
attention
的不同之處在於進行了
h
次計算而不僅僅算一次,論文中說到這樣的好處是可以允許模型在不同的表示子空間里學習到相關的信息,後面還會根據
attention
可視化來驗證。
那麼在整個模型中,是如何使用
attention
的呢?如下圖,首先在編碼器到解碼器的地方使用了多頭
attention
進行連接,
K
,
V
,
Q
分別是編碼器的層輸出(這裡
K=V
)和解碼器中都頭
attention
的輸入。其實就和主流的機器翻譯模型中的
attention
一樣,利用解碼器和編碼器
attention
來進行翻譯對齊。然後在編碼器和解碼器中都使用了多頭自注意力
self-attention
來學習文本的表示。
Self-attention
即
K=V=Q
,例如輸入一個句子,那麼裡面的每個詞都要和該句子中的所有詞進行
attention
計算。目的是學習句子內部的詞依賴關係,捕獲句子的內部結構。
對於使用自注意力機制的原因,論文中提到主要從三個方面考慮(每一層的複雜度,是否可以並行,長距離依賴學習),並給出了和
RNN
,
CNN
計算複雜度的比較。可以看到,如果輸入序列
n
小於表示維度
d
的話,每一層的時間複雜度
self-attention
是比較有優勢的。當
n
比較大時,作者也給出了一種解決方案
self-attention
(
restricted
)即每個詞不是和所有詞計算
attention
,而是只與限制的
r
個詞去計算
attention
。在並行方面,多頭
attention
和
CNN
一樣不依賴於前一時刻的計算,可以很好的並行,優於
RNN
。在長距離依賴上,由於
self-attention
是每個詞和所有詞都要計算
attention
,所以不管他們中間有多長距離,最大的路徑長度也都只是
1
。可以捕獲長距離依賴關係。
最後我們看一下實驗結果,在
WMT2014
的英德和英法機器翻譯任務上,都取得了先進的結果,且訓練速度優於其他模型。
在模型的超參實驗中可以看到,多頭
attention
的超參
h
太小也不好,太大也會下降。整體更大的模型比小模型要好,使用
dropout
可以幫助過擬合。
作者還將這個模型應用到了句法分析任務上也取得了不錯的結果。
最後我們看一下
attention
可視化的效果(這裡不同顏色代表
attention
不同頭的結果,顏色越深
attention
值越大)。可以看到
self-attention
在這裡可以學習到句子內部長距離依賴”
making…….more difficult
“這個短語。在兩個頭和單頭的比較中,可以看到單頭”
its
“這個詞只能學習到”
law
“的依賴關係,而兩個頭”
its
“不僅學習到了”
law
“還學習到了”
application
“依賴關係。多頭能夠從不同的表示子空間里學習相關信息。
3 Self-attention in NLP
3.1 Deep Semantic Role Labeling with Self-Attention[8]
這篇論文來自
AAAI2018
,廈門大學
Tan
等人的工作。他們將
self-attention
應用到了語義角色標註任務(
SRL
)上,並取得了先進的結果。這篇論文中,作者將
SRL
作為一個序列標註問題,使用
BIO
標籤進行標註。然後提出使用深度注意力網路(
Deep Attentional Neural Network
)進行標註,網路結構如下。在每一個網路塊中,有一個
RNN/CNN/FNN
子層和一個
self-attention
子層組成。最後直接利用
softmax
當成標籤分類進行序列標註。
該模型在
CoNLL-2005
和
CoNll-2012
的
SRL
數據集上都取得了先進結果。我們知道序列標註問題中,標籤之間是有依賴關係的,比如標籤
I
,應該是出現在標籤
B
之後,而不應該出現在
O
之後。目前主流的序列標註模型是
BiLSTM-CRF
模型,利用
CRF
進行全局標籤優化。在對比實驗中,
He et al
和
Zhou and Xu
的模型分別使用了
CRF
和
constrained decoding
來處理這個問題。可以看到本論文僅使用
self-attention
,作者認為在模型的頂層的
attention
層能夠學習到標籤潛在的依賴信息。
3.2 Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction[7]
這篇論文是
Andrew McCallum
團隊應用
self-attention
在生物醫學關係抽取任務上的一個工作,應該是已經被
NAACL2018
接收。這篇論文作者提出了一個文檔級別的生物關係抽取模型,裡面做了不少工作,感興趣的讀者可以更深入閱讀原文。我們這裡只簡單提一下他們
self-attention
的應用部分。論文模型的整體結構如下圖,他們也是使用
提出包含
self-attention
的
transformer
來對輸入文本進行表示學習,和原始的
transformer
略有不同在於他們使用了窗口大小為
5
的
CNN
代替了原始
FNN
。
我們關注一下
attention
這部分的實驗結果。他們在生物醫學藥物致病數據集上(
Chemical Disease Relations
,
CDR
)取得了先進結果。去掉
self-attention
這層以後可以看到結果大幅度下降,而且使用窗口大小為
5
的
CNN
比原始的
FNN
在這個數據集上有更突出的表現。
4 總結
最後進行一下總結,
self-attention
可以是一般
attention
的一種特殊情況,在
self-attention
中,
Q=K=V
每個序列中的單元和該序列中所有單元進行
attention
計算。
提出的多頭
attention
通過計算多次來捕獲不同子空間上的相關信息。
self-attention
的特點在於無視詞之間的距離直接計算依賴關係,能夠學習一個句子的內部結構,實現也較為簡單並行可以並行計算。從一些論文中看到,
self-attention
可以當成一個層和
RNN
,
CNN
,
FNN
等配合使用,成功應用於其他
NLP
任務。
除了
提出的自注意力機制,目前也有不少其他相關工作,感興趣的讀者可以繼續閱讀。
近期熱文
-
圖解機器學習的常見演算法
-
利用Python實現卷積神經網路的可視化
-
乾貨|淺談強化學習的方法及學習路線
-
乾貨 | 受限玻爾茲曼機基礎教程
-
【代碼分享】系列之樸素貝葉斯(github clone)
廣告、商業合作
請添加微信:guodongwe1991
(備註:商務合作)