[深度學習] 自然語言處理 --- Attention (上)

目錄

Attention簡介

Encoder-Decoder框架

Attention模型

Attention 的優點

Attention 不同類型

1. 計算區域

2. 所用信息

3. 結構層次

4. 模型方面

5. 相似度計算方式

Attention詳細介紹

Soft Attention 模型

  圖解Attention機制

第一步:準備隱藏狀態

第二步:獲取每個編碼器隱藏狀態的分數

第三步:通過softmax層運行所有得分

第四步:將每個編碼器的隱藏狀態乘以其softmax得分

第五步:將對齊向量聚合起來

第六步:將語境向量輸入到解碼器中


Attention簡介

Attention 機制最早是在計算機視覺裏應用的,隨後在 NLP 領域也開始應用了,真正發揚光大是在 NLP 領域,因爲 2018 年 BERT 和 GPT 的效果出奇的好,進而走紅。而 Transformer 和 Attention 這些核心開始被大家重點關注。

如果用圖來表達 Attention 的位置大致是下面的樣子:


 

注意力模型(Attention Model)是深度學習領域最受矚目的新星,用來處理與序列相關的數據,特別是2017年Google提出後,模型成效、複雜度又取得了更大的進展。以金融業爲例,客戶的行爲代表一連串的序列,但要從串行化的客戶歷程數據去萃取信息是非常困難的,如果能夠將self-attention的概念應用在客戶歷程並拆解分析,就能探索客戶潛在行爲背後無限的商機。

本文解釋在機器翻譯的領域中,是如何從Seq2seq演進至Attention model 再至self attention

爲此,系列文分爲兩篇,第一篇着重在解釋Seq2seq、Attention模型,第二篇重點擺在self attention,希望大家看完後能有所收穫。

2015年 ICLR 《Neural machine translation by jointly learning to align and translate》首次提出 attention(基本上算是公認的首次提出),文章提出了最經典的 Attention 結構(additive attention 或者 又叫 bahdanau attention)用於機器翻譯,並形象直觀地展示了 attention 帶來源語目標語的對齊效果,解釋深度模型到底學到了什麼。

2015年 EMNLP 《Effective Approaches to Attention-based Neural Machine Translation》在基礎 attention 上開始研究一些變化操作,嘗試不同的 score-function,不同的 alignment-function。文章中使用的 Attention(multiplicative attention 或者 又叫 Luong attention)結構也被廣泛應用。

2015年 ICML 《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》是 attention(提出hard/soft attention的概念)在 image caption 上的應用,故事圓滿,符合直覺。

在上面幾篇奠基之作之上,2016和2017年 attention 開枝散葉,無往不利。Hiearchical Attention,Attention over Attention,multi-step Attention……這些或叫得上名的或叫不上名。

2017年-至今是屬於 transformer 的時代。基於 transformer 強大的表示學習能力,NLP 領域爆發了新一輪的活力,BERT、GPT 領跑各項 NLP 任務效果。奠基之作無疑是:2017年 NIPS《Attention is all you need》提出 transformer 的結構(涉及 self-attention,multi-head attention)。基於 transformer 的網絡可全部替代sequence-aligned 的循環網絡,實現 RNN 不能實現的並行化,並且使得長距離的語義依賴與表達更加準確(據說2019年的 transformer-xl《Transformer-XL:Attentive Lanuage Models Beyond a fixed-length context》通過片段級循環機制結合相對位置編碼策略可以捕獲更長的依賴關係)。

 

 

1. Show, Attend and Tell: Neural Image Caption Generation with Visual Attention

地址:https://arxiv.org/abs/1502.03044v1

文章提出了兩種attention模式,即hard attention 和soft attention

2. Effective Approaches to Attention-based Neural Machine Translation

地址:https://arxiv.org/abs/1508.04025

文章提出了兩種attention的改進版本,即global attention和local attention。

Encoder-Decoder框架

要了解深度學習中的注意力模型,就不得不先談Encoder-Decoder框架(Sequence-to-sequence),因爲目前大多數注意力模型附着在Encoder-Decoder框架下,最直觀的就是機器翻譯,一句英文翻譯成一句中文。或者應答,問一句答一句。

你可能很常聽到Seq2seq這詞,卻不明白是什麼意思。Seq2seq全名是Sequence-to-sequence,也就是從序列到序列的過程,是近年當紅的模型之一。Seq2seq被廣泛應用在機器翻譯、聊天機器人甚至是圖像生成文字等情境。如下圖:

 

其實注意力模型可以看作一種通用的思想,本身並不依賴於特定框架,這點需要注意。Encoder-Decoder框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。圖2是文本處理領域裏常用的Encoder-Decoder框架最抽象的一種表示。

0?wx_fmt=png

                                        圖2 抽象的文本處理領域的Encoder-Decoder框架

文本處理領域的Encoder-Decoder框架可以這麼直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對於句子對<Source,Target>,我們的目標是給定輸入句子Source,期待通過Encoder-Decoder框架來生成目標句子Target。Source和Target可以是同一種語言,也可以是兩種不同的語言。而Source和Target分別由各自的單詞序列構成:

0?wx_fmt=png

Encoder顧名思義就是對輸入句子Source進行編碼,將輸入句子通過非線性變換轉化爲中間語義表示C:

0?wx_fmt=png

對於解碼器Decoder來說,其任務是根據句子Source的中間語義表示C和之前已經生成的歷史信息0?wx_fmt=png來生成i時刻要生成的單詞0?wx_fmt=png

0?wx_fmt=png

每個yi都依次這麼產生,那麼看起來就是整個系統根據輸入句子Source生成了目標句子Target。

  1. 如果Source是中文句子,Target是英文句子,那麼這就是解決機器翻譯問題的Encoder-Decoder框架;
  2. 如果Source是一篇文章,Target是概括性的幾句描述語句,那麼這是文本摘要的Encoder-Decoder框架;
  3. 如果Source是一句問句,Target是一句回答,那麼這是問答系統或者對話機器人的Encoder-Decoder框架。

由此可見,在文本處理領域,Encoder-Decoder的應用領域相當廣泛。

Encoder-Decoder框架不僅僅在文本領域廣泛使用,在語音識別、圖像處理等領域也經常使用。比如對於語音識別來說,圖2所示的框架完全適用,區別無非是Encoder部分的輸入是語音流,輸出是對應的文本信息;而對於“圖像描述”任務來說,Encoder部分的輸入是一副圖片,Decoder的輸出是能夠描述圖片語義內容的一句描述語。一般而言,文本處理和語音識別的Encoder部分通常採用RNN模型,圖像處理的Encoder一般採用CNN模型。

我們可以看到Seq2seq包含兩部分:Encoder和Decoder。一旦將句子輸入至Encoder,即可從Decoder獲得目標句。本篇文章着墨在Decoder生成過程,Encoder就是個單純的RNN/ LSTM,讀者若有興趣可再自行研究,此外RNN/LSTM可以互相代替,以下僅以LSTM作爲解釋。

 

將“she is eating a green apple”翻譯成中文,圖中是對編碼器和解碼器隨着時間步而展開的可視化效果

這種固定長度的上下文向量設計的一個關鍵的和明顯的缺點在於,它無法記住很長的句子,對很長的時序信息來說,一旦它完成了對整個序列的處理,它通常會忘記最開始的部分,從而丟失很多有用的信息。因此,在2015年Bahdanau等人爲了解決長時依賴問題,提出了注意力機制。

Attention模型

Attention 的優點

之所以要引入 Attention 機制,主要是3個原因:

  1. 參數少: 模型複雜度跟 CNN、RNN 相比,複雜度更小,參數也更少。所以對算力的要求也就更小。
  2. 速度快: Attention 解決了 RNN 不能並行計算的問題。Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。
  3. 效果好: 在 Attention 機制引入之前,有一個問題大家一直很苦惱:長距離的信息會被弱化,就好像記憶能力弱的人,記不住過去的事情是一樣的。

 

Attention 是挑重點,就算文本比較長,也能從中間抓住重點,不丟失重要的信息。下圖紅色的預期就是被挑出來的重點。

 

Attention 不同類型

Attention 有很多種不同的類型:Soft Attention、Hard Attention、靜態Attention、動態Attention、Self Attention 等等

 

本節從計算區域、所用信息、結構層次和模型等方面對Attention的形式進行歸類。

1. 計算區域

根據Attention的計算區域,可以分成以下幾種:

1)Soft Attention,這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。

2)Hard Attention,這種方式是直接精準定位到某個key,其餘key就都不管了,相當於這個key的概率是1,其餘key的概率全部是0。因此這種對齊方式要求很高,要求一步到位,如果沒有正確對齊,會帶來很大的影響。另一方面,因爲不可導,一般需要用強化學習的方法進行訓練。(或者使用gumbel softmax之類的)

3)Local Attention,這種方式其實是以上兩種方式的一個折中,對一個窗口區域進行計算。先用Hard方式定位到某個地方,以這個點爲中心可以得到一個窗口區域,在這個小區域內用Soft方式來算Attention。

 

2. 所用信息

假設我們要對一段原文計算Attention,這裏原文指的是我們要做attention的文本,那麼所用信息包括內部信息和外部信息,內部信息指的是原文本身的信息,而外部信息指的是除原文以外的額外信息。

1)General Attention,這種方式利用到了外部信息,常用於需要構建兩段文本關係的任務,query一般包含了額外信息,根據外部query對原文進行對齊。

比如在閱讀理解任務中,需要構建問題和文章的關聯,假設現在baseline是,對問題計算出一個問題向量q,把這個q和所有的文章詞向量拼接起來,輸入到LSTM中進行建模。那麼在這個模型中,文章所有詞向量共享同一個問題向量,現在我們想讓文章每一步的詞向量都有一個不同的問題向量,也就是,在每一步使用文章在該步下的詞向量對問題來算attention,這裏問題屬於原文,文章詞向量就屬於外部信息。

2)Local Attention,這種方式只使用內部信息,key和value以及query只和輸入原文有關,在self attention中,key=value=query。既然沒有外部信息,那麼在原文中的每個詞可以跟該句子中的所有詞進行Attention計算,相當於尋找原文內部的關係。

還是舉閱讀理解任務的例子,上面的baseline中提到,對問題計算出一個向量q,那麼這裏也可以用上attention,只用問題自身的信息去做attention,而不引入文章信息。

 

3. 結構層次

結構方面根據是否劃分層次關係,分爲單層attention,多層attention和多頭attention:

1)單層Attention,這是比較普遍的做法,用一個query對一段原文進行一次attention。

2)多層Attention,一般用於文本具有層次關係的模型,假設我們把一個document劃分成多個句子,在第一層,我們分別對每個句子使用attention計算出一個句向量(也就是單層attention);在第二層,我們對所有句向量再做attention計算出一個文檔向量(也是一個單層attention),最後再用這個文檔向量去做任務。

3)多頭Attention,這是Attention is All You Need中提到的multi-head attention,用到了多個query對一段原文進行了多次attention,每個query都關注到原文的不同部分,相當於重複做多次單層attention:

最後再把這些結果拼接起來:

 

4. 模型方面

從模型上看,Attention一般用在CNN和LSTM上,也可以直接進行純Attention計算。

1)CNN+Attention

CNN的卷積操作可以提取重要特徵,我覺得這也算是Attention的思想,但是CNN的卷積感受視野是局部的,需要通過疊加多層卷積區去擴大視野。另外,Max Pooling直接提取數值最大的特徵,也像是hard attention的思想,直接選中某個特徵。

CNN上加Attention可以加在這幾方面:

a. 在卷積操作前做attention,比如Attention-Based BCNN-1,這個任務是文本蘊含任務需要處理兩段文本,同時對兩段輸入的序列向量進行attention,計算出特徵向量,再拼接到原始向量中,作爲卷積層的輸入。

b. 在卷積操作後做attention,比如Attention-Based BCNN-2,對兩段文本的卷積層的輸出做attention,作爲pooling層的輸入。

c. 在pooling層做attention,代替max pooling。比如Attention pooling,首先我們用LSTM學到一個比較好的句向量,作爲query,然後用CNN先學習到一個特徵矩陣作爲key,再用query對key產生權重,進行attention,得到最後的句向量。

 

2)LSTM+Attention

LSTM內部有Gate機制,其中input gate選擇哪些當前信息進行輸入,forget gate選擇遺忘哪些過去信息,我覺得這算是一定程度的Attention了,而且號稱可以解決長期依賴問題,實際上LSTM需要一步一步去捕捉序列信息,在長文本上的表現是會隨着step增加而慢慢衰減,難以保留全部的有用信息。

LSTM通常需要得到一個向量,再去做任務,常用方式有:

a. 直接使用最後的hidden state(可能會損失一定的前文信息,難以表達全文)

b. 對所有step下的hidden state進行等權平均(對所有step一視同仁)。

c. Attention機制,對所有step的hidden state進行加權,把注意力集中到整段文本中比較重要的hidden state信息。性能比前面兩種要好一點,而方便可視化觀察哪些step是重要的,但是要小心過擬合,而且也增加了計算量。

 

3)純Attention

Attention is all you need,沒有用到CNN/RNN,乍一聽也是一股清流了,但是仔細一看,本質上還是一堆向量去計算attention。

 

5. 相似度計算方式

在做attention的時候,我們需要計算query和某個key的分數(相似度),常用方法有:

1)點乘:最簡單的方法,

2)矩陣相乘:

3)cos相似度:

4)串聯方式:把q和k拼接起來,

5)用多層感知機也可以:


Attention詳細介紹

爲什麼要用attention model?

The attention model用來幫助解決機器翻譯在句子過長時效果不佳的問題。

這種新的構架替輸入句的每個文字都創造一個context vector,而非僅僅替輸入句創造一個從最終的hidden state得來的context vector,舉例來說,如果一個輸入句有N個文字,就會產生N個context vector,好處是,每個context vector能夠被更有效的譯碼。

在Attention model中,Encoder和Seq2seq概念一樣,一樣是從輸入句<X1,X2,X3…Xm>產生<h1,h2,h….hm>的hidden state,再計算目標句<y1…yn>。換言之,就是將輸入句作爲input而目標句作爲output,所以差別就在於context vector c_{i}是怎麼計算。

Context vector c_{i}是透過attention score α乘上input的序列加權求和, Attention/Alignment score是attention model中提出一個很重要的概念,可以用來衡量輸入句中的每個文字對目標句中的每個文字所帶來重要性的程度。由公式可知,attention score由score e_{ij}所計算得到,所以先來看看score e_{ij}是什麼。

在計算score中,a代表Alignment model會根據輸入字位置j和輸出字位置i這兩者的關聯程度,計算出一個score e_{ij}。換言之,e_{i,j}是衡量RNN decoder中的hidden state s_{i-1}和輸入句中的第j個文字hidden state h_{j}的關係所計算出的權重 — 如方程式3,那權重怎麼算呢?

Neural Machine Translation發表之後,後續的論文Effective approaches of the NMT、Show,Attend and Tell提出了global/local attention和soft/hard attention的概念,而score e_{ij}的計算方式類似global和soft attention。細節在此不多說,圖11可以看到3種計算權重的方式,我們把剛纔的公式做些改變,將score e_{ij}改寫成score(h_{t},bar {h_{s}}),h_{t}代表s_{i-1}而bar {h_{s}}代表h_{j},爲了計算方便,我們採用內積(dot)計算權重。

有了score e_{ij},即可透過softmax算出attention score,context vector也可得到,在attention model中,context vector又稱爲attention vector。我們可以將attention score列爲矩陣,透過此矩陣可看到輸入端文字和輸出端文字間的對應關係,也就是論文當中提出align的概念。

我們知道如何計算context vector後,回頭看encoder。

attention model中的encoder用的是改良版RNN:雙向RNN(Bi-directional RNN),以往單向RNN的問題在於t時刻時,只能透過之前的信息進行預測,但事實上,模型有時候可能也需要利用未來時刻的信息進行預測,其運作模式爲,一個hidden layer用來由左到右,另一個由右到左,透過雙向RNN,我們可以對詞語進行更好的預測。

舉例來說,”我喜歡蘋果,因爲它很好喫”?和”我喜歡蘋果,因爲他比安卓穩定”這兩個句子當中,如果只看”我喜歡蘋果”,你可能不知道蘋果指的是水果還是手機,但如果可以根據後面那句得到信息,答案就很顯而易見,這就是雙向RNN運作的方式。

 

Soft Attention 模型

這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。作、

圖2中展示的Encoder-Decoder框架是沒有體現出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。爲什麼說它注意力不集中呢?請觀察下目標句子Target中每個單詞的生成過程如下:

0?wx_fmt=png

其中f是Decoder的非線性變換函數。從這裏可以看出,在生成目標句子的單詞時,不論生成哪個單詞,它們使用的輸入句子Source的語義編碼C都是一樣的,沒有任何區別。

而語義編碼C是由句子Source的每個單詞經過Encoder 編碼產生的,這意味着不論是生成哪個單詞,0?wx_fmt=png還是0?wx_fmt=png,其實句子Source中任意單詞對生成某個目標單詞yi來說影響力都是相同的,這是爲何說這個模型沒有體現出注意力的緣由。這類似於人類看到眼前的畫面,但是眼中卻沒有注意焦點一樣。

如果拿機器翻譯來解釋這個分心模型的Encoder-Decoder框架更好理解,比如輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:“湯姆”,“追逐”,“傑瑞”。

在翻譯“傑瑞”這個中文單詞的時候,分心模型裏面的每個英文單詞對於翻譯目標單詞“傑瑞”貢獻是相同的,很明顯這裏不太合理,顯然“Jerry”對於翻譯成“傑瑞”更重要,但是分心模型是無法體現這一點的,這就是爲何說它沒有引入注意力的原因。

沒有引入注意力的模型在輸入句子比較短的時候問題不大,但是如果輸入句子比較長,此時所有語義完全通過一箇中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失很多細節信息,這也是爲何要引入注意力模型的重要原因。

上面的例子中,如果引入Attention模型的話,應該在翻譯“傑瑞”的時候,體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分佈值:

(Tom,0.3)(Chase,0.2) (Jerry,0.5)

每個英文單詞的概率代表了翻譯當前單詞“傑瑞”時,注意力分配模型分配給不同英文單詞的注意力大小。這對於正確翻譯目標語單詞肯定是有幫助的,因爲引入了新的信息。

同理,目標句子中的每個單詞都應該學會其對應的源語句子中單詞的注意力分配概率信息。這意味着在生成每個單詞0?wx_fmt=png的時候,原先都是相同的中間語義表示C會被替換成根據當前生成單詞而不斷變化的0?wx_fmt=png。理解Attention模型的關鍵就是這裏,即由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的0?wx_fmt=png。增加了注意力模型的Encoder-Decoder框架理解起來如圖3所示。

 

0?wx_fmt=png

                                                    圖3 引入注意力模型的Encoder-Decoder框架

即生成目標句子單詞的過程成了下面的形式:

0?wx_fmt=png

而每個0?wx_fmt=png可能對應着不同的源語句子單詞的注意力分配概率分佈

比如對於上面的英漢翻譯來說,其對應的信息可能如下:

0?wx_fmt=png

其中,f2函數代表Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用的RNN模型的話,這個f2函數的結果往往是某個時刻輸入0?wx_fmt=png後隱層節點的狀態值;g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,即下列公式:

0?wx_fmt=png

其中,0?wx_fmt=png代表輸入句子Source的長度,0?wx_fmt=png代表在Target輸出第i個單詞時Source輸入句子中第j個單詞的注意力分配係數,而0?wx_fmt=png則是Source輸入句子中第j個單詞的語義編碼。假設0?wx_fmt=png下標i就是上面例子所說的“ 湯姆” ,那麼0?wx_fmt=png就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分別是輸入句子每個單詞的語義編碼,對應的注意力模型權值則分別是0.6,0.2,0.2,所以g函數本質上就是個加權求和函數。如果形象表示的話,翻譯中文單詞“湯姆”的時候,數學公式對應的中間語義表示0?wx_fmt=png的形成過程類似圖4。

0?wx_fmt=png

                  圖4 Attention的形成過程

這裏還有一個問題:生成目標句子某個單詞,比如“湯姆”的時候,如何知道Attention模型所需要的輸入句子單詞注意力分配概率分佈值呢?就是說“湯姆”對應的輸入句子Source中各個單詞的概率分佈:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?

爲了便於說明,我們假設對圖2的非Attention模型的Encoder-Decoder框架進行細化,Encoder採用RNN模型,Decoder也採用RNN模型,這是比較常見的一種模型配置,則圖2的框架轉換爲圖5。

0?wx_fmt=png

                                         圖5 RNN作爲具體模型的Encoder-Decoder框架

那麼用圖6可以較爲便捷地說明注意力分配概率分佈值的通用計算過程。

0?wx_fmt=png

                                               圖6 注意力分配概率計算

對於採用RNN的Decoder來說,在時刻i,如果要生成yi單詞,我們是可以知道Target在生成0?wx_fmt=png之前的時刻i-1時,隱層節點i-1時刻的輸出值0?wx_fmt=png的,而我們的目的是要計算生成0?wx_fmt=png時輸入句子中的單詞“Tom”、“Chase”、“Jerry”對0?wx_fmt=png來說的注意力分配概率分佈,那麼可以用Target輸出句子i-1時刻的隱層節點狀態0?wx_fmt=png去一一和輸入句子Source中每個單詞對應的RNN隱層節點狀態hj進行對比,即通過函數F(0?wx_fmt=png,0?wx_fmt=png)來獲得目標單詞0?wx_fmt=png和每個輸入單詞對應的對齊可能性,這個F函數在不同論文裏可能會採取不同的方法,然後函數F的輸出經過Softmax進行歸一化就得到了符合概率分佈取值區間的注意力分配概率分佈數值。

 

絕大多數Attention模型都是採取上述的計算框架來計算注意力分配概率分佈信息,區別只是在F的定義上可能有所不同。圖7可視化地展示了在英語-德語翻譯系統中加入Attention機制後,Source和Target兩個句子每個單詞對應的注意力分配概率分佈。

0?wx_fmt=png

                                圖7 英語-德語翻譯的注意力概率分佈

上述內容就是經典的Soft Attention模型的基本思想那麼怎麼理解Attention模型的物理含義呢?一般在自然語言處理應用裏會把Attention模型看作是輸出Target句子中某個單詞和輸入Source句子每個單詞的對齊模型,這是非常有道理的。

目標句子生成的每個單詞對應輸入句子單詞的概率分佈可以理解爲輸入句子單詞和這個目標生成單詞的對齊概率,這在機器翻譯語境下是非常直觀的:傳統的統計機器翻譯一般在做的過程中會專門有一個短語對齊的步驟,而注意力模型其實起的是相同的作用。

圖8 Google 神經網絡機器翻譯系統結構圖

圖8所示即爲Google於2016年部署到線上的基於神經網絡的機器翻譯系統,相對傳統模型翻譯效果有大幅提升,翻譯錯誤率降低了60%,其架構就是上文所述的加上Attention機制的Encoder-Decoder框架,主要區別無非是其Encoder和Decoder使用了8層疊加的LSTM模型。


Seq2seq、Attention model,差別在於計算context vector的方式。

Attention model雖然解決了輸入句僅有一個context vector的缺點,但依舊存在不少問題。

1.context vector計算的是輸入句、目標句間的關聯,卻忽略了輸入句中文字間的關聯,和目標句中文字間的關聯性,

2.不管是Seq2seq或是Attention model,其中使用的都是RNN,RNN的缺點就是無法平行化處理,導致模型訓練的時間很長,有些論文嘗試用CNN去解決這樣的問題,像是Facebook提出的Convolutional Seq2seq learning,但CNN實際上是透過大量的layer去解決局部信息的問題,在2017年,Google提出了一種叫做”The transformer”的模型,透過self attention、multi-head的概念去解決上述缺點,完全捨棄了RNN、CNN的構架。

 

  圖解Attention機制

注意力一共分類兩種。一種是全局注意力,使用所有編碼器隱藏狀態。另一種是局部注意力,使用的是編碼器隱藏狀態的子集。

在這篇文章中,提到的注意力,都是全局注意力

使用“seq2seq”方法的話,他會從頭開始逐字逐句閱讀德語文本,然後逐字逐句將文本翻譯成英語。如果句子特別長的話,他在翻譯的時候,可能就已經忘了之前文本上的內容了。

如果使用seq2seq+注意力的方法,他在逐字逐句閱讀德語文本的時候,會寫下關鍵詞。然後,利用這些關鍵詞,將文本翻譯成英語。

在模型中,注意力會爲每個單詞打一個分,將焦點放在不同的單詞上。然後,基於softmax得分,使用編碼器隱藏狀態的加權和,來聚合編碼器隱藏狀態,以獲得語境向量。

注意力層的實現可以分爲6個步驟。

第一步:準備隱藏狀態

首先,準備第一個解碼器的隱藏狀態(紅色)和所有可用的編碼器的隱藏狀態(綠色)。在我們的例子中,有4個編碼器的隱藏狀態和當前解碼器的隱藏狀態。

第二步:獲取每個編碼器隱藏狀態的分數

通過評分函數來獲取每個編碼器隱藏狀態的分數(標量)。在這個例子中,評分函數是解碼器和編碼器隱藏狀態之間的點積。

在上面的例子中,編碼器隱藏狀態[5,0,1]的注意力分數爲60,很高。這意味着要翻譯的下一個詞將受到這個編碼器隱藏狀態的嚴重影響。

第三步:通過softmax層運行所有得分

我們將得分放到softmax函數層,使softmax得分(標量)之和爲1。這些得分代表注意力的分佈。

需要注意的是,基於softmaxed得分的score^。注意力僅按預期分佈在[5,0,1]上。實際上,這些數字不是二進制數,而是0到1之間的浮點數。

第四步:將每個編碼器的隱藏狀態乘以其softmax得分

將每個編碼器的隱藏狀態與其softmaxed得分(標量)相乘,就能獲得對齊向量。這就是發生對齊機制的地方。

由於注意力分數很低,除了[5,0,1]之外的所有編碼器隱藏狀態的對齊都減少到了0。這意味着,我們可以預期,第一個被翻譯的單詞,應該與帶有[5,0,1]嵌入的輸入單詞匹配起來。

第五步:將對齊向量聚合起來

將對齊向量聚合起來,得到語境向量。

 

第六步:將語境向量輸入到解碼器中

這一步怎麼做,取決於模型的架構設計。在接下來的示例中,會看到在模型架構中,解碼器如何利用語境向量。

整體的運行機制,如下圖所示:

那麼,注意力機制是如何發揮作用的呢?

反向傳播。反向傳播將盡一切努力確保輸出接近實際情況。這是通過改變RNN中的權重和評分函數(如果有的話)來完成的。

這些權重將影響編碼器的隱藏狀態和解碼器的隱藏狀態,進而影響注意力得分。

 

 

想要了解更多技術細節,可以看看下面的文章或者視頻:

「文章」深度學習中的注意力機制

「文章」遍地開花的 Attention,你真的懂嗎?

「文章」探索 NLP 中的 Attention 注意力機制及 Transformer 詳解

「視頻」李宏毅 - transformer

「視頻」李宏毅 - ELMO、BERT、GPT 講解

 

 

鏈接:

https://juejin.im/post/5dcd2eb951882510ba1cbd91

https://www.jianshu.com/p/4d52edda1d76

https://www.jianshu.com/p/abf0f85467ca

https://www.jianshu.com/p/8beafdf30f70

https://zhuanlan.zhihu.com/p/37601161

https://blog.csdn.net/yh0vlde8vg8ep9vge/article/details/86943512

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章