從RNN到seq2seq+Attention
前言
本篇將從 RNN
的角度出發,一步一步進階到 seq2seq
以及加了 Attention
的 seq2seq
。
宏觀上看看什麼是seq2seq
Seq2Seq
是一個 Encoder-Decoder
結構的神經網絡,它的輸入是一個序列(Sequence
),輸出也是一個序列(Sequence
),因此而得名Seq2Seq
。
- 在
Encoder
中,將可變長度的序列轉變爲固定長度的向量表達 - 在
Decoder
中,將這個固定長度的向量轉換爲可變長度的目標的信號序列
Seq2seq
被廣泛應用在機器翻譯、聊天機器人甚至是圖像生成文字等情境
上圖是 Seq2Seq
模型工作的流程,描述如下:
Seq2Seq
包括輸入
、Encoder
、中間狀態向量C
、Decoder
、輸出
Encoder
階段,通過學習輸入,將其編碼爲一個固定大小的狀態向量C
(也稱爲語義編碼)Decoder
階段,通過對狀態向量C
的學習輸出對應的序列
Seq2Seq
核心就在於Encoder
和Decoder
,因此是一個Encoder-Decoder
結構的神經網絡
RNN談起
- 對於RNN不瞭解的可以參考:【深度學習】從循環神經網絡(RNN)到LSTM和GRU
單層網絡
有點基礎的,相信大家對如下結構都不陌生:
輸入是 ,經過隱藏層 變換()和激活函數 得到輸出
經典的RNN結構(N vs N)
但是在現實世界,我們的輸入往往不是一個x,而是一個序列,這就需要一個能夠接受序列數據輸入的網絡。
循環神經網絡(RNN)便是一類用於處理序列數據的神經網絡,就像卷積神經網絡是專門用於處理網格化數據(如一張圖像)的神經網絡,循環神經網絡時專門用於處理序列 的神經網絡。
RNN
網絡結構如下:
它就是單層網絡的重複
將序列按時間展開就可以得到RNN的結構,如下圖:
針對不同的任務,RNN的輸入不同:
- 對於自然語言處理問題,x1可以看作是第一個單詞,x2可以看作是第二個單詞,依次類推;
- 語音處理,此時,x1、x2、x3…便是每幀的語音信號
- 股價預測問題,x就可以是每天的股價
- …
具體計算過程
進行同樣地操作,就會得到如下結構(其中 都是一樣的,也就是參數共享):
以上就是RNN的基本結構了,是不是很簡單,其實就是單層網絡的疊加。上面我們只計算到 ,理論上,RNN
可以無限計算下去的,無論多長的序列,都可以按照上面的方式疊加。
不知道大家有沒有發現,RNN
的每一個時刻都有一個輸出,也就是說,如果輸入序列/時間序列長度爲 N
,那麼輸出序列的長度也爲 N
。這就是典型的 N vs N
由於這個限制,經典的RNN的適用範圍比較小
N vs 1
在有些情況下,我們需要輸入的是一個序列,輸出的是一個類別,經典的RNN就無法直接解決。事實上,我們只需要在RNN的最後一個進行輸出變換即可,無需每一個h都輸出一個值,結構如下:
這種結構通常用來處理序列分類問題,例如:
- 輸入一段文本判斷它所屬的類別
- 輸入一個句子,判斷它的情感傾向
- 輸入一段視頻,判斷它的類別等等
1 vs N
結構一(只在輸入開始時輸入計算):
結構二(輸入信息X作爲每個階段的輸入):
這種1 VS N的結構可以處理的問題有:
- 從圖像生成文字,此時輸入的X就是圖像的特徵,而輸出的y序列就是一段句子;
- 從類別生成語音或音樂等
通過上面的內容,我們已經知道了如何解決 N vs N
、N vs 1
和 1 vs N
的問題,細心的人會發現,有了多對多(相同長度)、多對一和一對多,那麼要是多對多但是長度不一樣了,又該如何解決呢?接下來,我們的重點來了
(Seq2Seq)Encoder-Decoder模型(N vs M)
原始的 N vs N
的 RNN
模型要求輸入輸出序列等長,然後我們遇到的大部分問題的輸入和輸出序列是不相等的,例如,機器翻譯中,源語言和目標語言的句子往往並沒有相同的長度。
而本節要介紹的 Encoder-Decoder模型
便是 RNN 最重要的變種,也可以稱爲 Seq2Seq模型
,在本篇的開始,我們已經瞭解了它的整體框架。
這裏我們用機器翻譯任務來介紹:
Encoder-Decoder結構
先將輸入數據編碼成一個上下文向量
圖中紅外塊就是上下文向量
得到 有多種方式,最簡單的方法就是把Encoder的最後一個隱狀態賦值給 ,還可以對最後的隱狀態做一個變換得到 ,也可以對所有的隱狀態做變換。
- 得到 之後,就用另一個RNN網絡對其進行解碼,這部分RNN網絡被稱爲Decoder。具體做法就是將 當做之前的初始狀態 輸入到Decoder中:
- 還有一種做法是將當做每一步的輸入:
由於這種Encoder-Decoder結構
不限制輸入和輸出的序列長度,因此應用的範圍非常廣泛,比如:
- 機器翻譯:
Encoder-Decoder
的最經典應用,事實上這一結構就是在機器翻譯領域最先提出的; - 文本摘要: 輸入是一段文本序列,輸出是這段文本序列的摘要序列;
- 閱讀理解: 將輸入的文章和問題分別編碼,再對其進行解碼得到問題的答案;
- 語音識別: 輸入是語音信號序列,輸出是文字序列。
Attention機制
但是,在Seq2seq
模型中,Encoder
將輸入句壓縮成固定長度的 context vector
真的好嗎?如機器翻譯問題,當要翻譯的句子較長時,固定長度的 context vector
就很容易忘記前面的內容,導致效果不好。那麼該怎麼辦呢?
這時候,Attention
就派上用場了(這詞看上去高大上,其實本質上就是加權問題,只是給了一個高大上的名字)
Attention
機制通過在每個時間輸入不同的 來解決這個問題,輸入的 由 Decoder
自己決定。下圖是帶有 Attention
機制的 Decoder
:
以機器翻譯爲例,如圖:
我們在進行 Encoder
時,會保存下每個 (這裏的 不用是RNN的輸出,當然也可以是RNN的輸出,但是如果輸出的維度較大,而且輸出僅僅是 通過轉換得到,存輸出可能需要更多的空間來存儲,那還不如直接存 );在進行 Decoder
時,就像在做搜尋一樣,在生成第一個詞machine的時候,就去搜尋它要的東西,在它看了 之後,假設從 中抽取出 (後面介紹 是怎麼抽取出來的),然後作爲Decoder的第一個輸入;生成第二個詞的時候,它會再一次看一下 ,又從 中抽取出 ;同樣又抽取出 (圖中未畫出)。
在原本的Seq2Seq模型中,
Decoder
每次的輸入都是一樣的,而加了Attention
機制後,每次輸入都是由Decoder
自行搜索得到的
那麼c是如何得到呢?
上圖中的 我們可以看作是一個關鍵字,用這個關鍵字去和每一個 進行匹配得到一個 值,而這裏的 其實也是神經網絡的參數,
match
方法也可以由自己自行設計來比較 和 的相似(匹配)程度。
上圖對得到的每個 又做了次
softmax
,是所有值的和爲1,這一步可以做也可以不做,有時候好,有時候不好,看你高興吧。
按照上面同樣地操作,直到遇到句號或<EOS>
爲止。
上面我們只是簡單介紹了 Attention機制
,下面我們具體介紹下:
既然我們已經有了前饋神經網絡和循環神經網絡,而且都有較強的能力,那麼爲什麼還需要引入 Attention機制
,前面我們提到一個重要問題就是計算問題。
- 如果我們的模型需要記住更多的“信息”,模型就會變得複雜,需要的計算量也會增加,然而目前的計算能力依然限制了神經網絡的發展,何況RNN無法並行計算,雖然也有很多研究人員嘗試使用
CNN
來代替RNN
,CNN
實際上是透過大量的layer去解決局部信息的問題 - 雖然局部連接、權重共享以及pooling等優化操作可以讓神經網絡變得簡單一些,有效緩解模型複雜度和表達能力之間的矛盾;但是,如循環神經網絡中的長距離以來問題,信息“記憶”能力並不高
可以藉助人腦處理信息過載的方式,只關注想要關心的信息。當用神經網絡來處理大量的輸入信息時,也可以借鑑人腦的注意力機制,只選擇一些關鍵的信息輸入進行處理,來提高神經網絡的效率
前面我們提到,Attention
機制的實質其實就是一個搜索的過程,這樣一來,就無須將所有的N個輸入信息都輸入到神經網絡進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網絡:這實際上就是Attention機制緩解神經網絡複雜度的體現
Attention
機制一般計算過程可以分爲如下三步:
- 信息輸入:表示N個輸入
- 計算注意力分佈(等同於前面的 )
這裏s函數爲注意力打分機制,例如:
- 加性模型:
- 點積模型:
- 縮放點積模型:
- 雙線性模型:
- 根據來計算輸入信息的加權和/加權平均
截至目前爲止,我們介紹的 Attention
機制只是最普通的,是軟性注意力(其選擇的信息是所有輸入信息在注意力分佈下的期望),它還有一些變種:
- 硬性注意力:只關注到某一個位置上的信息,硬性注意力有兩種實現方式:
- (1)一種是選取最高概率的輸入信息;
- (2)另一種硬性注意力可以通過在注意力分佈式上隨機採樣的方式實現。
硬性注意力模型的缺點:硬性注意力的一個缺點是基於最大采樣或隨機採樣的方式來選擇信息。因此最終的損失函數與注意力分佈之間的函數關係不可導,因此無法使用在反向傳播算法進行訓練。爲了使用反向傳播算法,一般使用軟性注意力來代替硬性注意力。硬性注意力需要通過強化學習來進行訓練。
- 多頭注意力:
multi-head attention
是利用多個查詢,來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接。
多頭注意力在transformer中有應用
總結
通過上面的內容,我們介紹了 Seq2Seq
和 Seq2Seq+Attention
的運作和計算方式,是不是很簡單?雖然 Seq2Seq
解決了 RNN
輸入輸出序列長度一樣的問題,但是由於其 Encoder-Decoder
部分的神經網絡還是使用的 RNN
或其變種,因此 RNN
存在的問題:無法平行化處理,導致模型訓練的時間很長, Seq2Seq
依然存在。
慶幸的是,在2017年,Google
提出了一種叫做 The transformer
的模型,透過 self attention
、multi-head
的概念去解決上述缺點,完全捨棄了RNN、CNN
的構架。我們將在下篇博客中來詳細介紹。
本篇爲博主初入學習筆記,日後會不斷提煉裏面的一些說法,如若讀者有更好的表達,還望指出,不勝感激!!!