1. 前言
自然語言處理(NLP)是機器學習,人工智能中的一個重要領域。文本表達是 NLP中的基礎技術,文本分類則是 NLP 的重要應用。fasttext是facebook開源的一個詞向量與文本分類工具,在2016年開源,典型應用場景是“帶監督的文本分類問題”。提供簡單而高效的文本分類和表征學習的方法,性能比肩深度學習而且速度更快。
fastText結合了自然語言處理和機器學習中最成功的理念。這些包括了使用詞袋以及n-gram袋表征語句,還有使用子詞(subword)信息,並通過隱藏表征在類別間共享信息。我們另外采用了一個softmax層級(利用了類別不均衡分布的優勢)來加速運算過程。
2. FastText原理
fastText方法包含三部分,模型架構,層次SoftMax和N-gram子詞特征。
2.1 模型架構
fastText的架構和word2vec中的CBOW的架構類似,因為它們的作者都是Facebook的科學家Tomas Mikolov,而且確實fastText也算是word2vec所衍生出來的。
- CBOW的架構:輸入的是\(w(t)\)的上下文\(2d\)個詞,經過隱藏層后,輸出的是\(w(t)\)。
word2vec將上下文關系轉化為多分類任務,進而訓練邏輯回歸模型,這里的類別數量是 \(|V|\) 詞庫大小。通常的文本數據中,詞庫少則數萬,多則百萬,在訓練中直接訓練多分類邏輯回歸並不現實。
word2vec中提供了兩種針對大規模多分類問題的優化手段, negative sampling 和 hierarchical softmax。在優化中,negative sampling 只更新少量負面類,從而減輕了計算量。hierarchical softmax 將詞庫表示成前綴樹,從樹根到葉子的路徑可以表示為一系列二分類器,一次多分類計算的復雜度從\(|V|\)降低到了樹的高度。
- fastText模型架構:
其中\(x_1,x_2,...,x_{N-1},x_N\)表示一個文本中的n-gram向量,每個特征是詞向量的平均值。這和前文中提到的cbow相似,cbow用上下文去預測中心詞,而此處用全部的n-gram去預測指定類別。
2.2 層次SoftMax
對於有大量類別的數據集,fastText使用了一個分層分類器(而非扁平式架構)。不同的類別被整合進樹形結構中(想象下二叉樹而非 list)。在某些文本分類任務中類別很多,計算線性分類器的復雜度高。為了改善運行時間,fastText 模型使用了層次 Softmax 技巧。層次 Softmax 技巧建立在哈弗曼編碼的基礎上,對標簽進行編碼,能夠極大地縮小模型預測目標的數量。
fastText 也利用了類別(class)不均衡這個事實(一些類別出現次數比其他的更多),通過使用 Huffman 算法建立用於表征類別的樹形結構。因此,頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高。
2.3 N-gram子詞特征
fastText 可以用於文本分類和句子分類。不管是文本分類還是句子分類,我們常用的特征是詞袋模型。但詞袋模型不能考慮詞之間的順序,因此 fastText 還加入了 N-gram 特征。在 fasttext 中,每個詞被看做是 n-gram字母串包。為了區分前后綴情況,"<", ">"符號被加到了詞的前后端。除了詞的子串外,詞本身也被包含進了 n-gram字母串包。以 where 為例,\(n=3\) 的情況下,其子串分別為
<wh, whe, her, ere, re>,以及其本身
3. fastText和word2vec的區別
- 相似處:
- 圖模型結構很像,都是采用embedding向量的形式,得到word的隱向量表達。
- 都采用很多相似的優化方法,比如使用Hierarchical softmax優化訓練和預測中的打分速度。
- 不同處:
- 模型的輸出層:word2vec的輸出層,對應的是每一個term,計算某term的概率最大;而fasttext的輸出層對應的是分類的label。不過不管輸出層對應的是什么內容,起對應的vector都不會被保留和使用。
- 模型的輸入層:word2vec的輸出層,是 context window 內的term;而fasttext 對應的整個sentence的內容,包括term,也包括 n-gram的內容。
- 兩者本質的不同,體現在 h-softmax的使用:
- Word2vec的目的是得到詞向量,該詞向量 最終是在輸入層得到,輸出層對應的 h-softmax
也會生成一系列的向量,但最終都被拋棄,不會使用。 - fastText則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label(一個或者N個)
4. 總結
fastText是一個能用淺層網絡取得和深度網絡相媲美的精度,並且分類速度極快的算法。按照作者的說法“在標准的多核CPU上,能夠訓練10億詞級別語料庫的詞向量在10分鍾之內,能夠分類有着30萬多類別的50多萬句子在1分鍾之內”。但是它也有自己的使用條件,它適合類別特別多的分類問題,如果類別比較少,容易過擬合。