**初探FastText原理,淺談文本分類利器解讀(1)**

前言
好久沒有寫點東西了,的確是出於工作需要,不得不使用FastText,其實,我想說的是,FastText具有的優越性和不可替代性。言規正傳,什麼是FastText呢?

何爲FastText

它是由Facebook AI Research最近推出的文本分類和詞訓練工具,其源碼已經託管在Github上。FastText最大的特點是模型簡單,只有一層的隱層以及輸出層,因此訓練速度非常快,在普通的CPU上可以實現分鐘級別的訓練,比深度模型的訓練要快幾個數量級。同時,在多個標準的測試數據集上,FastText在文本分類的準確率上,和現有的一些深度學習的方法效果相當或接近。

最近一直在做微信廣告文章分類的工作,正好順手研究了下FastText,並在微信廣告文章識別上做了一些嘗試。因爲代碼開源的時間不長,網上相應的文章和資料還比較少, 希望這篇文章對想了解和使用FastText做文本分類的朋友們有所幫助。

技術原理

介紹原理之前,我們先稍微聊一點八卦。FastText的其中一個作者是Thomas Mikolov。熟悉word2vec的朋友應該對這個名字很熟悉,正是他當年在Google帶了一個團隊倒騰出來了word2vec,很好的解決了傳統詞袋錶示的缺點,極大地推動了NLP領域的發展。後來這哥們跳槽去了Facebook,纔有了現在的FastText。從“血緣”角度來看,FastText和word2vec可以說是一脈相承。

回到正題,FastText主要有兩個功能,一個是訓練詞向量,另一個是文本分類。詞向量的訓練,相對於word2vec來說,增加了subwords特性。subwords其實就是一個詞的character-level的n-gram。比如單詞"hello",長度至少爲3的char-level的ngram有"hel",“ell”,“llo”,“hell”,“ello"以及本身"hello”。每個ngram都可以用一個dense的向量zg表示,於是整個單詞"hello"就可以表示表示爲:

FastText原理

具體細節可以參考論文Enriching Word Vectors with Subword Information,這裏就不展開敘述了。那麼把每個word,拆成若干個char-level的ngram表示有什麼好處呢?其實細想一下也非常容易理解,無非就是豐富了詞表示的層次。比方說"english-born"和"china-born",從單詞層面上看,是兩個不同的單詞,但是如果用char-level的ngram來表示,都有相同的後綴"born"。因此這種表示方法可以學習到當兩個詞有相同的詞綴時,其語義也具有一定的相似性。這種方法對英語等西語來說可能是奏效的,因爲英語中很多相同前綴和後綴的單詞,語義上確實有所相近。但對於中文來說,這種方法可能會有些問題。比如說,“原來"和"原則”,雖有相同前綴,但意義相去甚遠。可能對中文來說,按照偏旁部首等字形的方式拆解可能會更有意義一些。

FastText的另一個功能是做文本分類。主要的原理在論文Bag of Tricks for Efficient Text Classification中有所闡述。其模型結構簡單來說,就是一層word embedding的隱層+輸出層。結構如下圖所示:

FastText原理

上圖中左邊的圖就是FastText的網絡結構,其中W(1)到W(n)表示document中每個詞的word embedding表示。文章則可以用所有詞的embedding累加後的均值表示,即

FastText原理

最後從隱層再經過一次的非線性變換得到輸出層的label。通過對比word2vec中的cbow模型(continuous bag of word),可以發現兩個模型其實非常地相似。不同之處在於,FastText模型最後預測的是文章的label,而cbow模型預測的是窗口中間的詞w(t),一個是有監督的學習,一個是無監督的學習。另外cbow模型中輸入層只包括當前窗口內除中心詞的所有詞的Embeddings,而FastText模型的輸出層則是文章全部詞的Embeddings。

和word2vec類似,FastText本質上也可以看成是一個淺層的神經網絡,因此其forward-propogation過程可描述如下:
FastText原理
其中z是最後輸出層的輸入向量,Wo表示從隱層到輸出層的權重。因爲模型的最後我們要預測文章屬於某個類別的概率,所以很自然的選擇就是softmax層了,於是損失函數可以定義爲:

FastText原理
當類別數較少時,直接套用softmax層並沒有效率問題,但是當類別很多時,softmax層的計算就比較費時了。爲了加快訓練過程,FastText同樣也採用了和word2vec類似的方法。一種方法是使用hierarchical softmax,當類別數爲K,word embedding大小爲d時,計算複雜度可以從O(Kd)降到O(dlog(K))。另一種方法是採用negative sampling,即每次從除當前label外的其他label中選擇幾個作爲負樣本,並計算出現負樣本的概率加到損失函數中,用公式可表示爲:

FastText原理

其中hi是第i個樣本的隱層,uj表示Wo中第j行向量。

關於FastText的原理細節,分享到此,更多人工智能專技術乾貨,加V: fengkou-IT
感謝您的閱讀,更多精彩請持續關注蜂口微信小程序

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章