引言:
本文的路線:從文本摘要的需求引出Seq2Seq->Encoder->Decoder,由於長文本,所以又引出了Attention機制。
什麼是NLP中的文本摘要
自動文本摘要是在保持關鍵信息內容和整體含義的同時,生成簡潔流暢的摘要的任務。文本摘要目前大致可以分為抽取式與生成式兩種類型:
1. Extractive Summarization:根據詞語重要性、句子重要性排序,抽取出重要度高的句子,從而形成摘要。主要是對文本的選擇,算法過程相對更容易,但是對於複雜的文本時,很難僅僅通過選擇文本來形成摘要,如小說。
2. Abstractive Summarization:過程更為複雜,但生成能力更強,可認為有一定的概括能力。
Extractive Summarization
由圖可以看出,這種方法提取的內容語句來自於原文。
Abstractive Summarization
由圖可以看出,這種方法提取的內容語句可能不存在於原文。
Seq2Seq模型
Seq2Seq模型可以處理一切連續型信息,包括情感分類,機器翻譯,命名實體識別等。
- 機器翻譯任務中,輸入是連續文本序列,輸出也是連續文本序列。
2. 命名實體識別中,輸入是連續文本序列,輸出是連續的標籤信息。
所以,我們可以利用Seq2Seq模型,通過輸入一段長文本,輸出短的摘要,實現文本摘要功能。下圖是典型的Seq2Seq模型架構:
通常我們可以選擇RNNs網絡的變體GRU或者LSTM,這是因為它們能夠通過克服梯度消失的問題來捕獲長期依賴性。
Encoder編碼器
LSTM中的Encoder讀取整個輸入序列,其中每個時間step上,都會有一個字輸入編碼器。然後,他在每個時間step上處理信息,並捕獲輸入序列中存在的上下文信息。
上一個時間step的隱藏層h1與記憶單元層c1將會用來初始化Decoder。
Decoder解碼器
Decoder是LSTM結構的另一部分。它逐字讀取整個目標序列,並以一個時間步長預測相同的序列偏移量。解碼器可以在給定前一個單詞的情況下預測序列中的下一個單詞。解碼器的初始輸入是編碼器最後一步的結果。
在將整個目標序列放入解碼器前,還需將[start] 與 [end]這兩個特殊的tokens加入序列中,告知模型的開始與結束。模型通過輸入的[start]開始預測第一個詞,而[end]則表示整個句子的結束。
Deocder的工作流程
假設輸入序列為[x1,x2,x3,x4],將其編碼成內部固定長度的向量。下圖顯示了每一個time step下Decoder是如何工作的。
推理部分
下圖是整個Encoder-Decode的結構。通過上面的理解,我覺得這個圖非常清晰。
- Encoder整個輸入序列,並且用Encoder最後一個狀態結果來初始化Decoder。
- 將[start]作為輸入傳遞給解碼器Decoder。
- 使用通過Encoder初始化過的Decoder運行一個time stpe。
- 輸出將是下一個單詞的概率,將選擇概率最大的單詞。
- 這個預測的單詞將會在下一時間Step中作為輸入。並且通過當前狀態更新內部參數。
- 重複步驟3-5,直到生成[end]或達到目標序列的最大長度。
Encoder-Decoder結構的侷限性
Encoder將整個輸入序列轉為固定的長度,但是當序列很長的時候,Encoder將會很難記住整個序列的內容,無法將所有必要信息準確的編碼到固定長度。但是,我們需要關注序列中所有的內容麼,不需要。
注意力機制
為了解決長句子的問題,注意力機制出現在人們的視野。注意力機制為對結果重要的部分添加高的權重,以保留主要信息。舉個例子:
- 需要編碼的序列[x1,x2,x3,x4,x5,x6,x7]
Source sequence: “Which sport do you like the most? - 需要解碼的序列[y1,y2,y3]
Target sequence: I love cricket.
我們可以判斷,y1[I]與x4[you]有關,而y2[love]則與x5[like]有關。所以,相比記住序列中的所有單詞,不如增加對目標序列重要部分的權重,忽視低權重的部分。
Global Attention and Local Attention
編碼器的隱藏層中,所有部分都參與attention計算上下文。
編碼器的隱藏層中,僅有部分參與attention計算上下文。
本文最終採用全局注意力機制。(只是添加了注意力機制,編碼的固定長度依然需要固定。所以實戰中需要通過數據確定一個合適的長度數值。短了無法表達文本內容,長了會造成計算資源浪費。)
實戰
我們的目標是為亞馬遜美食評論生成文本摘要。(這裡我只提取了我覺得有用的部分)
數據表述
這些評論通常很長而且具有可描述性。數據集下載:kaggleData。數據涵蓋了超過10年的時間,包括截至2012年10月的所有〜500,000條評論。這些評論包括產品,用戶信息,評級,純文本評論和摘要。它還包括來自所有其他亞馬遜類別的評論。
數據處理
由於評論文本和摘要中涉及的預處理步驟略有不同,因此我們需要定義兩個不同的函數來預處理評論和摘要。
評論文本處理
- 將所有字母小寫;
- 移除HTML標籤;
- Contraction mapping;
- 移除(‘s);
- 刪除括號內的內容(覺得括號裡面的內容解釋說明不重要);
- 消除標點符號和特殊字符;
- 刪除停用詞;
- 刪除低頻詞;
摘要文本處理
為摘要文本添加[start]和[end]。
數據分佈
通過數據統計,可以看到摘要與文本數據的長度分佈。通過數據可視化,我們可以將評論文本的長度限定在80,而摘要的長度限定在10。
建立Tokenizer
通過分詞器生成詞彙表,並將單詞文本序列轉為數值序列,方便計算機計算。
模型建立
- 我們可以選擇是否讓LSTM在每個時間步都會生成隱藏狀態h和記憶單元狀態c。
- 選擇LSTM是否僅生成最後一個時間步的隱藏狀態h和記憶單元狀態c。
- 選擇LSTM相互堆疊提高模型效果。
- 選擇雙向LSTM,可以雙向處理文本數據,獲取更加豐富的上下文信息。
- 使用beam search strategy代替貪婪方法argmax。
- 根據BLEU分數評估模型的性能。
- 可以選擇指針生成網絡,
- 因為整數序列採用獨熱編碼的方式,所以損失函數採用了稀疏交叉熵,對內存友好。
數學理解注意力機制
1. 編碼器為源文本序列每一個時間步j都生成了一個隱藏狀態值hj。
2. 相似的工作,解碼器為目標文本每一個時間步i都生成了隱藏狀態值si。
3. alignment score: e_ij。用這個分數表示源文本中的第j步單詞與目標文本中第i步單詞的關聯度。可以用hj與si來計算這個分數值
根據所使用的得分函數的類型,有不同類型的注意力機制。這裡列舉一些流行的注意力機制:
4. 使用softmax函數對注意力參數的值進行歸一化。
5. 計算注意力權重 a_ij與編碼器hj的隱藏狀態乘積的線性總和,以產生注意力上下文向量Ci。
6. 將注意力上一下文向量Ci與目標隱藏層向量si級聯以產生新的注意力隱藏層向量Si。
7. 將注意力隱藏層向量傳入密集層產生yi。
英文原文:Comprehensive Guide to Text Summarization using Deep Learning in Python
公眾號【深度學習視覺】整理
閱讀更多 量子AI 的文章