當前位置:
首頁 > 知識 > 乾貨 | NLP中的self-attention【自-注意力】機制

乾貨 | 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》淺讀(簡介+代碼)"),和大家一起分享。


背景知識


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

計算。

Google

提出的多頭

attention

通過計算多次來捕獲不同子空間上的相關信息。

self-attention

的特點在於無視詞之間的距離直接計算依賴關係,能夠學習一個句子的內部結構,實現也較為簡單並行可以並行計算。從一些論文中看到,

self-attention

可以當成一個層和

RNN

CNN

FNN

等配合使用,成功應用於其他

NLP

任務。



除了

Google

提出的自注意力機制,目前也有不少其他相關工作,感興趣的讀者可以繼續閱讀。



近期熱文




  • 圖解機器學習的常見演算法




  • 利用Python實現卷積神經網路的可視化




  • 乾貨|淺談強化學習的方法及學習路線




  • 乾貨 | 受限玻爾茲曼機基礎教程




  • 【代碼分享】系列之樸素貝葉斯(github clone)





廣告、商業合作


請添加微信:guodongwe1991


(備註:商務合作)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!

TAG: |