使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)

前言:在上一篇文章中,已經介紹了Keras對文本數據進行預處理的一般步驟。預處理完之後,就可以使用深度學習中的一些模型進行文本分類。在這篇文章中,將介紹

text-CNN模型以及使用該模型對imdb影評數據集進行情感分析

正如上篇文章所說,文本分類的關鍵在於準確提煉文檔或者句子的中心思想,而提煉中心思想的方法是抽取文檔或句子的關鍵詞作為特徵,基於這些特徵去訓練分類器並分類。每個類別可以理解為一種中心思想,如情感分析中,分類器將樣本分為兩類,一類為正面評論,另一類為負面評論,而正面和負面評論正是該文本或句子的中心思想。對於思維敏銳的讀者來說,當說到提取特徵的時候,可能就能想到為什麼卷積神經網絡可以很好進行自然語言處理。沒錯,就是因為卷積和池化過程就是一個抽取特徵的過程,當我們可以準確抽取關鍵詞的特徵時,就能準確的提煉出文檔或句子的中心思想。

卷積神經網絡首次應用於文本分類可以說是在2004年Yoon Kim 在 “Convolutional Neural Networks for Sentence Classification” 一文中提出(雖然第一個用的並不是他,但是在這篇文章中提出了4種Model Variations,並有詳細的調參),本文也是基於對這篇文章的理解。接下來將介紹text-CNN模型,並使用Keras搭建該模型對imdb數據集進行情感分析。

text-CNN 模型

由於上篇文章已經將Embedding層講過了,在這裡就不再敘述。主要講解卷積層、池化層和全連接層。

1 卷積層

在處理圖像數據時,CNN使用的卷積核的寬度和高度的一樣的,但是在text-CNN中,卷積核的寬度是與詞向量的維度一致!!!這是因為我們輸入的每一行向量代表一個詞,在抽取特徵的過程中,詞做為文本的最小粒度,如果我們使用卷積核的寬度小於詞向量的維度就已經不是以詞作為最小粒度了。而高度和CNN一樣,可以自行設置(通常取值2,3,4,5)。由於我們的輸入是一個句子,句子中相鄰的詞之間關聯性很高,因此,當我們用卷積核進行卷積時,不僅考慮了詞義而且考慮了詞序及其上下文。(類似於skip-gram和CBOW模型的思想)。

詳細講解卷積的過程:卷積層輸入的是一個表示句子的矩陣,維度為n*d,即每句話共有n個詞,每個詞有一個d維的詞向量表示。假設X

i:i+j表示Xi到Xi+j個詞,使用一個寬度為d,高度為h的卷積核W與Xi:i+h-1(h個詞)進行卷積操作後再使用激活函數激活得到相應的特徵ci,則卷積操作可以表示為:(使用點乘來表示卷積操作)

使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)

因此經過卷積操作之後,可以得到一個n-h+1維的向量c形如:

使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)

以上是一個卷積核與輸入句子的卷積操作,同樣的,我們也可以使用更多高度不同的卷積核,且每個高度的卷積核多個,得到更多不同特徵

2 池化層

因為在卷積層過程中我們使用了不同高度的卷積核,使得我們通過卷積層後得到的向量維度會不一致,所以在池化層中,我們使用1-Max-pooling對每個特徵向量池化成一個值,即抽取每個特徵向量的最大值表示該特徵,而且認為這個最大值表示的是最重要的特徵。當我們對所有特徵向量進行1-Max-Pooling之後,還需要將每個值給拼接起來。得到池化層最終的特徵向量。在池化層到全連接層之前可以加上dropout防止過擬合。

3 全連接層

全連接層跟其他模型一樣,假設有兩層全連接層,第一層可以加上’relu’作為激活函數,第二層則使用softmax激活函數得到屬於每個類的概率。如果處理的數據集為二分類問題,如情感分析的正負面時,第二層也可以使用sigmoid作為激活函數,然後損失函數使用對數損失函數’binary_crossentropy’。

4 text-CNN的小變種

在詞向量構造方面可以有以下不同的方式:

CNN-rand: 隨機初始化每個單詞的詞向量通過後續的訓練去調整。

CNN-static: 使用預先訓練好的詞向量,如word2vec訓練出來的詞向量,在訓練過程中不再調整該詞向量。

CNN-non-static: 使用預先訓練好的詞向量,並在訓練過程進一步進行調整。

CNN-multichannel: 將static與non-static作為兩通道的詞向量。

使用網上的一張經典圖進一步講解text-CNN


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)


在上圖中,輸入了一句話”I like this movie very much!”,其對應的句子矩陣維度為7*5,每個詞用維度為5的詞向量表示。在卷積層中,分別使用高度為4,3,2的卷積核,且每種卷積核有2個。卷積之後得到6個對應的特徵向量,維度從上往下分別為4,4,5,5,6,6,然後對每個向量進行1-Max-pooling,再拼接起來一個維度為6的特徵向量。最後通過全連接層,激活函數為softmax得到2個類別的概率。

使用text-CNN模型對imdb數據集進行情感分析

從上文對text-cnn模型的介紹,想必讀者對該模型已經有了初步的理解了。趁熱打鐵,我們將利用Keras搭建該模型並對imdb數據集進行情感分析。由於數據集預處理部分上一篇文章已經講解,在此將不再敘述。在搭建模型之前,先講解用到的一些主要函數:

卷積過程由於只是沿著高度方向進行卷積,即只在一個維度卷積所以使用Conv1d(filters, kernel_size, activation):

filters

: 卷積核的個數

kernel_size: 卷積核的寬度

activation: 卷積層使用的激活函數

池化過程使用的在一個維度上的池化,使用MaxPooling1D(pool_size):

pool_size: 池化窗口的大小,由於我們要將一個卷積核得到特徵向量池化為1個值,所以池化窗口可以設為(句子長度-卷積核寬度+1)

池化過程最後還需要對每個值拼接起來,可以使用concatenate(inputs, axis)函數實現:

inputs: inputs為一個tensor的list,所以需要將得到1-MaxPooling得到每個值append到list中,並把該list作為inputs參數的輸入。

axis: 指定拼接的方向。


瞭解了這幾個函數的用法之後,我們就可以搭建我們的模型如下圖。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)


基於上篇文章對imdb數據集中影評處理後,得到每個句子長度(maxlen)為150,共有2000個詞(max_features),詞向量維度為32(embed_size)。在該模型中,使用了高度分別為2,3,4,5的四種卷積核,每種卷積核100個,最後使用sigmoid作為激活函數,損失函數使用對數損失函數


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)


模型訓練過程batch_size設為64,epochs為10,最終可以在驗證集可以得到86.5%的準確率。


使用Keras進行深度學習:(三)使用text-CNN處理自然語言(下)


至此我們已經實現了使用text-CNN模型對imdb數據集進行情感分析,準確率還算可以,有興趣的讀者可以基於該模型進行改進,得到更高的準確率。

文末福利:完整代碼可到以下鏈接下載:https://github.com/hongweijun811/wjgit/blob/master/text_cnn_demo.py


對深度學習感興趣,熱愛Tensorflow的小夥伴,歡迎關注我們的網站http://www.panchuang.net 我們的公眾號:磐創AI。


分享到:


相關文章: