寫在前面:今天開始總結一下文本分類任務中常見的神經網絡模型。
第一站textCNN
文本分類任務
文本分類任務是自然語言處理(NLP)中很重要的子任務,比如文本情感分類,對於一段話,比如評價,判斷是積極的還是消極的。
在此我們用卷積神經網絡來解決這個問題。
卷積神經網絡
卷積神經網絡最初是在14年左右應用到圖像處理領域中的,由於卷積神經網絡具有平移不變性和參數共享特點,有強大的特徵提取能力(表徵學習),在很多圖像識別任務中取得了非常顯著的效果,成爲當時的STOA(最好的方案)。
在圖像識別中,我們往往應用的是二維卷積核,我們想利用卷積神經網絡提取到圖像的空間特徵,而由於圖像有寬高兩個維度,於是我們就是用二維卷積核。又如視頻等輸入,我們往往會用三維卷積來處理。
文本類的信息只有位置上的先後關係,我們就採用一維卷積核來處理
此部分簡單介紹卷積的工作原理,會有專門一章來介紹卷積層。
二維卷積運算
上圖所示,假設輸入是一張圖片方格內的值爲其像素,*代表卷積運算,圖片藍色部分和內容和卷積核相對應的位置相乘,最後求和成爲了第一個輸出(藍色部分)。
然後依次向右向下移動輸入的選中部分,依次與卷積核進行運算得出全部的輸出。
一維卷積運算
一維卷積運算如下圖所示。
一維卷積可以將相鄰的位置關聯起來,這種方式就可以提取上下文特徵。不同大小的卷積核可以提取不同範圍的特徵。
卷積層
在卷積層後緩解位置敏感的問題,我們會用到池化層進行下采樣,池化層的計算方式和卷積類似。常見的池化層有最大池化層和平均池化層。此外,我們往往會在其中加上BatchNorm層以緩解卷積神經網絡訓練參數過多帶來的過擬合問題。
TextCNN 模型實現
卷積塊
我們是用tf2.0 中keras API實現的,我們將卷積+batchnorm+池化做成一個可以複用的塊。
def conv1D_with_bn_gp(self,filters,kernel_size):
blk = K.models.Sequential()
blk.add(L.Conv1D(filters=filters,kernel_size=kernel_size))
blk.add(L.BatchNormalization())
blk.add(L.Activation("relu"))
blk.add(L.GlobalMaxPool1D())
return blk
模型結構
我們使用了三個不同大小的卷積核,與經過詞嵌入(將單詞映射爲向量)的詞向量進行卷積運算,把最後的結果拼接起來,送入全連接網絡進行分類。
def design_model_with_multi_kernel_size(self,hiden_size=64):
input_layer=L.Input(shape=(None,),name='feature_input')
x=L.Embedding(input_dim=self.emb.wordCount,output_dim=self.emb.wordDim,input_length=self.emb.sequenceLength)(input_layer)
x_5=self.conv1D_with_bn_gp(filters=100,kernel_size=5)(x)
x_4=self.conv1D_with_bn_gp(filters=100,kernel_size=4)(x)
x_3=self.conv1D_with_bn_gp(filters=100,kernel_size=3)(x)
x=L.concatenate([x_3,x_4,x_5])
x=L.Dense(hiden_size,activation='relu',name="feature_output")(x)
x=L.Dropout(0.5)(x)
output_layer=L.Dense(2,activation='softmax')(x)
model=K.models.Model(inputs=[input_layer],outputs=[output_layer],name=self.name)
self.model=model
model.summary()
return model