萬(wàn)林浩
數(shù)據(jù)準(zhǔn)備
此處使用亞馬遜評(píng)論數(shù)據(jù)集,數(shù)據(jù)集包含3.6M的文本評(píng)論內(nèi)容及其標(biāo)簽,數(shù)據(jù)格式分為Review和Label(取值為L(zhǎng)abel1與Label2)兩部分,即為二分類(lèi)文本。其Github來(lái)源為:https://gist.github.com/kunalj101/ad1d9c58d338e20d09ff26bcc06c4235。
模型理論
模型選取
此處選取Text CNN模型作為深度學(xué)習(xí)模型,傳統(tǒng)的CNN算法通常應(yīng)用于CV領(lǐng)域,尤其是計(jì)算機(jī)視覺(jué)方向的工作。Yoon Kim在2014年 “Convolutional Neural Networks for Sentence Classification” 論文中提出Text CNN(利用卷積神經(jīng)網(wǎng)絡(luò)對(duì)文本進(jìn)行分類(lèi)的算法),進(jìn)而人們?cè)谖谋痉诸?lèi)時(shí)也運(yùn)用了卷積神經(jīng)網(wǎng)絡(luò)這一算法,為了能夠更好的獲得局部相關(guān)性,CNN利用多個(gè)不同的kernel提取數(shù)據(jù)集文本中的關(guān)鍵信息。
與圖像當(dāng)中CNN的網(wǎng)絡(luò)相比,Text CNN 最大的不同便是在輸入數(shù)據(jù)的不同,圖像是二維數(shù)據(jù),圖像的卷積核是從左到右,從上到下進(jìn)行滑動(dòng)來(lái)進(jìn)行特征抽取。
而自然語(yǔ)言是一維數(shù)據(jù), 因此對(duì)詞向量做從左到右滑動(dòng)來(lái)進(jìn)行卷積沒(méi)有意義。(如: “今天”對(duì)應(yīng)的向量[0, 0, 0, 0, 1], 按窗口大小為 1* 2 從左到右滑動(dòng)得到[0,0], [0,0], [0,0], [0, 1]這四個(gè)向量, 對(duì)應(yīng)的都是“今天”這個(gè)詞匯,這種滑動(dòng)沒(méi)有幫助。)
模型原理
如圖1所示,Text CNN的核心思想是抓取文本的局部特征:首先通過(guò)不同尺寸的卷積核來(lái)提取文本的N-gram信息,其次由最大池化層來(lái)篩選每個(gè)卷積操作所提取的最關(guān)鍵信息,經(jīng)過(guò)拼接后在全連接層中進(jìn)行特征組合,最后通過(guò)多分類(lèi)損失函數(shù)來(lái)訓(xùn)練模型。
圖2即為CNN在文本分類(lèi)中的應(yīng)用流程,假設(shè)對(duì)當(dāng)前數(shù)據(jù)集要實(shí)施文本分析,句子中所有單詞都是由N維詞矢量所構(gòu)成的,也就是說(shuō)輸入矩陣大小都是m*n,這里的m是指句子寬度。如果CNN要對(duì)輸入樣本實(shí)施卷積運(yùn)算,針對(duì)文字信息,filter將不再側(cè)向滑移,而僅僅向下移動(dòng),類(lèi)似于n-gram在提取數(shù)字和單詞之間的局部關(guān)聯(lián)時(shí)。圖中共有三個(gè)策略,依次是二,3,4,每種步長(zhǎng)上都有兩種filter。在各種詞窗上使用各種filter,最后獲得了六個(gè)卷積后的詞向量。接著,對(duì)每一矢量執(zhí)行最大化池化操作并拼接所有池化值,以獲取單個(gè)句子的特征后,將此矢量傳送到分類(lèi)器上執(zhí)行分組,從而實(shí)現(xiàn)了整個(gè)過(guò)程。
Text CNN模型的組成部分如下:
(1)輸入:自然語(yǔ)言輸入為一句話(huà),例如:wait for the video and don’t rent it。
(2)數(shù)據(jù)預(yù)處理:首先將一句話(huà)拆分為多個(gè)詞,例如將該句話(huà)分為9個(gè)詞語(yǔ),分別為:wait, for, the, video, and, don’t, rent, it,接著將詞語(yǔ)轉(zhuǎn)換為數(shù)字,代表該詞在詞典中的詞索引。
(3)嵌入層: 通過(guò)word2vec或者GLOV 等embedding方法,把各個(gè)詞成對(duì)反映到某個(gè)低維空間中,實(shí)質(zhì)上就是特征提取器,可以在特定層次中編碼語(yǔ)義層次特性。例如用長(zhǎng)度為6的一維向量來(lái)表示每個(gè)詞語(yǔ)(即詞向量的維度為6),wait可以表示為[1,0,0,0,0,0,0],以此類(lèi)推,這句話(huà)就可以用9*6的二維向量表示。
(4)卷積層:和一般圖像處理的卷積計(jì)算核有所不同的是,所有通過(guò)詞矢量表示的文字都是一維數(shù)據(jù),所以在Text中CNN詞卷積用的就是一維卷積。Text CNN卷積核的長(zhǎng)寬與詞矢量的角度相等,高度可以自行設(shè)置。以將卷積核的大小設(shè)置為[2,3]為例,由于設(shè)置了2個(gè)卷積核,所以將會(huì)得到兩個(gè)向量,得到的向量大小分別為T(mén)1:8*1和T2:7*1,向量大小計(jì)算過(guò)程分別為(9-2-1)=8,(9-3-1)=7,即(詞的長(zhǎng)度-卷積核大小-1)。
(5)池化層:通過(guò)不同高度的卷積核卷積之后,輸出的向量維度不同,采用1-Max-pooling將每個(gè)特征向量池化成一個(gè)值,即抽取每個(gè)特征向量的最大值表示該特征。池化完成后還需要將每個(gè)值拼接起來(lái),得到池化層最終的特征向量,因此該句話(huà)的池化結(jié)果就為2*1。
(6)平坦層和全連接層:與CNN模型一樣,先對(duì)輸出池化層輸出進(jìn)行平坦化,再輸入全連接層。為了防止過(guò)擬合,在輸出層之前加上dropout防止過(guò)擬合,輸出結(jié)果就為預(yù)測(cè)的文本種類(lèi)。
模型建立
Word Embedding 分詞構(gòu)建詞向量
模型的第一層為Embedding層,預(yù)訓(xùn)練的詞嵌入可以利用其他語(yǔ)料庫(kù)得到更多的先驗(yàn)知識(shí),經(jīng)過(guò)模型訓(xùn)練后能夠抓住與當(dāng)前任務(wù)最相關(guān)的文本特征。
Text CNN 首先將 “今天天氣很好,出來(lái)玩”分詞成“今天/天氣/很好/, /出來(lái)/玩”, 通過(guò)Word2vec的embedding 方式將每個(gè)詞成映射成一個(gè)5維(維數(shù)可以自己指定)詞向量, 如 “今天” -> [0,0,0,0,1], “天氣” ->[0,0,0,1,0], “很好” ->[0,0,1,0,0]等等。見(jiàn)圖3。
這樣做的好處主要是將自然語(yǔ)言數(shù)值化,方便后續(xù)的處理。從這里也可以看出不同的映射方式對(duì)最后的結(jié)果是會(huì)產(chǎn)生巨大的影響, 在構(gòu)建完詞向量后,將所有的詞向量拼接起來(lái)構(gòu)成一個(gè)6*5的二維矩陣,作為最初的輸入。
Convolution 卷積
第二層為卷積層,在CV中常見(jiàn)的卷積尺寸通常是正方形,而本文的卷積形式與之不同,本文的卷積寬度等于文本Embedding后的維度,保持不變,因?yàn)槊總€(gè)詞或字相當(dāng)于一個(gè)最小的單元,不可進(jìn)一步分割。而卷積核的高度可以自定義,在向下滑動(dòng)的過(guò)程中,通過(guò)定義不同的窗口來(lái)提取不同的特征向量。見(jiàn)圖4。
feature_map 也就是經(jīng)過(guò)卷積后的數(shù)據(jù),利用卷積方法可以把輸入的6*5矩陣映射為一個(gè)3*1的矩陣,由于這種映射過(guò)程與特征提取的結(jié)果很類(lèi)似,因此人們便把最后的輸出稱(chēng)作feature map。一般來(lái)說(shuō)在卷積之后會(huì)跟一個(gè)激活函數(shù),在這里為了簡(jiǎn)化說(shuō)明需要,我們將激活函數(shù)設(shè)置為f(x) = x
Channel 卷積核
在CNN 中常常會(huì)提到一個(gè)詞channel, 圖5 中Channel1與Channel2便構(gòu)成了兩個(gè)Channel,統(tǒng)稱(chēng)為卷積核, 從圖中可觀察到,Channel 不必嚴(yán)格一致, 每個(gè)4*5 矩陣與輸入矩陣做一次卷積操作得到一個(gè)feature map。
Max-pooling 池化層
最大特性池化層,即是在從各個(gè)滑動(dòng)窗口所生成的特性矢量中過(guò)濾出一些較大的特性,而后再把它們特性拼接在一起形成矢量表達(dá)式。我們也能夠使用K-Max池化(選出各個(gè)特性矢量中較大的K個(gè)特點(diǎn)),或者說(shuō)平均值池化(將特性矢量中的每一維取平均數(shù))等,所達(dá)成的成效一般都是把不同長(zhǎng)度的語(yǔ)句,經(jīng)過(guò)池化就能得出某個(gè)定長(zhǎng)的特性矢量代表。在短文本劃分場(chǎng)景中,每一條文本里都會(huì)有若干對(duì)類(lèi)型來(lái)說(shuō)無(wú)用的信息,而最大平均值池化方法就能夠突出最主要的關(guān)鍵詞,以幫助模型更容易找出相應(yīng)的文章類(lèi)目。見(jiàn)圖6。
Softmax k分類(lèi)
Pooling的結(jié)果拼接出來(lái),再輸入到Softmax中,可以得出不同類(lèi)型的概率。在練習(xí)流程中,此時(shí)會(huì)通過(guò)預(yù)計(jì)label與實(shí)際label來(lái)估算損失函數(shù), 計(jì)算出softmax 函數(shù),max-pooling 函數(shù), 激活函數(shù)以及卷積核函數(shù)當(dāng)中參數(shù)需要更新的梯度, 并依次更新函數(shù)中的參數(shù),完成一輪訓(xùn)練。若是預(yù)測(cè)的過(guò)程,Text CNN的流程在此結(jié)束。見(jiàn)圖7。
模型驗(yàn)證及評(píng)估
模型驗(yàn)證
(1)數(shù)據(jù)預(yù)處理
首先讀取數(shù)據(jù),通過(guò)觀察數(shù)據(jù)集label標(biāo)簽(其取值為label1與label2),將其替換為0-1分類(lèi)變量,其結(jié)果如圖8所示。
(2)訓(xùn)練集、測(cè)試集劃分
首先通過(guò)分詞函數(shù)將句子劃分為向量,之后通過(guò)Tokenizer函數(shù)將單個(gè)詞轉(zhuǎn)化為正整數(shù)。此時(shí)單個(gè)句子便變?yōu)榱擞蓴?shù)字組成的向量。最后,再將進(jìn)行預(yù)處理后的數(shù)據(jù)結(jié)果集中進(jìn)行劃分為練習(xí)集與試驗(yàn)集,其比例約為7:3。其訓(xùn)練集數(shù)據(jù)格式如圖9所示。
(3)模型訓(xùn)練及驗(yàn)證
將數(shù)據(jù)預(yù)處理后,即開(kāi)始構(gòu)建Text CNN模型的各個(gè)組成部分,將label進(jìn)行熱編碼處理以便于計(jì)算,為獲得較好的訓(xùn)練結(jié)果,將epochs參數(shù)設(shè)定為15,進(jìn)行多次訓(xùn)練。其訓(xùn)練輸出結(jié)果如圖10所示。
此處選取Loss損失函數(shù)及預(yù)測(cè)準(zhǔn)確率Accuracy對(duì)模型進(jìn)行評(píng)估,通過(guò)建模、訓(xùn)練以及最后在測(cè)試集上進(jìn)行驗(yàn)證,得到如表1的Loss以及Accuracy。
模型評(píng)估
模型優(yōu)點(diǎn)
(1)Text CNN模型的網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)單,在CNN模型網(wǎng)絡(luò)結(jié)構(gòu)的基礎(chǔ)上進(jìn)行改進(jìn)后,依舊具有較為簡(jiǎn)單的結(jié)構(gòu),相比于CNN并沒(méi)有明顯的復(fù)雜度提升。
(2)由于網(wǎng)絡(luò)結(jié)構(gòu)簡(jiǎn)化使得參數(shù)種類(lèi)較小,運(yùn)算量小,訓(xùn)練速率較快,并且有較強(qiáng)的可推廣性。
模型缺點(diǎn)
由于模式可理解型不強(qiáng),在調(diào)優(yōu)建模過(guò)程的同時(shí),很難按照訓(xùn)練的效果去有效的調(diào)節(jié)其中的特性,同時(shí)由于在TextCNN中缺乏對(duì)特性重要程度的定義,從而很難去評(píng)價(jià)各種特性的意義并加以比較。
總結(jié)
本文通過(guò)建立Text CNN模型,對(duì)亞馬遜評(píng)論數(shù)據(jù)集進(jìn)行了分類(lèi)實(shí)戰(zhàn)。在實(shí)際操作中,首先通過(guò)數(shù)據(jù)預(yù)處理對(duì)數(shù)據(jù)集進(jìn)行了清洗以及分詞劃分,之后通過(guò)Keras構(gòu)建了Text CNN模型的各個(gè)部分,如Embedding、Convolution、Max Polling、以及Softmax。最后進(jìn)行調(diào)參以及模型驗(yàn)證評(píng)估,得到了評(píng)估準(zhǔn)確率較高的模型以及參數(shù)設(shè)定組合,通過(guò)Loss與Accuracy指標(biāo)的評(píng)估,本文建立的Text CNN模型具有較好的性能。