textRNN & textCNN的網絡結構與代碼實現!

1. 什麼是textRNN

textRNN指的是利用RNN循環神經網絡解決文本分類問題,文本分類是天然語言處理的一個基本任務,試圖推斷出給定文本(句子、文檔等)的標籤或標籤集合。git

文本分類的應用很是普遍,如:github

  • 垃圾郵件分類: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. 代碼實現

清華新聞分類數據集下載:www.lanzous.com/i5t0lsd

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

3.png

5. 參考文獻


做者:@mantchs

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

歡迎你們加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

相關文章
相關標籤/搜索