【原創】文本分類算法TextCNN原理詳解(一)

  最近一直在研究textCNN算法,準備寫一個系列,每週更新一篇,大體包括如下內容:html

  • TextCNN基本原理和優劣勢
  • TextCNN代碼詳解(附Github連接)
  • TextCNN模型實踐迭代經驗總結
  • TextCNN模型部署Tf-Serving實踐總結

  今天主要講TextCNN的基本原理和優劣勢,包括網絡結構、如何更新參數以及應用場景等。算法

 

一. TextCNN 是什麼網絡

  咱們以前提早CNN時,一般會認爲是屬於CV領域,用於計算機視覺方向的工做,可是在2014年,Yoon Kim針對CNN的輸入層作了一些變形,提出了文本分類模型textCNN。與傳統圖像的CNN網絡相比, textCNN 在網絡結構上沒有任何變化(甚至更加簡單了), 從圖一能夠看出textCNN 其實只有一層卷積,一層max-pooling, 最後將輸出外接softmax 來n分類。架構

 

圖一 textCNN 架構函數

  與圖像當中CNN的網絡相比,textCNN 最大的不一樣即是在輸入數據的不一樣:學習

  1. 圖像是二維數據, 圖像的卷積核是從左到右, 從上到下進行滑動來進行特徵抽取。 spa

  2. 天然語言是一維數據, 雖然通過word-embedding 生成了二維向量,可是對詞向量作從左到右滑動來進行卷積沒有意義. 好比 "今天" 對應的向量[0, 0, 0, 0, 1], 按窗口大小爲 1* 2 從左到右滑動獲得[0,0], [0,0], [0,0], [0, 1]這四個向量, 對應的都是"今天"這個詞彙, 這種滑動沒有幫助.設計

  TextCNN的成功, 不是網絡結構的成功, 而是經過引入已經訓練好的詞向量來在多個數據集上達到了超越benchmark 的表現,進一步證實了構造更好的embedding, 是提高nlp 各項任務的關鍵能力。3d

 


 

二. TextCNN 的優點htm

  1. TextCNN最大優點網絡結構簡單 ,在模型網絡結構如此簡單的狀況下,經過引入已經訓練好的詞向量依舊有很不錯的效果,在多項數據數據集上超越benchmark。 

  2. 網絡結構簡單致使參數數目少, 計算量少, 訓練速度快,在單機單卡的v100機器上,訓練165萬數據, 迭代26萬步,半個小時左右能夠收斂。

  


 

三.textCNN 的流程

1.Word Embedding 分詞構建詞向量

  如圖二所示, textCNN 首先將 "今每天氣很好,出來玩" 分詞成"今天/天氣/很好/,/出來/玩, 經過word2vec或者GLOV 等embedding 方式將每一個詞成映射成一個5維(維數能夠本身指定)詞向量, 如 "今天" -> [0,0,0,0,1], "天氣" ->[0,0,0,1,0], "很好" ->[0,0,1,0,0]等等。

 

圖二 Word Embedding

 

  這樣作的好處主要是將天然語言數值化,方便後續的處理。從這裏也能夠看出不一樣的映射方式對最後的結果是會產生巨大的影響, nlp 當中目前最火熱的研究方向即是如何將天然語言映射成更好的詞向量。咱們構建完詞向量後,將全部的詞向量拼接起來構成一個6*5的二維矩陣,做爲最初的輸入

 

2. Convolution 卷積

圖三 卷積示意圖

卷積是一種數學算子。咱們用一個簡單的例子來講明一下

step.1 將 "今天"/"天氣"/"很好"/"," 對應的4*5 矩陣 與卷積核作一個point wise 的乘法而後求和, 即是卷積操做:

feature_map[0] =0*1 + 0*0 + 0*1 + 0*0 + 1*0  +   //(第一行)

                        0*0 + 0*0 + 0*0 + 1*0 + 0*0 +   //(第二行)

                        0*1 + 0*0 + 1*1  + 0*0 + 0*0 +   //(第三行)

                        0*1 + 1*0  + 0*1 + 0*0 + 0*0      //(第四行)

                       = 1

 

step.2 將窗口向下滑動一格(滑動的距離能夠本身設置),"天氣"/"很好"/","/"出來" 對應的4*5 矩陣 與卷積核(權值不變) 繼續作point wise 乘法後求和

feature_map[1]  = 0*1 + 0*0 + 0*1 + 1*0  +  0*0  +   //(第一行)

                          0*0 + 0*0 + 1*0 + 0*0 +  0*0 +   //(第二行)

                          0*1 + 1*0 +  0*1 + 0*0 +  0*0 +   //(第三行)

                          1*1 + 0*0  + 0*1 + 0*0 +  0*0       //(第四行)

                          = 1

 

step.3 將窗口向下滑動一格(滑動的距離能夠本身設置) "很好"/","/"出來"/"玩" 對應的4*5 矩陣 與卷積核(權值不變) 繼續作point wise 乘法後求和

feature_map[2] = 0*1 + 0*0 + 1*1  + 1*0 + 0*0  +   //(第一行)

                         0*0 + 1*0 + 0*0 + 0*0 + 0*0 +   //(第二行)

                         1*1 + 0*0 +  0*1 + 0*0 + 0*0 +   //(第三行)

                         0*1 + 0*0  + 0*1 + 1*0 + 1*0       //(第四行)

                         = 2

 

  feature_map 即是卷積以後的輸出, 經過卷積操做 將輸入的6*5 矩陣映射成一個 3*1 的矩陣,這個映射過程和特徵抽取的結果很像,因而便將最後的輸出稱做feature map。通常來講在卷積以後會跟一個激活函數,在這裏爲了簡化說明須要,咱們將激活函數設置爲f(x) = x

 

3. 關於channel 的說明

 

 

 

 

圖四 channel 說明

  在CNN 中經常會提到一個詞channel, 圖三 中 深紅矩陣與 淺紅矩陣 便構成了兩個channel 統稱一個卷積核, 從這個圖中也能夠看出每一個channel 沒必要嚴格同樣, 每一個4*5 矩陣與輸入矩陣作一次卷積操做獲得一個feature map. 在計算機視覺中,因爲彩色圖像存在 R, G, B 三種顏色, 每一個顏色便表明一種channel。

  根據原論文做者的描述, 一開始引入channel 是但願防止過擬合(經過保證學習到的vectors 不要偏離輸入太多)來在小數據集合得到比單channel更好的表現,後來發現其實直接使用正則化效果更好。

  不過使用多channel 相比與單channel, 每一個channel 可使用不一樣的word embedding, 好比能夠在no-static(梯度能夠反向傳播) 的channel 來fine tune 詞向量,讓詞向量更加適用於當前的訓練。 

  對於channel在textCNN 是否有用, 從論文的實驗結果來看多channels並無明顯提高模型的分類能力, 七個數據集上的五個數據集 單channel 的textCNN 表現都要優於 多channels的textCNN。

 

圖五 textCNN 實驗

咱們在這裏也介紹一下論文中四個model 的不一樣

  • CNN-rand (單channel), 設計好 embedding_size 這個 Hyperparameter 後, 對不一樣單詞的向量做隨機初始化, 後續BP的時候做調整.

  • CNN-static(單channel), 拿 pre-trained vectors from word2vec, FastText or GloVe 直接用, 訓練過程當中再也不調整詞向量.

  • CNN-non-static(單channel), pre-trained vectors + fine tuning , 即拿word2vec訓練好的詞向量初始化, 訓練過程當中再對它們微調.

  • CNN-multiple channel(多channels), 類比於圖像中的RGB通道, 這裏也能夠用 static 與 non-static 搭兩個通道來作.

 

4.max-pooling

 

圖六: max-pooling 說明

  獲得feamap = [1,1,2] 後, 從中選取一個最大值[2] 做爲輸出, 即是max-pooling。max-pooling 在保持主要特徵的狀況下, 大大下降了參數的數目, 從圖五中能夠看出 feature map 從 三維變成了一維, 好處有以下兩點: 

  1. 下降了過擬合的風險, feature map = [1, 1, 2] 或者[1, 0, 2] 最後的輸出都是[2], 代表開始的輸入即便有輕微變形, 也不影響最後的識別。

  2. 參數減小, 進一步加速計算。

  pooling 自己沒法帶來平移不變性(圖片有個字母A, 這個字母A 不管出如今圖片的哪一個位置, 在CNN的網絡中均可以識別出來),卷積核的權值共享才能. 

  max-pooling的原理主要是從多個值中取一個最大值,作不到這一點。cnn 可以作到平移不變性,是由於在滑動卷積核的時候,使用的卷積核權值是保持固定的(權值共享), 假設這個卷積核被訓練的就能識別字母A, 當這個卷積核在整張圖片上滑動的時候,固然能夠把整張圖片的A都識別出來。

 

5.使用softmax k分類

圖六:softmax 示意圖

  如圖六所示, 咱們將 max-pooling的結果拼接起來, 送入到softmax當中, 獲得各個類別好比 label 爲1 的機率以及label 爲-1的機率。若是是預測的話,到這裏整個textCNN的流程遍結束了。

    若是是訓練的話,此時便會根據預測label以及實際label來計算損失函數, 計算出softmax 函數,max-pooling 函數, 激活函數以及卷積核函數 四個函數當中參數須要更新的梯度, 來依次更新這四個函數中的參數,完成一輪訓練 。

 


 

五.textCNN的總結

  本次咱們介紹的textCNN是一個應用了CNN網絡的文本分類模型。

  • textCNN的流程:先將文本分詞作embeeding獲得詞向量, 將詞向量通過一層卷積,一層max-pooling, 最後將輸出外接softmax 來作n分類。 

  • textCNN 的優點:模型簡單, 訓練速度快,效果不錯。

  • textCNN的缺點:模型可解釋型不強,在調優模型的時候,很難根據訓練的結果去針對性的調整具體的特徵,由於在textCNN中沒有相似gbdt模型中特徵重要度(feature importance)的概念, 因此很難去評估每一個特徵的重要度。 

  關於如何調優textCNN的經驗總結,會在第三篇來總結,在下一篇,咱們會來聊聊textCNN的具體的代碼實現。

原文出處:https://www.cnblogs.com/ModifyRong/p/11319301.html

相關文章
相關標籤/搜索