深度學習與文字分類總結第二篇--大規模多標籤文字分類
上一篇部落格中我們已經總結了文字分類中常用的深度學習模型,因為知乎的本次競賽是多標籤的文字分類任務,這也是我第一次接觸多標籤分類,所以想單獨寫一篇部落格來記錄這方面的相關知識。
在這裡首先列出幾篇參考的文章:
基於神經網路的多標籤分類可以追溯到周志華在2006年發表的文章: Multi-Label Neural Networks with Applications to Functional Genomics and Text Categorization。其貢獻在於提出了BP-MLL(多標籤反向傳播)以及新的誤差函式:
然後是一篇基於周志華文章改進的論文:Large-scale Multi-label Text Classification Revisiting Neural Networks。這篇文章提出使用Adagrad,dropout等技術,此外還提出使用標準的交叉熵函式作為目標函式效果更好。
上面的文章還是使用普通的神經網路進行分類,接下來就出現了基於深度學習模型的方法。比如:Large Scale Multi-label Text Classification with Semantic Word Vectors。這篇文章很簡單,就是把TextCNN和GRU直接用到多標籤文字分類裡,最後根據一個閾值alpha來確定樣本是否屬於某個類別。
Improved Neural Network-based Multi-label Classification with Better Initialization Leveraging Label Co-occurrence。這篇文章提出了一種根據類別標籤之間的共現關係來初始化最後輸出層引數的方法。其也是基於TextCNN,不同之處是最後一個輸出層的權重不使用隨機初始化,而是根據標籤之間的共現關係進行初始化。據作者說這樣可以獲得標籤之間的關係,這樣有一種聚類的效果。相似的樣本會標記為相同的標籤。此外他還提出了損失函式的計算方法。具體的細節部分可以去看相關論文。
模型上的改進:Ensemble Application of Convolutional and Recurrent Neural Networks for Multi-label Text Categorization。這篇論文主要提出了一種CNN和RNN融合的機制,將CNN的輸出作為RNN的初始狀態然後進行類別的預測。架構圖如下所示:
上面幾篇論文是我在做競賽的過程中閱讀的幾篇相關論文,每篇都會有一定的特點,但是實際的效果如何其實並不會像論文中提到的那樣,也有可能是自己調參跳的不好。但是論文裡面提到的創新點還是值得我們學習的。然後我們來總結一下多標籤文字分類相關的東西,這裡參考上面第三篇論文。首先來講,多標籤分類的演算法可以分成下面三種類型:
- multi-label classification:將標籤分成Y和Y的補集兩個分割槽
- label ranking:將標籤進行排序,排名靠前的就是預測為相關的類別
- multi-label ranking:上述二者的綜合,同時產生分割槽和rank。設定閾值函式進行判斷
此外,我們還可以使用Binary Relevance(BR)演算法,將多標籤問題轉化為L個二分類問題。訓練L個模型,每個模型處理一個類別,這樣做的好處是可以並行訓練L個模型,降低訓練複雜度,而且可以方便的增刪標籤數量。最終只需要把結果合併成一個輸出向量就可以了。但是也有一點的缺點,比如說由於分開訓練L個模型,所以忽視了標籤之間的相關性。而且噹噹資料集出現類別不均衡等現象時,效果也會變差。
上面說了幾種如何看待多標籤分類問題的思路和看法。其實就是將多標籤分類進行轉化。我感覺比較常用的應該是ranking和BR的方法。再反過來看這次知乎的競賽,其實我看了前幾名的解決方案,大都是隻用了深度學習模型的堆砌,比如說CNN,RNN然後再加上模型融合和資料增強的一些手段得到了比較好的分數。但是我之前也採訪過知乎機器學習團隊的負責人,他當時也明確的表明現在選手使用的方法還都是比較老派,沒有什麼十分大的創新點出來,而且幾乎沒怎麼利用標籤之間的關係等資訊。這裡我就說一下我在競賽裡面做過的幾種嘗試。
1,首先來分析一下知乎所提供的資料都有哪些特點,第一給了1999個標籤之間的父子關係,這樣我們就可以將其構成一張樹狀關係圖。
2,其次他給出了每個label的描述資訊,我覺得這個資訊是最重要的,因為這樣我們最簡單也可以計算樣本和1999個標籤之間的相似性然後排名取出前5個就可以粗略地進行類別標註。當然我們在結合深度學習的時候可以將其放在最後一層跟CNN的輸出進行結合計算。我當時採用的方法是,將樣本和1999個標籤的title分別經過CNN進行計算,然後再將得到的文字表示和標籤資訊進行一個相似性計算得到每個類別的相似性概率表示。但是這種方法的缺點在於速度太慢,我當時訓練了一天兩夜才跑了2個epoch(CPU),所以中途放棄了,至今也不知道效果如何==
3,使用上面第四篇文獻中所提出的方法,首先對資料進行預處理,得到所有訓練資料中所出現的標籤共現資訊,取共現次數最高的前N個標籤對作為初始化的依據。該模型的想法是通過這種自定義初始化網路權重的方法讓模型學習到這種標籤的共現資訊,從而更加準確地進行類別預測。
4,在查閱文獻的過程中,看到了一篇“Multi-Label Classification on Tree- and DAG-Structured Hierarchies”的論文,其提出將標籤資訊構建成有向無環圖或者樹狀的分層結構。但是該方法是基於傳統機器學習模型做的,由於競賽過程中時間有限,所以並未加以嘗試。此外,我還考慮是否可以將標籤資訊使用類似於word2vec中的分層softmax的機制進行處理。總之是儘量的把標籤之間的父子關係圖利用起來,以增強分類的準確度。這裡也不過是一些自己的想法罷了,還並未進行實踐,也希望有懂這方面知識的同學可以指點一二。
至此,關於多標籤文字分類相關的知識就暫時總結到這裡,其實也就是看的幾篇論文和知乎競賽中的一些思考。接下來抽時間把自己參加競賽的一些具體的程式碼等再整理出一篇部落格就將完結這個系列。