近年來,注意力(Attention)機制被廣泛應用到基于深度學習的自然語言處理各個任務中,之前我對早期注意力機制進行過一些學習總結 [1]。
随着注意力機制的深入研究,各式各樣的 Attention 被研究者們提出。在 2017年 6 月 Google 機器翻譯團隊在 arXiv 上放出的 Attention is All You Need [2] 論文受到了大家廣泛關注,自注意力(self-attention)機制開始成為神經網絡 Attention 的研究熱點,在各個任務上也取得了不錯的效果。
Attention 機制最早是在視覺圖像領域提出來的,應該是在九幾年思想就提出來了,但是真正火起來應該算是 2014 年 Google Mind 團隊的這篇論文 Recurrent Models of Visual Attention [4],他們在 RNN 模型上使用了 Attention機制來進行圖像分類。
随後,Bahdanau 等人在論文 Neural Machine Translation by Jointly Learning to Align and Translate [5] 中,使用類似 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。
接下來我将介紹 Attention is All You Need 這篇論文。這篇論文是 Google 機器翻譯團隊在 2017 年 6 月放在 arXiv 上,最後發表在 2017 年 NIPS 上,到目前為止 Google 學術顯示引用量為 119,可見也是受到了大家廣泛關注和應用。
這篇論文主要亮點在于:
不同于以往主流機器翻譯使用基于 RNN 的 Seq2Seq 模型架構,該論文用 Attention 機制代替了 RNN 搭建了整個模型架構。
提出了多頭注意力(Multi-headed Attention)機制方法,在編碼器和解碼器中大量的使用了多頭自注意力機制(Multi-headed self-attention)。
在 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"依賴關系。多頭能夠從不同的表示子空間裡學習相關資訊。
■ 論文 | Deep Semantic Role Labeling with Self-Attention
■ 連結 | https://www.paperweekly.site/papers/1786
■ 源碼 | https://github.com/XMUNLP/Tagger
這篇論文來自 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 層能夠學習到标簽潛在的依賴資訊。
■ 論文 | Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction
■ 連結 | https://www.paperweekly.site/papers/1787
■ 作者 | Patrick Verga / Emma Strubell / Andrew McCallum
這篇論文是 Andrew McCallum 團隊應用 Self-Attention 在生物醫學關系抽取任務上的一個工作,應該是已經被 NAACL 2018 接收。這篇論文作者提出了一個文檔級别的生物關系抽取模型,裡面做了不少工作,感興趣的讀者可以更深入閱讀原文。
我們這裡隻簡單提一下他們 Self-Attention 的應用部分。論文模型的整體結構如下圖,他們也是使用 Google 提出包含 Self-Attention 的 transformer 來對輸入文本進行表示學習,和原始的 transformer 略有不同在于他們使用了視窗大小為 5 的 CNN 代替了原始 FNN。
我們關注一下 Attention 這部分的實驗結果。他們在生物醫學藥物緻病資料集上(Chemical Disease Relations,CDR)取得了先進結果。去掉 Self-Attention 這層以後可以看到結果大幅度下降,而且使用視窗大小為 5 的 CNN 比原始的 FNN 在這個資料集上有更突出的表現。
最後進行一下總結,Self-Attention 可以是一般 Attention 的一種特殊情況,在Self-Attention 中,Q=K=V 每個序列中的單元和該序列中所有單元進行 Attention 計算。
Google 提出的多頭 Attention 通過計算多次來捕獲不同子空間上的相關資訊。Self-Attention 的特點在于無視詞之間的距離直接計算依賴關系,能夠學習一個句子的内部結構,實作也較為簡單并行可以并行計算。
從一些論文中看到,Self-Attention 可以當成一個層和 RNN,CNN,FNN 等配合使用,成功應用于其他 NLP 任務。
除了 Google 提出的自注意力機制,目前也有不少其他相關工作,感興趣的讀者可以繼續閱讀。
原文釋出時間為:2018-04-4
本文作者:羅淩