1. 參考資料

  • 論文1:FastText1詞向量,《Enriching Word Vectors with Subword Information》,作者Bojanowski et al. (包括Mikolov),FAIR(Facebook AI Research)
  • 論文2:FastText2文本分類模型,《Bag of Tricks for Efficient Text Classification》,作者Joulin et al. (包括Mikolov),FAIR(Facebook AI Research)
  • 博客文:《fastText 源碼分析》
  • FastText源代碼(C++)

主要參考資料如上,其實還有其他博客文,然而很多博客文都是互相抄襲的……而且很多都是講解FastText文本分類模型,而非FastText詞向量,前者基於後者建模。FastText文本分類模型原理簡單易懂,然而詞向量的訓練原理有某些地方講的很含糊。基於以上參考資料,我只能做出個人理解。(因為看源碼看了很久,還是感覺沒能解決我的核心疑惑……)

FastText其實是包括2個東西的:

  • FastText詞向量(PS:和Word2vec、GloVe一樣,FastText詞向量也屬於靜態詞向量),對應論文1

  • FastText文本分類模型,對應論文2

雖說本系列文章主題是:Word Embedding詞向量,但是由於FastText特殊性,這裡一起講FastText文本分類模型

FastText的最大優點:快速。

《Efficient estimation of word representations in vector space》
摘要部分:

We can train fastText on more than
one billion words in less than ten
minutes using a standard multicore CPU,
and classify half a million sentences
among 312K classes in less than a minute.

2. FastText原理1:詞向量訓練

關於FastText詞向量資料,原論文《Enriching Word Vectors with Subword Information》的原理部分提及得相當簡略。

FastText詞向量框架是基於Word2vec框架的,區別主要如下:

前者利用n-grams向量之和作為詞向量(key point & 疑惑點

圖1- FastText詞向量表示

即單詞w對應1個n-grams集合(原論文為提取3-grams ~ 6-grams的所有子串),每個字串會有對應的向量,因此該單詞w的詞向量 = 所有n-grams字串向量求和。

關於n-grams,原論文有以下例子:

圖2- n-grams解釋

這裡,以where為例,其對應的3-grams子串集合G={"<wh","whe","her","ere","re>","<where>"},其中每一個子串對應1個向量表示,則where詞向量則為求和。同理對於中文,舉例蘇格拉底的3-grams子串集合G_1={"<蘇格","蘇格拉","格拉底","拉底>,"<蘇格拉底>"}

以上原理都不難理解,關鍵在於:原論文貌似沒給出子串向量是如何獲得!當然n-grams向量理應是訓練得到,然而如何訓練,網路結構如何,原論文沒提及,只是說基於Word2vec架構。Word2vec原理如下文:

Road 2 NLP- Word Embedding詞向量(Word2vec) | Eajacks Blog?

eajack.github.io
圖標

本人一直卡在如何訓練n-grams子串向量這問題上。涉及資料主要是:博客文《fastText 源碼分析》、FastText源代碼(C++)。經過多次分析猜測(由於本人最後還是放棄通讀C++源碼…我看了挺久,但還是不知道如何訓練n-grams子串獲得向量的,只發現了如何獲取子串string代碼)。

FastText默認Skip-Gram模型,對比Word2vec的Skip-Gram模型,有以下個人理解(由於畫圖較為複雜,此處文字描述):

圖3- Word2vec的Skip-Gram框架

如上圖為Word2vec原Skip-Gram模型。

  • 輸入層:輸入為當前單詞w的n-grams的index集合,從輸入向量矩陣 W_{V×N} 中挑出對應n-grams向量求和,作為輸入層的 x_{k}因此,FastText的輸入層和Word2vec的區別在於:前者取n-gram求和作為詞向量,後者取One-Hot詞向量;前者輸入向量矩陣 W_{V×N} ,其N為所有語料的n-grams總數,後者則為語料word總數。
  • 隱含層&輸出層:Word2vec & FastText一致。

因此,FastText詞向量訓練框架 & Word2vec不一致僅在於輸入層。(PS:個人理解)

3. FastText原理2:文本分類模型

FastText文本分類模型和詞向量訓練框架差不多,有了詞向量的原理基礎,該模型可以很簡單地用下圖總結:

圖4- FastText文本分類框架

如上圖,FastText文本分類模型僅3層。

  • 輸入層:句子的n-grams表示向量(PS:此處的n-grams向量為經過FastText詞向量訓練獲得
  • 隱藏層:n-grams向量求平均(PS:FastText詞向量訓練則是求和
  • 輸出層:softmax層(PS:沿用Word2vec的Hierarchical Softmax

由此可以看出,關鍵是輸入層的n-grams向量,而這個便是FastText詞向量訓練步驟。所以,FastText文本分類模型包括2步:1- FastText詞向量訓練;2- FastText文本分類模型構建


推薦閱讀:
相關文章