系統學習NLP(十九)--文字分類之FastText

Eason.wxd發表於2019-03-14

轉自:https://blog.csdn.net/sinat_26917383/article/details/54850933

FastText是Facebook開發的一款快速文字分類器,提供簡單而高效的文字分類和表徵學習的方法,不過這個專案其實是有兩部分組成的,一部分是這篇文章介紹的
fastText 文字分類(paper:A. Joulin, E. Grave, P. Bojanowski, T. Mikolov,
Bag of Tricks for Efficient Text
Classification(高效文字分類技巧)
),
另一部分是詞嵌入學習(paper:P.
Bojanowski*, E. Grave*, A. Joulin, T. Mikolov, Enriching Word Vectors
with Subword
Information
(使用子字資訊豐富詞彙向量))。
按論文來說只有文字分類部分才是 fastText,但也有人把這兩部分合在一起稱為
fastText。筆者,在這即認為詞嵌入學習屬於FastText專案。
github連結:https://github.com/facebookresearch/fastText

.

高階詞向量三部曲:

1、NLP︱高階詞向量表達(一)——GloVe(理論、相關測評結果、R&python實現、相關應用)
2、NLP︱高階詞向量表達(二)——FastText(簡述、學習筆記)
3、NLP︱高階詞向量表達(三)——WordRank(簡述)
4、其他NLP詞表示方法paper:從符號到分散式表示NLP中詞各種表示方法綜述


如何在python 非常簡單訓練FastText,可見筆者部落格:

極簡使用︱Gemsim-FastText 詞向量訓練以及OOV(out-of-word)問題有效解決


一、FastText架構

本節內容參考自:
1、開源中國社群 [http://www.oschina.net] 《Facebook 開源的快速文字分類器 FastTexT》
2、雷鋒網文章:《比深度學習快幾個數量級,詳解Facebook最新開源工具——fastText

.

1、fastText 架構原理

fastText 方法包含三部分:模型架構、層次 Softmax 和 N-gram 特徵。

fastText 模型輸入一個詞的序列(一段文字或者一句話),輸出這個詞序列屬於不同類別的概率。
序列中的詞和片語組成特徵向量,特徵向量通過線性變換對映到中間層,中間層再對映到標籤。
fastText 在預測標籤時使用了非線性啟用函式,但在中間層不使用非線性啟用函式。
fastText 模型架構和 Word2Vec 中的 CBOW 模型很類似。不同之處在於,fastText 預測標籤,而 CBOW 模型預測中間詞。

2softmax_53" target="_blank">這裡寫圖片描述

.

.

2、改善運算效率——softmax層級

對於有大量類別的資料集,fastText使用了一個分層分類器(而非扁平式架構)。不同的類別被整合進樹形結構中(想象下二叉樹而非 list)。在某些文字分類任務中類別很多,計算線性分類器的複雜度高。為了改善執行時間,fastText 模型使用了層次 Softmax 技巧。層次 Softmax 技巧建立在哈弗曼編碼的基礎上,對標籤進行編碼,能夠極大地縮小模型預測目標的數量。(參考部落格
這裡寫圖片描述

考慮到線性以及多種類別的對數模型,這大大減少了訓練複雜性和測試文字分類器的時間。fastText 也利用了類別(class)不均衡這個事實(一些類別出現次數比其他的更多),通過使用 Huffman 演算法建立用於表徵類別的樹形結構。因此,頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高。
這裡寫圖片描述
.
.
.


二、FastText的詞向量表徵

1、FastText的N-gram特徵

常用的特徵是詞袋模型。但詞袋模型不能考慮詞之間的順序,因此 fastText 還加入了 N-gram 特徵。
“我 愛 她” 這句話中的詞袋模型特徵是 “我”,“愛”, “她”。這些特徵和句子 “她 愛 我” 的特徵是一樣的。
如果加入 2-Ngram,第一句話的特徵還有 “我-愛” 和 “愛-她”,這兩句話 “我 愛 她” 和 “她 愛 我” 就能區別開來了。當然,為了提高效率,我們需要過濾掉低頻的 N-gram。

在 fastText 中一個低維度向量與每個單詞都相關。隱藏表徵在不同類別所有分類器中進行共享,使得文字資訊在不同類別中能夠共同使用。這類表徵被稱為詞袋(bag of words)(此處忽視詞序)。在 fastText中也使用向量表徵單詞 n-gram來將區域性詞序考慮在內,這對很多文字分類問題來說十分重要。

2FastText_84" target="_blank">舉例來說:fastText能夠學會“男孩”、“女孩”、“男人”、“女人”指代的是特定的性別,並且能夠將這些數值存在相關文件中。然後,當某個程式在提出一個使用者請求(假設是“我女友現在在兒?”),它能夠馬上在fastText生成的文件中進行查詢並且理解使用者想要問的是有關女性的問題。

.

.

2、FastText詞向量優勢

(1)適合大型資料+高效的訓練速度:能夠訓練模型“在使用標準多核CPU的情況下10分鐘內處理超過10億個詞彙”,特別是與深度模型對比,fastText能將訓練時間由數天縮短到幾秒鐘。使用一個標準多核 CPU,得到了在10分鐘內訓練完超過10億詞彙量模型的結果。此外, fastText還能在五分鐘內將50萬個句子分成超過30萬個類別。
(2)支援多語言表達:利用其語言形態結構,fastText能夠被設計用來支援包括英語、德語、西班牙語、法語以及捷克語等多種語言。它還使用了一種簡單高效的納入子字資訊的方式,在用於像捷克語這樣詞態豐富的語言時,這種方式表現得非常好,這也證明了精心設計的字元 n-gram 特徵是豐富詞彙表徵的重要來源。FastText的效能要比時下流行的word2vec工具明顯好上不少,也比其他目前最先進的詞態詞彙表徵要好。
這裡寫圖片描述
(3)fastText專注於文字分類,在許多標準問題上實現當下最好的表現(例如文字傾向性分析或標籤預測)。FastText與基於深度學習方法的Char-CNN以及VDCNN對比:
FastText與基於深度學習方法的Char-CNN以及VDCNN對比
(4)比word2vec更考慮了相似性,比如 fastText 的詞嵌入學習能夠考慮 english-born 和 british-born 之間有相同的字尾,但 word2vec 卻不能(具體參考paper)。
.
.

3、FastText詞向量與word2vec對比

本節來源於部落格:fasttext
FastText= word2vec中 cbow + h-softmax的靈活使用

靈活體現在兩個方面:

  1. 模型的輸出層:word2vec的輸出層,對應的是每一個term,計算某term的概率最大;而fasttext的輸出層對應的是 分類的label。不過不管輸出層對應的是什麼內容,起對應的vector都不會被保留和使用;
  2. 模型的輸入層:word2vec的輸出層,是 context window 內的term;而fasttext 對應的整個sentence的內容,包括term,也包括 n-gram的內容;

兩者本質的不同,體現在 h-softmax的使用。
Wordvec的目的是得到詞向量,該詞向量 最終是在輸入層得到,輸出層對應的 h-softmax 也會生成一系列的向量,但最終都被拋棄,不會使用。
fasttext則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label(一個或者N個)

相關文章:Jupyter notebooks:Comparison of FastText and Word2Vec
.
.
.


三、FastText實現

github連結:https://github.com/facebookresearch/fastText
fastText基於Mac OS或者Linux系統構築,使用 C++11 的特性。需要python 2.6 或者更高版本支援,以及numpy & scipy等軟體支援。
FastText預設引數:

$ ./fasttext supervised
Empty input or output path.

The following arguments are mandatory:
  -input              training file path
  -output             output file path

The following arguments are optional:
  -lr                 learning rate [0.1]
  -lrUpdateRate       change the rate of updates for the learning rate [100]
  -dim                size of word vectors [100]
  -ws                 size of the context window [5]
  -epoch              number of epochs [5]
  -minCount           minimal number of word occurences [1]
  -minCountLabel      minimal number of label occurences [0]
  -neg                number of negatives sampled [5]
  -wordNgrams         max length of word ngram [1]
  -loss               loss function {ns, hs, softmax} [ns]
  -bucket             number of buckets [2000000]
  -minn               min length of char ngram [0]
  -maxn               max length of char ngram [0]
  -thread             number of threads [12]
  -t                  sampling threshold [0.0001]
  -label              labels prefix [__label__]
  -verbose            verbosity level [2]
  -pretrainedVectors  pretrained word vectors for supervised learning []

Mikolov 在 fastTetxt 的論文中報告了兩個實驗,其中一個實驗和 Tagspace 模型進行對比。實驗是在 YFCC100M 資料集上進行的, YFCC100M 資料集包含將近 1 億張圖片以及摘要、標題和標籤。實驗使用摘要和標題去預測標籤。Tagspace 模型是建立在 Wsabie 模型的基礎上的。Wsabie 模型除了利用 CNN 抽取特徵之外,還提出了一個帶權近似配對排序 (Weighted Approximate-Rank Pairwise, WARP) 損失函式用於處理預測目標數量巨大的問題。
這裡寫圖片描述
上面就是實驗結果,從實驗結果來看 fastText 能夠取得比 Tagspace 好的效果,並擁有無以倫比的訓練測試速度。但嚴格來說,這個實驗對 Tagspace 有些不公平。YFCC100M 資料集是關於多標記分類的,即需要模型能從多個類別裡預測出多個類。Tagspace 確實是做多標記分類的;但 fastText 只能做多類別分類,從多個類別裡預測出一個類。而評價指標 prec@1 只評價一個預測結果,剛好能夠評價多類別分類。

YFCC100M 資料: https://research.facebook.com/research/fasttext/

相關文章