1. 什么是textRNN
textRNN指的是利用RNN循環神經網絡解決文本分類問題,文本分類是自然語言處理的一個基本任務,試圖推斷出給定文本(句子、文檔等)的標簽或標簽集合。
文本分類的應用非常廣泛,如:
- 垃圾郵件分類:2分類問題,判斷郵件是否為垃圾郵件
- 情感分析:2分類問題:判斷文本情感是積極還是消極;多分類問題:判斷文本情感屬於{非常消極,消極,中立,積極,非常積極}中的哪一類。
- 新聞主題分類:判斷一段新聞屬於哪個類別,如財經、體育、娛樂等。根據類別標簽的數量,可以是2分類也可以是多分類。
- 自動問答系統中的問句分類
- 社區問答系統中的問題分類:多標簽多分類(對一段文本進行多分類,該文本可能有多個標簽),如知乎看山杯
- 讓AI做法官:基於案件事實描述文本的罰金等級分類(多分類)和法條分類(多標簽多分類)
- 判斷新聞是否為機器人所寫:2分類
1.1 textRNN的原理
在一些自然語言處理任務中,當對序列進行處理時,我們一般會采用循環神經網絡RNN,尤其是它的一些變種,如LSTM(更常用),GRU。當然我們也可以把RNN運用到文本分類任務中。
這里的文本可以一個句子,文檔(短文本,若干句子)或篇章(長文本),因此每段文本的長度都不盡相同。在對文本進行分類時,我們一般會指定一個固定的輸入序列/文本長度:該長度可以是最長文本/序列的長度,此時其他所有文本/序列都要進行填充以達到該長度;該長度也可以是訓練集中所有文本/序列長度的均值,此時對於過長的文本/序列需要進行截斷,過短的文本則進行填充。總之,要使得訓練集中所有的文本/序列長度相同,該長度除之前提到的設置外,也可以是其他任意合理的數值。在測試時,也需要對測試集中的文本/序列做同樣的處理。
假設訓練集中所有文本/序列的長度統一為n,我們需要對文本進行分詞,並使用詞嵌入得到每個詞固定維度的向量表示。對於每一個輸入文本/序列,我們可以在RNN的每一個時間步長上輸入文本中一個單詞的向量表示,計算當前時間步長上的隱藏狀態,然后用於當前時間步驟的輸出以及傳遞給下一個時間步長並和下一個單詞的詞向量一起作為RNN單元輸入,然后再計算下一個時間步長上RNN的隱藏狀態,以此重復...直到處理完輸入文本中的每一個單詞,由於輸入文本的長度為n,所以要經歷n個時間步長。
基於RNN的文本分類模型非常靈活,有多種多樣的結構。接下來,我們主要介紹兩種典型的結構。
2. textRNN網絡結構
2.1 structure 1
流程:embedding--->BiLSTM--->concat final output/average all output----->softmax layer
結構圖如下圖所示:
一般取前向/反向LSTM在最后一個時間步長上隱藏狀態,然后進行拼接,在經過一個softmax層(輸出層使用softmax激活函數)進行一個多分類;或者取前向/反向LSTM在每一個時間步長上的隱藏狀態,對每一個時間步長上的兩個隱藏狀態進行拼接,然后對所有時間步長上拼接后的隱藏狀態取均值,再經過一個softmax層(輸出層使用softmax激活函數)進行一個多分類(2分類的話使用sigmoid激活函數)。
上述結構也可以添加dropout/L2正則化或BatchNormalization 來防止過擬合以及加速模型訓練。
2.2 structure 2
流程:embedding-->BiLSTM---->(dropout)-->concat ouput--->UniLSTM--->(droput)-->softmax layer
結構圖如下圖所示:
與之前結構不同的是,在雙向LSTM(上圖不太准確,底層應該是一個雙向LSTM)的基礎上又堆疊了一個單向的LSTM。把雙向LSTM在每一個時間步長上的兩個隱藏狀態進行拼接,作為上層單向LSTM每一個時間步長上的一個輸入,最后取上層單向LSTM最后一個時間步長上的隱藏狀態,再經過一個softmax層(輸出層使用softamx激活函數,2分類的話則使用sigmoid)進行一個多分類。
2.3 總結
TextRNN的結構非常靈活,可以任意改變。比如把LSTM單元替換為GRU單元,把雙向改為單向,添加dropout或BatchNormalization以及再多堆疊一層等等。TextRNN在文本分類任務上的效果非常好,與TextCNN不相上下,但RNN的訓練速度相對偏慢,一般2層就已經足夠多了。
3. 什么是textCNN
在“卷積神經⽹絡”中我們探究了如何使⽤⼆維卷積神經⽹絡來處理⼆維圖像數據。在之前的語⾔模型和⽂本分類任務中,我們將⽂本數據看作是只有⼀個維度的時間序列,並很⾃然地使⽤循環神經⽹絡來表征這樣的數據。其實,我們也可以將⽂本當作⼀維圖像,從而可以⽤⼀維卷積神經⽹絡來捕捉臨近詞之間的關聯。本節將介紹將卷積神經⽹絡應⽤到⽂本分析的開創性⼯作之⼀:textCNN。
3.1 ⼀維卷積層
在介紹模型前我們先來解釋⼀維卷積層的⼯作原理。與⼆維卷積層⼀樣,⼀維卷積層使⽤⼀維的互相關運算。在⼀維互相關運算中,卷積窗口從輸⼊數組的最左⽅開始,按從左往右的順序,依次在輸⼊數組上滑動。當卷積窗口滑動到某⼀位置時,窗口中的輸⼊⼦數組與核數組按元素相乘並求和,得到輸出數組中相應位置的元素。如下圖所⽰,輸⼊是⼀個寬為7的⼀維數組,核數組的寬為2。可以看到輸出的寬度為 7 - 2 + 1 = 6,且第⼀個元素是由輸⼊的最左邊的寬為2的⼦數組與核數組按元素相乘后再相加得到的:0 × 1 + 1 × 2 = 2。
多輸⼊通道的⼀維互相關運算也與多輸⼊通道的⼆維互相關運算類似:在每個通道上,將核與相應的輸⼊做⼀維互相關運算,並將通道之間的結果相加得到輸出結果。下圖展⽰了含3個輸⼊ 通道的⼀維互相關運算,其中陰影部分為第⼀個輸出元素及其計算所使⽤的輸⼊和核數組元素: 0 × 1 + 1 × 2 + 1 × 3 + 2 × 4 + 2 × (-1) + 3 × (-3) = 2。
由⼆維互相關運算的定義可知,多輸⼊通道的⼀維互相關運算可以看作單輸⼊通道的⼆維互相關運算。如下圖所⽰,我們也可以將上圖中多輸⼊通道的⼀維互相關運算以等價的單輸⼊通道的⼆維互相關運算呈現。這⾥核的⾼等於輸⼊的⾼。下圖的陰影部分為第⼀個輸出元素及其計算所使⽤的輸⼊和核數組元素:2 × (-1) + 3 × (-3) + 1 × 3 + 2 × 4 + 0 × 1 + 1 × 2 = 2。
以上都是輸出都只有⼀個通道。我們在“多輸⼊通道和多輸出通道”⼀節中介紹了如何在⼆維卷積層中指定多個輸出通道。類似地,我們也可以在⼀維卷積層指定多個輸出通道,從而拓展卷積層中的模型參數。
3. 2 時序最⼤池化層
類似地,我們有⼀維池化層。textCNN中使⽤的時序最⼤池化(max-over-time pooling)層實際上對應⼀維全局最⼤池化層:假設輸⼊包含多個通道,各通道由不同時間步上的數值組成,各通道的輸出即該通道所有時間步中最⼤的數值。因此,時序最⼤池化層的輸⼊在各個通道上的時間步數可以不同。為提升計算性能,我們常常將不同⻓度的時序樣本組成⼀個小批量,並通過在較短序列后附加特殊字符(如0)令批量中各時序樣本⻓度相同。這些⼈為添加的特殊字符當然是⽆意義的。由於時序最⼤池化的主要⽬的是抓取時序中最重要的特征,它通常能使模型不受⼈為添加字符的影響。
3.3 textCNN模型
textCNN模型主要使⽤了⼀維卷積層和時序最⼤池化層。假設輸⼊的⽂本序列由n個詞組成,每個詞⽤d維的詞向量表⽰。那么輸⼊樣本的寬為n,⾼為1,輸⼊通道數為d。textCNN的計算主要分為以下⼏步:
- 定義多個⼀維卷積核,並使⽤這些卷積核對輸⼊分別做卷積計算。寬度不同的卷積核可能會捕捉到不同個數的相鄰詞的相關性。
- 對輸出的所有通道分別做時序最⼤池化,再將這些通道的池化輸出值連結為向量。
- 通過全連接層將連結后的向量變換為有關各類別的輸出。這⼀步可以使⽤丟棄層應對過擬合。
下圖⽤⼀個例⼦解釋了textCNN的設計。這⾥的輸⼊是⼀個有11個詞的句⼦,每個詞⽤6維詞向量表⽰。因此輸⼊序列的寬為11,輸⼊通道數為6。給定2個⼀維卷積核,核寬分別為2和4,輸出通道數分別設為4和5。因此,⼀維卷積計算后,4個輸出通道的寬為 11 - 2 + 1 = 10,而其他5個通道的寬為 11 - 4 + 1 = 8。盡管每個通道的寬不同,我們依然可以對各個通道做時序最⼤池化,並將9個通道的池化輸出連結成⼀個9維向量。最終,使⽤全連接將9維向量變換為2維輸出,即正⾯情感和負⾯情感的預測。
4. 代碼實現
清華新聞分類數據集下載:https://www.lanzous.com/i5t0lsd
5. 參考文獻
作者:@mantchs