Transformer、Attention與seq2seq model

一、什麼是seq2seq,以及它和Attention機制有什麼關係

  • seq2seq是一種NLP常見的框架——這種框架不要求輸入和輸出序列是維度是一樣的。許多NLP task的輸入輸出維度不統一,比如機器翻譯、圖像的圖注生成、摘要生成、自動問答等。seq2seq框架大多包含encoder和decoder。
  • Attention機制只是一種思想——即,人在理解一件事物並作出判斷的時候,並不是概覽了整個事物的全貌再作出判斷,而是隻着重關注了其中一部分。比如在機器翻譯領域,每個英文單詞翻譯成中文詞彙的時候,並不是這句英文裏所有單詞都做了平等的貢獻,只是某一個或某幾個單詞作出了突出貢獻。Attention機制就是要找到一種發現事物重要信息,然後被模型着重去學習的思想。
  • Attention機制並不侷限於某個特定框架,它在不同的框架下有不同的踐行方案

二、Attention機制的基礎定義

  • 在傳統的seq2seq模型中 ,encoder將一個個輸入輸入序列按順序輸入一個RNNcell中,然後在encoder的結尾生成一個語義編碼向量C。這個C包含了輸入序列的全部內容;decoder有兩種形式——其一,將向量C考慮到每個輸出步驟中,將C及y_t之前的所有步驟的輸出都當做t時刻的輸入,輸入RNNcell計算(如圖一),這種形式的seq2seq模型可以用以下數學公式表示:

  • 從公式可以看出,在傳統的seq2seq模型中,語義編碼向量C在整個過程中一視同仁。相似的,如圖二,這裏的唯一區別就是,encoder輸出的語義編碼向量C只作用於y_1的輸出,其餘都相似。如此一來,我們相當於將整個input的句子都看完以後,再進行理解和翻譯,生成輸出。而且輸入句子中每個單詞,在decoder中的價值是一樣的。這顯然還有進步的空間。因而,我們在此基礎上增加了“Attention”機制,意圖讓decoder解碼的時候,不要一下子關注輸入序列全部的單詞,一次只關注其中幾個重要的。那麼問題來了,假設翻譯問題,當我們翻譯第一個詞的時候,我們如何知道該去關注哪些單詞呢?比如將Natural language processing->自然語言處理,我們如何知道在翻譯“自然”這個詞的時候,主要去考慮Natural,而不是其他詞語呢?

                                                                                               <seq2seq模式1>

                                                                                                <seq2seq模式2>

 

  • 具體處理方式如下(如下圖):
    • 對於一般的Attention機制而言,我們在生成decoder的t時刻輸出的時候,decoder考慮的語義編碼向量C是不一樣的,也就是說,隨着t的變化,除了輸入t時刻之前decoder的輸出值之外,還需要考慮在不斷變化的、根據encoder不同時刻隱狀態決定的語義編碼向量C。(如下圖)

    • 那麼,這個C_i到底是如何計算出來的呢?公式如上。首先,根據Query(H_i),去計算它和encoder中每個隱狀態Key(h_j)的Attention score。然後對所有的score進行softmax歸一化,最後,將歸一化後的向量分別乘以對應encoder隱狀態Value(=Key, h_j)的值,最終得到c_i

 

如何理解Attention Model?

  • 理解1:“對齊概率”。意即,還是“NLP->自然語言處理”的例子,你要計算”L“和“語言”對齊的概率,和“處理”對齊的概率
  • 理解2:“影響力模型”。意即,“L”對生成的“語言”和“處理”兩個單詞的影響力有多大。普遍的說,就是對於decoder中每個目標生成詞而言,encoder中每個位置的單詞對其有多大影響力。
  • 理解3:如下公式。我們可以理解爲,我們目前通過Source獲得了Target,而我們目標中任意一個Target位置上的Query,獲得的方式,其實就是對Source中每個位置的Value值加權求和。而這個權重,是由Query本身和Value對應的Key計算出來的

 

三、self-attention

  • 就是query向量來自序列本身的Attention

四、回答幾個問題:

回答下列問題:

a.     自注意力與注意力的區別?

  • attention一般指的是encoder和decoder之間的Attention score的計算。其中,K和V來自encoder,先計算來自decoder的隱狀態,即查詢矩陣Q和對應encoder每個位置的隱狀態鍵矩陣K之間的Attention值(這裏是使用了矩陣的點乘),然後將結果經縮放後再softmax歸一化,結果乘以K對應的值矩陣V,得到Attention結果
  • 但self-attention,指的是encoder內部或decoder內部,自己和自己的Attention score的計算。如果說Attention機制計算的是decoder某時刻的輸出與encoder所有位置的相關度的話,self-attention就是計算的encoder或decoder內部,比如一個句子中,某時刻的狀態與其他時刻位置的相關度。因爲self-attention都是一對一對計算的,所以它更善於捕獲長距離的關係,如句法特徵(一個動詞和主語賓語介詞的關係)、語義特徵(its的指代)。
  • Attention的query來自外部序列,而self-attention的query就來自於其本身

b.     爲什麼要進行殘差連接?

  • 隨着層數的加深,沒有殘差連接可能使position embedding信息彌散。加上殘差連接,可以緩解這樣的問題

c.     爲什麼要設置多頭注意力 ?

  • 多頭注意力,可以讓模型學習到多個不同方向的表示,在不同的子空間中進行學習。如果只有single head,那麼學到的相當於是多頭的平均,這會削弱多頭學習多個不同方向內容的能力

d.     一個自注意力層計算的複雜度是多少,爲什麼?

  • O(n**2*d).因爲每次計算一個self-Attention時,都需要計算t時刻與每個時刻的Attention score,這就說明有兩次循環,每次循環都遍歷所有時刻狀態,序列長度爲n,所以是n^2。而每次計算都要進行d維向量的乘積,所以還有d之後因數

e.     爲什麼要進行mask?

  • 這個機制存在於decoder中,爲了防止decoder在輸出時考慮到t時刻以後的內容,所以將t+1及其以後的信息,在反向序列的輸入中mask掉

f.      位置嵌入除了文中的這種形式還有哪些?

g. 比較一下CNN和self-attention?

  • CNN可以通過卷積核的卷積運算和pooling運算獲得局部的信息,但卷積核大小是有限的,距離特別遠的信息,self-attention可以一步搞定,而CNN可能要通過卷積-池化而計算多次;
  • CNN對比self-attention有個好出,那就是CNN可以同時考慮多個通道的輸入。這個觀點引入self-attention,就是“multi head self-attention”,同樣,通過引入多個head,我們計算不同方向的內容表示,再將這些內容表示一同考慮
  • 那麼,multi head的多頭是如何實現的?(如下圖)其實,就是將QKV矩陣分別進行不同的線性變換,得到不同的QKV矩陣,再進行self-attention的計算。所以多頭主要在於對QKV不同的線性映射方式。計算好self-attention權重後,再將結果concat在一起。最後再乘以Wo矩陣,其shape爲(n_head*d_model, d_model),目的是將n和頭拼接的,維度擴展了n倍的矩陣變換回d_model的shape

h. 爲何模型選擇了self-attention?

  • 可以並行計算
  • 可以捕獲長距離的內容

i. 爲何模型在計算Attention值的時候,對Q和K.T的矩陣除以和d_k^(1/2)?

  • 可以防止Q和K.T點乘結果變得太大。因爲二者結果要進行softmax歸一化,如果結果太大,會導致其落在softmax函數的飽和區。

 

學習鏈接

Attention Model(注意力模型)學習總結

 

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