TextRNN指的是利用RNN循環神經網絡解決文本分類問題,文本分類是自然語言處理的一個基本任務,試圖推斷出給定文本(句子、文檔等)的标簽或标簽集合。
文本分類的應用非常廣泛,如:
- 垃圾郵件分類:2分類問題,判斷郵件是否為垃圾郵件
- 情感分析:2分類問題:判斷文本情感是積極還是消極;多分類問題:判斷文本情感屬于{非常消極,消極,中立,積極,非常積極}中的哪一類。
- 新聞主題分類:判斷一段新聞屬于哪個類别,如财經、體育、娛樂等。根據類别标簽的數量,可以是2分類也可以是多分類。
- 自動問答系統中的問句分類
- 社群問答系統中的問題分類:多标簽多分類(對一段文本進行多分類,該文本可能有多個标簽),如知乎看山杯
- 讓AI做法官:基于案件事實描述文本的罰金等級分類(多分類)和法條分類(多标簽多分類)
- 判斷新聞是否為機器人所寫:2分類
一、TextRNN的原理
在一些自然語言處理任務中,當對序列進行處理時,我們一般會采用循環神經網絡RNN,尤其是它的一些變種,如LSTM(更常用),GRU。當然我們也可以把RNN運用到文本分類任務中。
這裡的文本可以一個句子,文檔(短文本,若幹句子)或篇章(長文本),是以每段文本的長度都不盡相同。在對文本進行分類時,我們一般會指定一個固定的輸入序列/文本長度:該長度可以是最長文本/序列的長度,此時其他所有文本/序列都要進行填充以達到該長度;該長度也可以是訓練集中所有文本/序列長度的均值,此時對于過長的文本/序列需要進行截斷,過短的文本則進行填充。總之,要使得訓練集中所有的文本/序列長度相同,該長度除之前提到的設定外,也可以是其他任意合理的數值。在測試時,也需要對測試集中的文本/序列做同樣的處理。
假設訓練集中所有文本/序列的長度統一為n,我們需要對文本進行分詞,并使用詞嵌入得到每個詞固定次元的向量表示。對于每一個輸入文本/序列,我們可以在RNN的每一個時間步長上輸入文本中一個單詞的向量表示,計算目前時間步長上的隐藏狀态,然後用于目前時間步驟的輸出以及傳遞給下一個時間步長并和下一個單詞的詞向量一起作為RNN單元輸入,然後再計算下一個時間步長上RNN的隐藏狀态,以此重複…直到處理完輸入文本中的每一個單詞,由于輸入文本的長度為n,是以要經曆n個時間步長。
二、TextRNN網絡結構
1、Structure 1
流程:embedding—>BiLSTM—>concat final output/average all output----->softmax layer
結構圖如下圖所示:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIyVGduV2YfNWawNiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwIzXlpXazxyTPllNxNVY1gXbMVTdHRDNGNUS24ULiVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL4ATY1ITOjZWZxUWZwYTYihTYwQTO4cTM5QGZmJmYxkzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
一般取前向/反向LSTM在最後一個時間步長上隐藏狀态,然後進行拼接,在經過一個softmax層(輸出層使用softmax激活函數)進行一個多分類;或者取前向/反向LSTM在每一個時間步長上的隐藏狀态,對每一個時間步長上的兩個隐藏狀态進行拼接,然後對所有時間步長上拼接後的隐藏狀态取均值,再經過一個softmax層(輸出層使用softmax激活函數)進行一個多分類(2分類的話使用sigmoid激活函數)。
上述結構也可以添加dropout/L2正則化或BatchNormalization 來防止過拟合以及加速模型訓練。
2、Structure 2
流程:embedding–>BiLSTM---->(dropout)–>concat ouput—>UniLSTM—>(droput)–>softmax layer
結構圖如下圖所示:
與之前結構不同的是,在雙向LSTM(上圖不太準确,底層應該是一個雙向LSTM)的基礎上又堆疊了一個單向的LSTM。把雙向LSTM在每一個時間步長上的兩個隐藏狀态進行拼接,作為上層單向LSTM每一個時間步長上的一個輸入,最後取上層單向LSTM最後一個時間步長上的隐藏狀态,再經過一個softmax層(輸出層使用softamx激活函數,2分類的話則使用sigmoid)進行一個多分類。
三、TextRNN v.s. TextCNN
TextRNN的結構非常靈活,可以任意改變。比如把LSTM單元替換為GRU單元,把雙向改為單向,添加dropout或BatchNormalization以及再多堆疊一層等等。TextRNN在文本分類任務上的效果非常好,與TextCNN不相上下,但RNN的訓練速度相對偏慢,一般2層就已經足夠多了。
盡管TextCNN能夠在很多任務裡面能有不錯的表現,但CNN有個最大問題是固定filter的視野,一方面無法模組化更長的序列資訊,另一方面filter的超參調節也很繁瑣。CNN本質是做文本的特征表達工作,而自然語言進行中更常用的是RNN,能夠更好的表達上下文資訊,尤其是RNN的一些變種,如LSTM(更常用),GRU。
文本分類任務中,CNN可以用來提取句子中類似N-gram的關鍵資訊,适合短句子文本。TextRNN擅長捕獲更長的序列資訊。具體到文本分類任務中,常用的Bi-directional RNN(實際使用的是雙向LSTM)從某種意義上可以了解為可以捕獲變長且雙向的的N-gram資訊。
RNN模型在運作速度上絲毫不占優勢,後一個時間步的輸出依賴于前一個時間步的輸出,無法進行并行處理,導緻模型訓練的速度慢,比CNN模型要慢幾倍到十幾倍,這是一個緻命的弱點。而RNN模型引以為傲的能夠捕獲序列中的長距離依賴關系,隻需要通過建構更深層的卷積層也可實作。如下圖所示,更深層的卷積層可以捕獲更長的序列資訊。
參考資料:
textRNN 與 textCNN詳解
textRNN & textCNN的網絡結構與代碼實作!
總結textRNN