Seq2Seq模型
基本原理
-
核心思想:將一個作為輸入的序列映射為一個作為輸出的序列
- 編碼輸入
- 解碼輸出
-
- 解碼第一步,解碼器進入編碼器的最終狀態,生成第一個輸出
- 以后解碼器讀入上一步的輸出,生成當前步輸出
-
組成部件:
- Encoder
- Decoder
- 連接兩者的固定大小的State Vector
解碼方法
- 最核心部分,大部分的改進
- 貪心法
- 選取一種度量標准后,在當前狀態下選擇最佳的一個結果,直到結束
- 計算代價低
- 局部最優解
- 選取一種度量標准后,在當前狀態下選擇最佳的一個結果,直到結束
- 集束搜索(Beam Search)
- 啟發式算法
- 保存beam size個當前較佳選擇,決定了計算量,8~12最佳
- 解碼時每一步根據保存的結果選擇下一步擴展和排序,選擇前beam size個保存
- 循環迭代,直到結束。選擇最佳結果輸出
- 改進
- 堆疊RNN
- Dropout機制
- 與編碼器之間建立殘差連接
- 注意力機制
- 記憶網絡
注意力機制
Seq2Seq模型中的注意力機制
- 在實際發現,隨着輸入序列增長,模型性能發生顯著下降
- 小技巧
- 將源語言句子逆序輸入,或者重復輸入兩遍,得到一定的性能提升
- 解碼時當前詞及對應的源語言詞的上下文信息和位置信息在編解碼過程中丟失了
- 引入注意力機制解決上述問題:
- 解碼時,每一個輸出詞都依賴於前一個隱狀態以及輸入序列每一個對應的隱狀態
\[s_i = f(s_{i-1}, y_{i-1},c_i) \]\[p(y_i|y_1,\cdots,y_{i-1})=g(y_{i-1},s_i,c_i) \]其中,\(y\)是輸出詞,\(s\)是當前隱狀態,\(f,g\)是非線性變換,通常為神經網絡
- 語境向量\(c_i\)是輸入序列全部隱狀態\(h_1,\cdots,h_T\)的加權和
\[c_i=\sum \limits_{j=1}^T a_{ij}h_j \]\[a_{ij} = \frac{\exp(e_{ij})}{\sum_k \exp(e_{ij})} \]\[e_{ij}=a(s_{i-1},h_j) \]
- 神經網絡\(a\)將上一個輸出序列隱狀態\(s_{i-1}\)和輸入序列隱狀態\(h_j\)作為輸入,計算出一個\(x_j,y_i\)對齊的值\(e_{ij}\)
- 考慮每個輸入詞與當前輸出詞的對齊關系,對齊越好的詞,會有更大權重,對當前輸出影響更大
- 雙向循環神經網絡
-
單方向:\(h_i\)只包含了\(x_0\)到\(x_i\)的信息,\(a_{ij}\)丟失了\(x_i\)后面的信息
-
雙方向:第\(i\)個輸入詞對應的隱狀態包括了\(\overrightarrow{h}_i\)和\(\overleftarrow{h}_i\),前者編碼了\(x_0\)到\(x_i\)的信息,后者編碼了\(x_i\)及之后的信息,防止信息丟失
-
- 解碼時,每一個輸出詞都依賴於前一個隱狀態以及輸入序列每一個對應的隱狀態
常見Attention形式
-
本質:一個查詢(query)到一系列(鍵key-值value)對的映射
-
計算過程
- 將query和每個key進行相似度計算得到權重,常用的相似度函數有點積,拼接,感知機等
- 使用一個softmax函數對這些權重進行歸一化
- 權重和相應的鍵值value進行加權求和得到最后的attention