乾貨 | 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機制的本質來自於人類視覺注意力機制。人們視覺在感知東西的時候一般不會是一個場景從到頭看到尾每次全部都看,而往往是根據需求觀察注意特定的一部分。而且當人們發現一個場景經常在某部分出現自己想觀察的東西時,人們會進行學習在將來再出現類似場景時把注意力放到該部分上。
下面我先介紹一下在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提出的自注意力機制,目前也有不少其他相關工作,感興趣的讀者可以繼續閱讀。
近期熱文
廣告、商業合作
請新增微信:guodongwe1991
(備註:商務合作)