【自然語言處理】Text Summarization文本摘要與注意力機制

Text Summarization
英文原文
公衆號【深度學習視覺】整理

什麼是NLP中的文本摘要

自動文本摘要是在保持關鍵信息內容和整體含義的同時,生成簡潔流暢的摘要的任務。
文本摘要目前大致可以分爲兩種類型:

  1. Extractive Summarization:重要內容、語句提取。
  2. Abstractive Summarization:文本總結。

Extractive Summarization

由圖可以看出,這種方法提取的內容語句來自於原文。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-LHghTQ9m-1584188586036)(images/ExtractiveSummarization.jpg)]

Abstractive Summarization

由圖可以看出,這種方法提取的內容語句可能不存在於原文。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-7p1MFbCb-1584188586038)(images/AbstractiveSummarization.jpg)]

Seq2Seq模型

Seq2Seq模型可以處理一切連續型信息,包括情感分類,機器翻譯,命名實體識別等。
機器翻譯任務中,輸入是連續文本序列,輸出也是連續文本序列。
命名實體識別中,輸入是連續文本序列,輸出是連續的標籤信息。
所以,我們可以利用Seq2Seq模型,通過輸入一段長文本,輸出短的摘要,實現文本摘要功能。
下圖是典型的Seq2Seq模型架構:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-a3IPXmII-1584188586043)(images/Seq2Seq_EncoderDecoder.jpg)]
通常我們可以選擇RNNs網絡的變體GRU或者LSTM,這是因爲它們能夠通過克服梯度消失的問題來捕獲長期依賴性。

Encoder編碼器

LSTM中的Encoder讀取整個輸入序列,其中每個時間step上,都會有一個字輸入編碼器。然後,他在每個時間step上處理信息,並捕獲輸入序列中存在的上下文信息。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SAhvnaSo-1584188586044)(images/LSTM_Encoder.jpg)]
上一個時間step的隱藏層h1與記憶單元層c1將會用來初始化Decoder。

Decoder解碼器

Decoder是LSTM結構的另一部分。它逐字讀取整個目標序列,並以一個時間步長預測相同的序列偏移量。
解碼器可以在給定前一個單詞的情況下預測序列中的下一個單詞。解碼器的初始輸入是編碼器最後一步的結果。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-QwMhgT9a-1584188586044)(images/LSTM_Decoder.jpg)]
在將整個目標序列放入解碼器前,還需將[start] 與 [end]這兩個特殊的tokens加入序列中,告知模型的開始與結束。模型通過輸入的[start]開始預測第一個詞,而[end]則表示整個句子的結束。

Deocder的工作流程

假設輸入序列爲[x1,x2,x3,x4],將其編碼成內部固定長度的向量。
下圖顯示了每一個time step下Decoder是如何工作的。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sUF5Xb64-1584188586045)(images/Decoder_Timestep0.jpg)]

推理部分

下圖是整個Encoder-Decode的結構。通過上面的理解,我覺得這個圖非常清晰。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vqYc4Asz-1584188586046)(images/LSTM_Inference.jpg)]

  1. Encoder整個輸入序列,並且用Encoder最後一個狀態結果來初始化Decoder。
  2. 將[start]作爲輸入傳遞給解碼器Decoder。
  3. 使用通過Encoder初始化過的Decoder運行一個time stpe。
  4. 輸出將是下一個單詞的概率,將選擇概率最大的單詞。
  5. 這個預測的單詞將會在下一時間Step中作爲輸入。並且通過當前狀態更新內部參數。
  6. 重複步驟3-5,直到生成[end]或達到目標序列的最大長度。

Encoder-Decoder結構的侷限性

Encoder將整個輸入序列轉爲固定的長度,但是當序列很長的時候,Encoder將會很難記住整個序列的內容,無法將所有必要信息準確的編碼到固定長度。但是,我們需要關注序列中所有的內容麼,不需要。

注意力機制

爲了解決長句子的問題,注意力機制出現在人們的視野。注意力機制爲對結果重要的部分添加高的權重,以保留主要信息。舉個例子:

  1. 需要編碼的序列[x1,x2,x3,x4,x5,x6,x7]
    Source sequence: “Which sport do you like the most?
  2. 需要解碼的序列[y1,y2,y3]
    Target sequence: I love cricket.

我們可以判斷,y1[I]與x4[you]有關,而y2[love]則與x5[like]有關。所以,相比記住序列中的所有單詞,不如增加對目標序列重要部分的權重,忽視低權重的部分。

Global Attention and Local Attention

編碼器的隱藏層中,所有部分都參與attention的計算上下文。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-kKSnMrVL-1584188586048)(images/Sqe2Sqe_GlobalAttention.jpg)]
編碼器的隱藏層中,僅有部分參與attention的計算上下文。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-c5abpy2u-1584188586048)(images/Sqe2Sqe_GlobalAttention.jpg)]
本文最終採用全局注意力機制。(只是添加了注意力機制,編碼的固定長度依然需要固定。所以實戰中需要通過數據確定一個合適的長度數值。短了無法表達文本內容,長了會造成計算資源浪費。)

實戰

我們的目標是爲亞馬遜美食評論生成文本摘要。(這裏我只提取了我覺得有用的部分)

數據表述

這些評論通常很長而且具有可描述性。數據集下載:kaggleData
數據涵蓋了超過10年的時間,包括截至2012年10月的所有〜500,000條評論。這些評論包括產品,用戶信息,評級,純文本評論和摘要。它還包括來自所有其他亞馬遜類別的評論。

數據處理

由於評論文本和摘要中涉及的預處理步驟略有不同,因此我們需要定義兩個不同的函數來預處理評論和摘要。

評論文本處理

  1. 將所有字母小寫;
  2. 移除HTML標籤;
  3. Contraction mapping;
  4. 移除(‘s);
  5. 刪除括號內的內容(覺得括號裏面的內容解釋說明不重要);
  6. 消除標點符號和特殊字符;
  7. 刪除停用詞;
  8. 刪除低頻詞;

摘要文本處理

爲摘要文本添加[start]和[end]。

數據分佈

通過數據統計,可以看到摘要與文本數據的長度分佈。通過數據可視化,我們可以將評論文本的長度限定在80,而摘要的長度限定在10。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-WjCiF1Cw-1584188586049)(images/SummayText_Length.jpg)]

建立Tokenizer

通過分詞器生成詞彙表,並將單詞文本序列轉爲數值序列,方便計算機計算。

模型建立

  1. 我們可以選擇是否讓LSTM在每個時間步都會生成隱藏狀態h和記憶單元狀態c。
  2. 選擇LSTM是否僅生成最後一個時間步的隱藏狀態h和記憶單元狀態c。
  3. 選擇LSTM相互堆疊提高模型效果。
  4. 選擇雙向LSTM,可以雙向處理文本數據,獲取更加豐富的上下文信息。
  5. 使用beam search strategy代替貪婪方法argmax。
  6. 根據BLEU分數評估模型的性能。
  7. 可以選擇指針生成網絡,
  8. 因爲整數序列採用獨熱編碼的方式,所以損失函數採用了稀疏交叉熵,對內存友好。

數學理解注意力機制

  1. 編碼器爲源文本序列每一個時間步j都生成了一個隱藏狀態值hj。

  2. 相似的工作,解碼器爲目標文本每一個時間步i都生成了隱藏狀態值si。

  3. alignment score: eije_{ij}。用這個分數表示源文本中的第j步單詞與目標文本中第i步單詞的關聯度。可以用hj與si來計算這個分數值eij=score(si,hj)e_{ij} = score(s_i,h_j)
    根據所使用的得分函數的類型,有不同類型的注意力機制。這裏列舉一些流行的注意力機制:
    [外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-3EG1G8WU-1584188586050)(images/LSTM_Attention_ScoreFunction.jpg)]

  4. 使用softmax函數對注意力參數的值進行歸一化。aij=eijk=1Teika_{ij}=\frac{e_{ij}}{\sum^{T}_{k=1}e_{ik}}

  5. 計算注意力權重aija_{ij}與編碼器hj的隱藏狀態乘積的線性總和,以產生注意力上下文向量Ci。Ci=j=1TaijhijC_{i} = \sum^T_{j=1}a_{ij}h_{ij}
    在這裏插入圖片描述

  6. 將注意力上一下文向量Ci與目標隱藏層向量si級聯以產生新的注意力隱藏層向量Si。Si=concatenate([si;Ci])S_i=concatenate([s_{i};C_{i}])

  7. 將注意力隱藏層向量傳入密集層產生yi。yi=dense(Si)y_{i}=dense(S_{i})

本文由公衆號【深度學習視覺】整理。

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