textRNN & textCNN的網路結構與程式碼實現!

mantch發表於2019-08-27

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的計算主要分為以下⼏步:

  1. 定義多個⼀維卷積核,並使⽤這些卷積核對輸⼊分別做卷積計算。寬度不同的卷積核可能會捕捉到不同個數的相鄰詞的相關性。
  2. 對輸出的所有通道分別做時序最⼤池化,再將這些通道的池化輸出值連結為向量。
  3. 通過全連線層將連結後的向量變換為有關各類別的輸出。這⼀步可以使⽤丟棄層應對過擬合。

下圖⽤⼀個例⼦解釋了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

機器學習通俗易懂系列文章

3.png

5. 參考文獻


作者: @mantchs

GitHub: https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此專案!群號:【541954936】 NLP面試學習群

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69942346/viewspace-2655037/,如需轉載,請註明出處,否則將追究法律責任。

相關文章