乾貨 | NLP中的self-attention【自-注意力】機制
原文鏈接:
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年,
google機器翻譯團隊發表的《
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》這篇論文。這篇論文是
google機器翻譯團隊在
2017
年
6月放在
arXiv上,最後發表在
2017年
nips上,到目前為止
google學術顯示引用量為
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的結果。可以看到,
google提出來的多頭
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的應用部分。論文模型的整體結構如下圖,他們也是使用
google提出包含
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
任務。
除了
Google提出的自注意力機制,目前也有不少其他相關工作,感興趣的讀者可以繼續閱讀。
近期熱文
圖解機器學習的常見演算法
利用Python實現卷積神經網路的可視化
乾貨|淺談強化學習的方法及學習路線
乾貨 | 受限玻爾茲曼機基礎教程
【代碼分享】系列之樸素貝葉斯(github clone)
廣告、商業合作
請添加微信:guodongwe1991
(備註:商務合作)