【NLP】圖解從RNN到seq2seq+Attention

從RNN到seq2seq+Attention

前言

  本篇將從 RNN 的角度出發,一步一步進階到 seq2seq 以及加了 Attentionseq2seq

宏觀上看看什麼是seq2seq

Seq2Seq 是一個 Encoder-Decoder 結構的神經網絡,它的輸入是一個序列(Sequence),輸出也是一個序列(Sequence),因此而得名Seq2Seq

  • Encoder 中,將可變長度的序列轉變爲固定長度的向量表達
  • Decoder 中,將這個固定長度的向量轉換爲可變長度的目標的信號序列

Seq2seq 被廣泛應用在機器翻譯、聊天機器人甚至是圖像生成文字等情境

在這裏插入圖片描述

上圖是 Seq2Seq 模型工作的流程,描述如下:

  • Seq2Seq包括輸入Encoder中間狀態向量CDecoder輸出
  • Encoder 階段,通過學習輸入,將其編碼爲一個固定大小的狀態向量C(也稱爲語義編碼)
  • Decoder 階段,通過對狀態向量C的學習輸出對應的序列

Seq2Seq 核心就在於 EncoderDecoder,因此是一個 Encoder-Decoder 結構的神經網絡

RNN談起

單層網絡

有點基礎的,相信大家對如下結構都不陌生:

在這裏插入圖片描述

y=f(Wx+b)y = f(Wx+b)

輸入是 xx,經過隱藏層 hh 變換(Wx+bWx+b)和激活函數 ff 得到輸出 yy

經典的RNN結構(N vs N)

  但是在現實世界,我們的輸入往往不是一個x,而是一個序列,這就需要一個能夠接受序列數據輸入的網絡。

  循環神經網絡(RNN)便是一類用於處理序列數據的神經網絡,就像卷積神經網絡是專門用於處理網格化數據(如一張圖像)的神經網絡,循環神經網絡時專門用於處理序列 x(1),x(2),...,x(n)x^{(1)},x^{(2)},...,x^{(n)} 的神經網絡。

RNN 網絡結構如下:

在這裏插入圖片描述

它就是單層網絡的重複

將序列按時間展開就可以得到RNN的結構,如下圖:

在這裏插入圖片描述

針對不同的任務,RNN的輸入不同:

  • 對於自然語言處理問題,x1可以看作是第一個單詞,x2可以看作是第二個單詞,依次類推;
  • 語音處理,此時,x1、x2、x3…便是每幀的語音信號
  • 股價預測問題,x就可以是每天的股價

具體計算過程

在這裏插入圖片描述

h1=f(Ux1+Wh0+b)h1 = f(Ux_1 + Wh_0+b)

y1=softmax(Vh1+c)y1 = softmax(Vh_1+c)

在這裏插入圖片描述

h2=f(Ux2+Wh1+b)h2 = f(Ux_2 + Wh_1+b)

y2=softmax(Vh2+c)y2 = softmax(Vh_2+c)

進行同樣地操作,就會得到如下結構(其中 U,W,VU,W,V都是一樣的,也就是參數共享):

在這裏插入圖片描述

h3=f(Ux3+Wh2+b)h3 = f(Ux_3 + Wh_2+b)

y3=softmax(Vh3+c)y3 = softmax(Vh_3+c)

h4=f(Ux4+Wh3+b)h4 = f(Ux_4 + Wh_3+b)

y4=softmax(Vh4+c)y4 = softmax(Vh_4+c)

  以上就是RNN的基本結構了,是不是很簡單,其實就是單層網絡的疊加。上面我們只計算到 x4x4,理論上,RNN 可以無限計算下去的,無論多長的序列,都可以按照上面的方式疊加。

  不知道大家有沒有發現,RNN的每一個時刻都有一個輸出,也就是說,如果輸入序列/時間序列長度爲 N ,那麼輸出序列的長度也爲 N。這就是典型的 N vs N

由於這個限制,經典的RNN的適用範圍比較小

N vs 1

  在有些情況下,我們需要輸入的是一個序列,輸出的是一個類別,經典的RNN就無法直接解決。事實上,我們只需要在RNN的最後一個進行輸出變換即可,無需每一個h都輸出一個值,結構如下:

在這裏插入圖片描述

y=softmax(Vh4+c)y = softmax(Vh_4 + c)

這種結構通常用來處理序列分類問題,例如:

  • 輸入一段文本判斷它所屬的類別
  • 輸入一個句子,判斷它的情感傾向
  • 輸入一段視頻,判斷它的類別等等

1 vs N

結構一(只在輸入開始時輸入計算):

在這裏插入圖片描述

結構二(輸入信息X作爲每個階段的輸入):

在這裏插入圖片描述

這種1 VS N的結構可以處理的問題有:

  • 從圖像生成文字,此時輸入的X就是圖像的特徵,而輸出的y序列就是一段句子;
  • 從類別生成語音或音樂等

  通過上面的內容,我們已經知道了如何解決 N vs NN vs 11 vs N 的問題,細心的人會發現,有了多對多(相同長度)、多對一和一對多,那麼要是多對多但是長度不一樣了,又該如何解決呢?接下來,我們的重點來了

(Seq2Seq)Encoder-Decoder模型(N vs M)

  原始的 N vs NRNN 模型要求輸入輸出序列等長,然後我們遇到的大部分問題的輸入和輸出序列是不相等的,例如,機器翻譯中,源語言和目標語言的句子往往並沒有相同的長度。

  而本節要介紹的 Encoder-Decoder模型 便是 RNN 最重要的變種,也可以稱爲 Seq2Seq模型,在本篇的開始,我們已經瞭解了它的整體框架。

這裏我們用機器翻譯任務來介紹:

  • Encoder-Decoder結構 先將輸入數據編碼成一個上下文向量 CC

在這裏插入圖片描述

圖中紅外塊就是上下文向量 CC

得到 CC 有多種方式,最簡單的方法就是把Encoder的最後一個隱狀態賦值給 CC ,還可以對最後的隱狀態做一個變換得到 CC,也可以對所有的隱狀態做變換。

  • 得到 CC 之後,就用另一個RNN網絡對其進行解碼,這部分RNN網絡被稱爲Decoder。具體做法就是將 CC 當做之前的初始狀態 h0h_0 輸入到Decoder中:

在這裏插入圖片描述

  • 還有一種做法是將CC當做每一步的輸入:

在這裏插入圖片描述

由於這種Encoder-Decoder結構不限制輸入和輸出的序列長度,因此應用的範圍非常廣泛,比如:

  • 機器翻譯: Encoder-Decoder的最經典應用,事實上這一結構就是在機器翻譯領域最先提出的;
  • 文本摘要: 輸入是一段文本序列,輸出是這段文本序列的摘要序列;
  • 閱讀理解: 將輸入的文章和問題分別編碼,再對其進行解碼得到問題的答案;
  • 語音識別: 輸入是語音信號序列,輸出是文字序列。

Attention機制

  但是,在Seq2seq模型中,Encoder 將輸入句壓縮成固定長度的 context vector 真的好嗎?如機器翻譯問題,當要翻譯的句子較長時,固定長度的 context vector就很容易忘記前面的內容,導致效果不好。那麼該怎麼辦呢?

  這時候,Attention 就派上用場了(這詞看上去高大上,其實本質上就是加權問題,只是給了一個高大上的名字)

Attention 機制通過在每個時間輸入不同的 cc 來解決這個問題,輸入的 ccDecoder 自己決定。下圖是帶有 Attention 機制的 Decoder

在這裏插入圖片描述

以機器翻譯爲例,如圖:

在這裏插入圖片描述

  我們在進行 Encoder 時,會保存下每個 hh (這裏的 hh 不用是RNN的輸出,當然也可以是RNN的輸出,但是如果輸出的維度較大,而且輸出僅僅是 hh 通過轉換得到,存輸出可能需要更多的空間來存儲,那還不如直接存 hh );在進行 Decoder 時,就像在做搜尋一樣,在生成第一個詞machine的時候,就去搜尋它要的東西,在它看了 hh 之後,假設從 h1,h2h_1,h_2 中抽取出 c1c_1(後面介紹 c1c_1 是怎麼抽取出來的),然後作爲Decoder的第一個輸入;生成第二個詞的時候,它會再一次看一下 hh,又從 h3,h4h_3,h_4中抽取出 c2c_2;同樣又抽取出 c3c_3(圖中未畫出)。

在原本的Seq2Seq模型中,Decoder 每次的輸入都是一樣的,而加了 Attention 機制後,每次輸入都是由 Decoder 自行搜索得到的

那麼c是如何得到呢?

在這裏插入圖片描述

上圖中的 z0z0 我們可以看作是一個關鍵字,用這個關鍵字去和每一個 hh 進行匹配得到一個 aa 值,而這裏的 z0z0 其實也是神經網絡的參數,match 方法也可以由自己自行設計來比較 zzhh 的相似(匹配)程度。

在這裏插入圖片描述

上圖對得到的每個 aa 又做了次 softmax,是所有值的和爲1,這一步可以做也可以不做,有時候好,有時候不好,看你高興吧。

在這裏插入圖片描述

c0=a0ihic^0 = \sum a_0^ih^i

=0.5h1+0.5h2= 0.5h^1+0.5h^2

在這裏插入圖片描述

c1=a1ihic^1 = \sum a_1^ih^i

=0.5h3+0.5h4= 0.5h^3+0.5h^4

按照上面同樣地操作,直到遇到句號或<EOS>爲止。

上面我們只是簡單介紹了 Attention機制,下面我們具體介紹下:

  既然我們已經有了前饋神經網絡和循環神經網絡,而且都有較強的能力,那麼爲什麼還需要引入 Attention機制,前面我們提到一個重要問題就是計算問題。

  • 如果我們的模型需要記住更多的“信息”,模型就會變得複雜,需要的計算量也會增加,然而目前的計算能力依然限制了神經網絡的發展,何況RNN無法並行計算,雖然也有很多研究人員嘗試使用 CNN 來代替 RNNCNN實際上是透過大量的layer去解決局部信息的問題
  • 雖然局部連接、權重共享以及pooling等優化操作可以讓神經網絡變得簡單一些,有效緩解模型複雜度和表達能力之間的矛盾;但是,如循環神經網絡中的長距離以來問題,信息“記憶”能力並不高

可以藉助人腦處理信息過載的方式,只關注想要關心的信息。當用神經網絡來處理大量的輸入信息時,也可以借鑑人腦的注意力機制,只選擇一些關鍵的信息輸入進行處理,來提高神經網絡的效率

前面我們提到,Attention 機制的實質其實就是一個搜索的過程,這樣一來,就無須將所有的N個輸入信息都輸入到神經網絡進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網絡:這實際上就是Attention機制緩解神經網絡複雜度的體現

Attention 機制一般計算過程可以分爲如下三步:

  • 信息輸入:X=[x1,x2,...,xN]X = [x_1, x_2, ... ,x_N]表示N個輸入
  • 計算注意力分佈α\alpha(等同於前面的 aa
    αi^=softmax(s(xi,q))\hat{\alpha_i}=softmax(s(x_i,q))

這裏s函數爲注意力打分機制,例如:

  • 加性模型:s(xi,q)=VTtanh(Wxi+Uq)s(x_i,q)=V^Ttanh(Wx_i+Uq)
  • 點積模型:s(xi,q)=XiTqs(x_i,q)=X_i^Tq
  • 縮放點積模型:s(xi,q)=XiTqds(x_i,q)=\frac{X_i^Tq}{\sqrt{d}}
  • 雙線性模型:s(xi,q)=XiTWqs(x_i,q)=X_i^TWq
  • 根據α\alpha來計算輸入信息的加權和/加權平均
    att(q,X)=i=1Nαi^Xiatt(q,X) = \sum_{i=1}^N\hat{\alpha_i}X_i

截至目前爲止,我們介紹的 Attention 機制只是最普通的,是軟性注意力(其選擇的信息是所有輸入信息在注意力分佈下的期望),它還有一些變種:

  • 硬性注意力:只關注到某一個位置上的信息,硬性注意力有兩種實現方式:
    • (1)一種是選取最高概率的輸入信息;
    • (2)另一種硬性注意力可以通過在注意力分佈式上隨機採樣的方式實現。

硬性注意力模型的缺點:硬性注意力的一個缺點是基於最大采樣或隨機採樣的方式來選擇信息。因此最終的損失函數與注意力分佈之間的函數關係不可導,因此無法使用在反向傳播算法進行訓練。爲了使用反向傳播算法,一般使用軟性注意力來代替硬性注意力。硬性注意力需要通過強化學習來進行訓練。

  • 多頭注意力:multi-head attention是利用多個查詢Q=[q1,...,qM]Q = [q_1,...,q_M],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接。

多頭注意力在transformer中有應用

總結

  通過上面的內容,我們介紹了 Seq2SeqSeq2Seq+Attention的運作和計算方式,是不是很簡單?雖然 Seq2Seq 解決了 RNN 輸入輸出序列長度一樣的問題,但是由於其 Encoder-Decoder 部分的神經網絡還是使用的 RNN 或其變種,因此 RNN 存在的問題:無法平行化處理,導致模型訓練的時間很長, Seq2Seq 依然存在。

  慶幸的是,在2017年,Google 提出了一種叫做 The transformer 的模型,透過 self attentionmulti-head 的概念去解決上述缺點,完全捨棄了RNN、CNN的構架。我們將在下篇博客中來詳細介紹。

本篇爲博主初入學習筆記,日後會不斷提煉裏面的一些說法,如若讀者有更好的表達,還望指出,不勝感激!!!

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