一、FastText簡介
FastText是一個快速文本分類算法,與基於神經網絡的分類算法相比有以下優點:
1、FastText在保持高精度的情況下加快了訓練速度和測試速度
2、FastText不需要預訓練好的詞向量,FastText會自己訓練詞向量
3、FastText兩個重要的優化:Hierarchical Softmax、N-gram
二、FastText模型架構
FastText模型架構和word2vec中的CBOW很相似, 不同之處是FastText預測標簽而CBOW預測的是中間詞,即模型架構類似但是模型的任務不同。下面我們先看一下CBOW的架構:

word2vec將上下文關系轉化為多分類任務,進而訓練邏輯回歸模型,這里的類別數量|V|詞庫大小。通常的文本數據中,詞庫少則數萬,多則百萬,在訓練中直接訓練多分類邏輯回歸並不現實。word2vec中提供了兩種針對大規模多分類問題的優化手段, negative sampling 和hierarchical softmax。在優化中,negative sampling 只更新少量負面類,從而減輕了計算量。hierarchical softmax 將詞庫表示成前綴樹,從樹根到葉子的路徑可以表示為一系列二分類器,一次多分類計算的復雜度從|V|降低到了樹的高度。
FastText模型架構:其中x1,x2,…,xN−1,xN表示一個文本中的n-gram向量,每個特征是詞向量的平均值。這和前文中提到的cbow相似,不同的是,CBOW的輸入是目標單詞的上下文,FastText的輸入是多個單詞及其n-gram特征,這些特征用來表示單個文檔;CBOW的輸入單詞被onehot編碼過,FastText的輸入特征是被embedding過;CBOW的輸出是目標詞匯,FastText的輸出是文檔對應的類標。
三、層次softmax
softmax函數常在神經網絡輸出層充當激活函數,目的就是將輸出層的值歸一化到0-1區間,將神經元輸出構造成概率分布,主要就是起到將神經元輸出值進行歸一化的作用,下圖展示了softmax函數對於輸出值z1=3,z2=1,z3=-3的歸一化映射過程。

在標准的softmax中,計算一個類別的softmax概率時,我們需要對所有類別概率做歸一化,在這類別很大情況下非常耗時,因此提出了分層softmax(Hierarchical Softmax),思想是根據類別的頻率構造霍夫曼樹來代替標准softmax,通過分層softmax可以將復雜度從N降低到logN,下圖給出分層softmax示例:

在層次softmax模型中,葉子結點的詞沒有直接輸出的向量,而非葉子節點都有響應的輸在在模型的訓練過程中,通過Huffman編碼,構造了一顆龐大的Huffman樹,同時會給非葉子結點賦予向量。我們要計算的是目標詞w的概率,這個概率的具體含義,是指從root結點開始隨機走,走到目標詞w的概率。因此在途中路過非葉子結點(包括root)時,需要分別知道往左走和往右走的概率。例如到達非葉子節點n的時候往左邊走和往右邊走的概率分別是:

以上圖中目標詞為w2為例:

到這里可以看出目標詞為w的概率可以表示為:

其中θn(w,j)是非葉子結點n(w,j)的向量表示(即輸出向量);h是隱藏層的輸出值,從輸入詞的向量中計算得來;sign(x,j)是一個特殊函數定義:

此外,所有詞的概率和為1,即:
![]()
最終得到參數更新公式為:

四、N-gram特征
n-gram是基於語言模型的算法,基本思想是將文本內容按照子節順序進行大小為N的窗口滑動操作,最終形成窗口為N的字節片段序列。而且需要額外注意一點是n-gram可以根據粒度不同有不同的含義,有字粒度的n-gram和詞粒度的n-gram,下面分別給出了字粒度和詞粒度的例子:
我來到達觀數據參觀
相應的bigram特征為:
我來 來到 到達 達觀 觀數 數據 據參 參觀
相應的trigram特征為:
我來到 來到達 到達觀 達觀數 觀數據 數據參 據參觀
注意一點:n-gram中的gram根據粒度不同,有不同的含義。它可以是字粒度,也可以是詞粒度的。上面所舉的例子屬於字粒度的n-gram,詞粒度的n-gram看下面例子:
我 來到 達觀數據 參觀
相應的bigram特征為:
我/來到 來到/達觀數據 達觀數據/參觀
相應的trigram特征為:
我/來到/達觀數據 來到/達觀數據/參觀
對於文本句子的n-gram來說,如上面所說可以是字粒度或者是詞粒度,同時n-gram也可以在字符級別工作,例如對單個單詞matter來說,假設采用3-gram特征,那么matter可以表示成圖中五個3-gram特征,這五個特征都有各自的詞向量,五個特征的詞向量和即為matter這個詞的向其中“<”和“>”是作為邊界符號被添加,來將一個單詞的ngrams與單詞本身區分開來:
從上面來看,使用n-gram有如下優點:
1、為罕見的單詞生成更好的單詞向量:根據上面的字符級別的n-gram來說,即是這個單詞出現的次數很少,但是組成單詞的字符和其他單詞有共享的部分,因此這一點可以優化生成的單詞向量
2、在詞匯單詞中,即使單詞沒有出現在訓練語料庫中,仍然可以從字符級n-gram中構造單詞的詞向量
3、n-gram可以讓模型學習到局部單詞順序的部分信息, 如果不考慮n-gram則便是取每個單詞,這樣無法考慮到詞序所包含的信息,即也可理解為上下文信息,因此通過n-gram的方式關聯相鄰的幾個詞,這樣會讓模型在訓練的時候保持詞序信息
但正如上面提到過,隨着語料庫的增加,內存需求也會不斷增加,嚴重影響模型構建速度,針對這個有以下幾種解決方案:
1、過濾掉出現次數少的單詞
2、使用hash存儲
3、由采用字粒度變化為采用詞粒度
五、FastText核心思想
現在拋開那些不是很討人喜歡的公式推導,來想一想FastText文本分類的核心思想是什么?
仔細觀察模型的后半部分,即從隱含層輸出到輸出層輸出,會發現它就是一個softmax線性多類別分類器,分類器的輸入是一個用來表征當前文檔的向量;模型的前半部分,即從輸入層輸入到隱含層輸出部分,主要在做一件事情:生成用來表征文檔的向量。那么它是如何做的呢?疊加構成這篇文檔的所有詞及n-gram的詞向量,然后取平均。疊加詞向量背后的思想就是傳統的詞袋法,即將文檔看成一個由詞構成的集合。
於是FastText的核心思想就是:將整篇文檔的詞及n-gram向量疊加平均得到文檔向量,然后使用文檔向量做softmax多分類。這中間涉及到兩個技巧:字符級n-gram特征的引入以及分層Softmax分類。
參考:
