DAN(Deep Average Network)
MLP(Multi-Layer Perceptrons)叫做多層感知機,即由多層網絡簡單堆疊而成,進而我們可以在輸出層加入softmax,或者將輸入層作為特征進行提取后,輸入到SVM,邏輯回歸,朴素貝葉斯等傳統分類器進行分類預測。其中最具代表的是DAN,其基本結構如下圖所示:

在輸入層,我們對每一篇文章中的詞匯向量進行相加求平均。在中間隱藏層,我們建立了多層的神經網絡單元,進行深層次的特征提取,對每一層,我們都有相應的激活函數,其中激活函數可以按照我們的需求自己進行選擇。在輸出層,我們加入了softmax層,對輸出層的個數即為分類標簽的個數,我們要做的事情就是最大化當前文章標簽所對應的神經元節點,進而構造損失函數,進行參數更新。
在預測階段,我們將文章的單詞進行輸入,最終根據輸出層softmax最大的節點,得到我們的預測標簽。對於多分類,我們可以自己限定閾值和多分類的個數,取最大的topK個標簽。
模型使用中的trick:在作者的論文中[1],加了了dropout,將輸入層隨機的進行丟棄,增加了模型的健壯性。
那這種模型有什么優缺點嗎?我們來總結一下:
優點:
- 模型簡單,訓練速度快。
- 模型通過增加隱藏層節點的個數,可以增加模型的復雜度,進而提升模型的准確率。
缺點:
- 由於輸入層使用的加和平均作為,並沒有考慮單詞之間的順序信息。
Fasttext
fasttext是facebook在2016年推出的一款獲取詞向量和快速分類的一個工具[2],其基本思想是建立在Google提出的Word2vector的基礎上,並對其進行些許的改進,打造成了一種既可以獲取詞向量又可以進行文本分類的工具,其中,fasttext根據Piotr Bojanowski[2]等人的文章,加入了n-gram模型,增加了單詞的順序信息,從而增加了准確率。論文實驗結果表明,在情感分析和tag標注上都取得了不錯的效果。
fasttext文本分類
如果想了解fasttext的基本原理,首先要對word2vec有一定的了解,可以參考詞向量模型word2vec詳解。
fasttext用於文本分類,其基本模型和word2vec類似,無非是將葉子節點改成類別標簽。我們設文章集合為\(D\),\(d_{i} \in D\),表示第\(i\)篇文章,\(w_{ij}\)表示第\(i\)篇文章中的第\(j\)個單詞,我們假設詞匯集合為\(V\),類別標簽為\(label_i\),表示第\(i\)篇文章的標簽是\(label_i\),對於第\(i\)篇文章的第\(j\)個單詞\(w_{ij}\)來說,我們抽取其上下文的單詞\(context(w_{ij})\),我們可以構建模型

輸入層到隱藏層,對於CBOW模型來說,輸入的就是當前詞的上下文單詞,我們這里可以設定一個窗口的閾值,比如是1,則我們輸入的當前單詞的前后兩個單詞,從輸入層到隱藏層,我們會對這兩個單詞的詞向量進行相加,得到vec(context(wij)),得到隱藏層的節點。從隱藏層到葉子結點,我們可以設置一個全連接層, 在輸出層,我們可以進行一個softmax,最終最大化當前文章的label,進而構造損失函數,進行求解。
在隱藏層到輸出層中,我們可以用哈夫曼樹來代替全連接結構,進而加快訓練的速度。個人認為,其實對於量級比較少的label,構造哈夫曼樹的作用不大,但是對於類別標簽較多的樣本來說,構造哈夫曼樹作用還是比較大的
以上便是fasttext用於文本分類的整體流程,筆者實驗了在大數據集上的文本分類速度和效果,整體上還是不錯的,可以作為文本分類的一個baseline。
fasttext的n-gram模型
由於輸入的單詞僅僅做了一個簡單的加和,並沒有考慮單詞之間的順序特征,舉個例子,"我 愛 你"和"你 愛 我"經過分詞之后,可以看到如果根據詞袋模型,兩者的輸入是完全相同的,但是如果加入n-gram信息的話,就變成了"我 愛 你 我愛 愛你"和"你 愛 我 你愛 愛我"這樣輸入的特征就不一樣了,區分了兩者。
所以根據[3]的思想,我們可以在分類或者是向量學習的階段,將n-gram特征作為輸入的信息,增加更多的特征,使得學習的更充分。
那么綜上,我們來總結一下fasttext的優缺點
優點:
- fasttext在構建使用的哈夫曼樹,極大增加了訓練和預測的速度。
- 加入了n-gram模型,考慮了單詞之間的順序問題,有效的提高了准確率。
缺點:
- 雖然fasttext加入了n-gram模型以增加單詞之間的順序信息,但是總體來說其受限於context的長度,對於大於context窗口大小的單詞,無法捕捉其順序信息。
Doc2vec
Doc2vec是一種獲取文章向量的一種方法,為什么要放在文本分類的里面呢,是因為當我們獲取文章向量之后,我們就可以將文章向量輸入到SVM,邏輯回歸進行分類預測了,所以,本質上doc2vec目的並不是用於分類,而是獲取文章向量的上面。
Doc2vec是由Tomas Mikolov[4]提出的一種文章向量獲取的方法,其思想是建立在Word2vec的基礎上,區別在於將文章的向量D也作為一種可變的參數,加入到訓練中,如下圖所示,當我們要預測第四個單詞"on"的時候,我們將這批詞所對應的文章向量D與另外三個單詞作為輸入,同時進行預測,在輸入層,我們可以利用簡單的加和或者是取平均值,剩下的基本就和Word2vec一樣,從隱藏層到輸出層我們可以建立一個神經網絡,輸出節點的個數即為單詞的個數,或者我們用哈夫曼樹,加快訓練的時間。

同樣,作者在論文中還提出了一種skim-gram的doc2vec,如下圖所示,即我們用當前文章向量D作為輸入。

我們簡單總結一下doc2vec的優缺點
優點:
- doc2vec是一種無監督的學習,根據語料可以直接獲得文章的向量,省去了手工獲取特征的麻煩,而且隨着我們語料的增加,模型會更加的精確。
- 文章和詞向量一起訓練,一定程度上使得文章向量的表達更准確。
缺點:
- 模型結構比較簡單,不能捕獲單詞的order信息。
[2]Armand Joulin.(2016)Bag of Tricks for Efficient Text Classification.
[3]Piotr Bojanowski(2016)Enriching Word Vectors with Subword Information.
[4]Tomas Mikolov(2014)Distributed Representations of Sentences and Documents.