NLP系列3:seq2seq-->pgn


seq2seq

3eCuaq.md.png

每個詞在編碼器端,經過雙向LSTM,在解碼端編碼層的隱藏狀態和解碼器的隱藏狀態,做一個加法attention:

\[e_i^t = v^Ttanh(W_hh_i+W_ss_t+b_{attn}) \]

\[a^t = softmax(e^t) \]

其中:

  • \(h_i\) -> encoder hidden
  • \(s_t\) -> decoder state
  • \(b_{attn}\) -> 偏置向量

得到上下文向量\(h_t^*\)

\[h_t^*=\sum_ia_i^th_i \]

其中:

  • \(h_t^*\) -> context vector

有上下文向量和解碼的隱藏狀態,經過兩層線性層,得到最后的詞表概率分布

\[P_{vocab}=softmax(V^`(V[s_t,h_t^*]+b)+b^`) \]

在預測階段選擇概率最大的那個詞,作為解碼端的輸出。在訓練的時候,通過求負對數函數,得到損失函數,令損失函數最小:

\[loss_t = -logP(w_t^*) \]

整個句子的損失為:

\[loss = \frac{1}{T}\sum_{t=0}^{T}loss_t \]

  • 貢獻

Seq2Seq的模型結構在摘要的生成方面提供了可能。

  • 缺點

    1、無法生成OOV,只能生成詞匯表的詞

    2、會產生錯誤的事實,比如姓名之間,Amy可能變成Bob;

    3、自我重復,如:貼膜,貼膜,質量比較高,貼膜,質量比較高,貼膜,質量比較高,貼膜,質量比較高,貼膜,質量比較高,貼膜,質量比較高,貼膜,質量

改進

指針生成網絡 - > PGN

  • 一句話概括

    將decoder端的softmax加上源端的attention分布的混合概率,兩部分的權重依賴\(p_{gen}\),該值在0~1,越大,表示越依賴生成部分。

文章思路

  • 首先使用了一種混合的指針生成網絡,他能夠從源端復制單詞,也能夠從詞表沖生成詞語。
  • 使用coverage,去追蹤那些已經被總結的單詞,保證不會重復生成。

pointer generator model

3ePxAI.md.png

指針生成網絡是baseline和指針網絡的混合,它可以通過指向去復制,也可以從固定的詞表當中去生成詞匯。注意力分布的計算和上下文向量的計算不變。

多增加了一個生成概率,屬於0~1.對於每一個解碼時刻,都存在這樣的上下文向量,解碼狀態隱藏層和解碼的輸入共同計算概率:

\[P_{gen}=sigmoid(W_{h^*}^Th_t^*+W_s^Ts_t+W_x^Tx_t+b_{ptr}) \]

其中:

  • \(t\) -> time step
  • \(h_t^*\) -> context vector
  • \(s_t\) -> decoder state
  • \(x_t\) -> decoder input

最后詞\(w\)的概率由詞表概率和源端(encoder的輸入)的attention分布共同獲得,如果\(w\)未在源端出現,則\(a\)為0。在預測階段,輸出一個概率分布,其維度是詞表長度加上源端句子中未出現在詞表沖的單詞個數。

\[P(w)=P_{gen}P_{vocab}(w) + (1-P_{gen})\sum_{i:w_i=w}a_i^t \]

其中:

  • \(a_i^t\) -> attention weight

因為指針網絡控制輸出是copy自原文還是從字典生成得到的,如果詞w沒有在源端,所以我們attention部分的權重應該為0;w若是屬於oov,那么\(p_{gen}=0\) .


筆者極端理解情況:假設原始輸入的是道奇........,預測是豐田,豐田是個oov詞,\(p_{gen}=0\),豐田原文又沒有出現,\(a_i^t=0\),那這樣是不是就又出現 的問題了?----> 極少會出現


優點-->解決了seq2seq的1、2兩個問題

  • pointer-generator network能夠很容易的復制輸入的文本內容,可以通過\(P_{gen}\)來調節;
  • pointer-generator network能夠從輸入的文本內容中復制oov詞匯,這是最大的優點,這個也可以采用更小的詞匯表vocabulary,較少計算量和存儲空間;
  • pointer-generator network訓練會更快,在seq2seq訓練過程中用更少的迭代次數就能取得一樣的效果。

coverage mechanism

在序列到序列的模型中,重復問題是一個普遍問題,尤其長文本摘要生成任務中。在我們的coverage模型中,使用了一個\(c^t\),其代表了當前解碼時刻,\(t\)之前的所有注意力分布的和。

\[c^t=\sum_{t^`=0}^{t-1}a^{t^`} \]

\(c^0\)是個零向量,在計算attention得分的時候,我們將詞向量作為新的輸入.

\[e_i^t=v^Ttanh(W_hh_i+W_ss_t+w_cc_i^t+b_{attn}) \]

也需要增加loss懲罰項:

\[covloss_t=\sum_imin(a_i^t,c_i^t) \]

\[loss_t = -logP(w_t^*)+\lambda\sum_imin(a_i^t,c_i^t) \]

以第一時刻為例,\(c_1\)表示的是\(a_0\),那么\(a_0\)\(a_1\)當中選擇最小的作為loss.如果\(a_0\)\(a_1\)關注的都是同樣的分布,那么loss就會比較大,如果他們關注的是不同的分布,因為選擇的是兩個中最小的一個,所以這樣loss會比較小.目的就是想讓他每一時刻關注的分布是不一樣的,這樣避免重復.

優點 --> 解決了seq2seq repeat問題

思考

  • 問答摘要是人為做出來的,具有主觀性,有時候模型生成的是正確的,但是和參考摘要去匹配卻只有很低的分.

  • 訓練參數減少是因為有了copy功能,解決了oov問題,我們的vocab就會更小,所以較少了訓練參數量.

參考

https://blog.csdn.net/ganxiwu9686/article/details/87521054


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM