HFT-CNN:层级多标签分类,让你的模型多学习几次
本文同步發布知乎:HFT-CNN:層級多標簽分類,讓你的模型多學習幾次知乎主頁lynne阿黎請大家不吝關注~
背景
長文本由于自身的特點和信息量,一段文本會描述一個特定的主題。短文本由于其自身長度的原因是缺少這種特征的。一般對于短文本的處理會借鑒上下文的語料或者同義詞來擴充短文本的含義。但是由于文本的領域相關性,上下文的語料和同義詞的分布未必和原始語料一致。由于以上原因短文本分類一直受到人們的關注。
在深度學習領域,對于短文本分類CNN是一種常見的方法,但是這種方法通常需要大規模的語料。文中認為短文本的多標簽分類任務所面臨的的問題主要是由多標簽帶來的數據稀疏的問題。在多標簽分類中,我們會遇到標簽是平行和具有層級結構的情況,例如我們看新聞的時候有生活類,科技類,娛樂類,而娛樂類又會分為電影頻道,電視劇頻道等等。對于標簽有層級關系的問題,文中提出了Hierarchical CNN結構。
模型結構
1. CNN結構
文中文本分類的CNN模型類似于Text-CNN,輸入是短文本sentence,sentence由詞向量拼接而成,文中使用的是fasttext,接著使用卷積核為w的卷積層提取sentence的特征,然后添加max-pooling層,將這些池化層的的結果拼接然后經過全連接層和dropout得到上層標簽[A,B,...]的概率,loss采用交叉熵。這是一個非常經典的CNN結構。
2. Hierarchical結構
對于下層標簽的預測文中的思路是在上層標簽的預測中模型已經學到了通用的特征,但是深層layer應該去學習原始數據集中比較詳細的信息。因此文中對embedding和卷積層參數保持不變,在這個基礎上進行微調學習,這一步標簽也由[A,B]變為[A1,A2,B1,B2]。
對于最終文本分類的結果判斷文章采用了兩種得分方式:
-
BSF(Boolean Scoring Function)
-
MSF(Multiplicative Scoring Function)
兩種方法都是設置一個閾值,文本在某個分類的得分超過閾值則認為是該分類的。區別是BSF只有在文本被分到一級分類的情況下才會認為分類的二級分類是正確的,MSF沒有這項限制。
其實說到這里大家應該明白了文章的基本思路,就我個人來說感覺是比較原始但又水到渠成。因此這里的代碼感覺也沒有什么好講的,就是Finetune的思路,在原始模型上加了一層全連接層。需要注意的是作者使用的是chainer實現的,相比于torch和tensorflow比較小眾。
# Network definition for HFT model# =========================================================if self.mode == "fine-tuning":parameters = np.load('./CNN/PARAMS/parameters_for_multi_label_model_' + self.load_param_node_name + '.npz')super(CNN, self).__init__()set_seed_random(0)with self.init_scope():self.lookup = L.EmbedID(in_size = parameters['lookup/W'].shape[0], out_size = parameters['lookup/W'].shape[1], initialW = parameters['lookup/W'], ignore_label = -1)self.conv1 = L.Convolution2D(self.in_channels,self.out_channels,(2, self.row_dim),stride=1,initialW=parameters['conv1/W'],initial_bias=parameters['conv1/b']) self.conv2 = L.Convolution2D(self.in_channels,self.out_channels,(3, self.row_dim),stride=1,initialW=parameters['conv2/W'],initial_bias=parameters['conv2/b'])self.conv3 = L.Convolution2D(self.in_channels,self.out_channels,(4, self.row_dim),stride=1,initialW=parameters['conv3/W'],initial_bias=parameters['conv3/b'])self.l1=L.Linear(in_size = None, out_size = self.hidden_dim, initialW=self.initializer)self.l2=L.Linear(in_size = self.hidden_dim, out_size = self.n_classes, initialW=self.initializer)實驗效果
文中數據集采用RCV1和Amazon 670K,相關鏈接可以見相關資料部分。數據集的基本情況如下,L表示數據集標簽的層級深度,TrTe表示訓練數據和測試數據,C表示標簽整體的量。分類的效果采用F1值進行衡量,此外還采用了P@k和NDCG@k標準。
基礎效果
文中將HFT-CNN和沒有經過微調的CNN模型(WoFT-CNN)和沒有經過層級結構標簽處理的模型(Flat Model)進行對比,實驗效果如下,其中B表示BSF,M表示MSF。
我們看到表格中有Micro和Macro這是什么意思呢?這是F1值得兩種計算方式,對于單個分類來說在多分類的情況下計算F1值有兩種方式,Micro和Macro。
-
Micro是不管類別,直接計算
-
Macro是將各個類別的F1計算之后然后進行平均
可以看出在效果上RCV1和Amazon 670K,HFT-CNN的效果都是優于其他模型的,但是在使用MSF得分和Micro F1值時WoFT的效果和HFT相同,但是在Macro F1的得分缺遜于HFT-CNN。這個我們猜測是因為WoFT整體效果比較好,但是在某一類上的分類效果差于HFT-CNN所以導致Macro F1值比較低,這也證明了HFT-CNN的初衷:對標簽分類,模型先學習比較通用的知識,然后進行細分。
STOA效果比較
STOA效果文中主要對比了XML-CNN,實驗效果如下,可以看到在兩個數據集上,HFT-CNN的效果超越了目前的STOA的效果。
-
層級分類效果
文中統計了多個層級的文本分類效果,可以看出標簽層級越深,分類效果越差,但是HFT-CNN的效果依然優于XML。
-
多標簽數量
文中對于每個短文本的有多個分類的情況下對分類的數量的準確率進行了統計,可以看到分類越多識別的準確率越低。
-
訓練數據規模
文中也討論了訓練數據的規模對實驗結果的影響,可以看到訓練數據越多實驗效果越好。但是需要注意的是隨著訓練數據規模的降低,HFT-CNN的效果下降的較XML比較平緩。這表示經過多輪學習,HFT-CNN學到的語料內容更多一點。
個人思考
相比于Bert和其他文章,這篇文章的模型結構是比較簡單而且原始的,思路也感覺是Bert玩剩下的。預訓練+Finetune已經是非常流行的手段了,所以我個人對這篇文章的定位應該是術而不是道。文中對于標簽層級結構的理解是非常具有啟發性的,如果大家要用Bert的話也可以據此設計一些相關的預訓練任務,比如讓模型去學習二級標簽或二級標簽是否正確等,這樣模型可以有針對性的學習。
但是文中的思想同樣存在一個問題就是標簽層級的劃分,以及不同標簽的不相關性。如果標簽層級本身就劃分不清楚,或標簽自身有重疊,那么這樣模型可能依舊無法準確的對文本進行判斷。同時文章中提到了數據稀疏的問題,隨著層級結構的劃分,低級標簽的訓練文本應該比較少,那么模型是否可以如我們所想學到預期的知識這也是值得探索的。那么這時候或許我們就應該使用一些方法進行數據增強了。
相關資料
總結
以上是生活随笔為你收集整理的HFT-CNN:层级多标签分类,让你的模型多学习几次的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webpack --- 发布环境的配置
- 下一篇: H5 使用微信开放标签跳转小程序