fastText-文本分類


一、fastText安裝

  1. windows下直接:pip install fasttext
  2. 直接下載whl包安裝

二、fastText介紹

  fastText是一個快速文本分類算法,與基於神經網絡的分類算法相比有兩大優點:
    1、fastText在保持高精度的情況下加快了訓練速度和測試速度
    2、fastText不需要預訓練好的詞向量,fastText會自己訓練詞向量
    3、fastText兩個重要的優化:Hierarchical Softmax、N-gram

  fastText結合了自然語言處理和機器學習中最成功的理念。這些包括了使用詞袋以及n-gram袋表征語句,還有使用子字(subword)信息,並通過隱藏表征在類別間共享信息。我們另外采用了一個softmax層級(利用了類別不均衡分布的優勢)來加速運算過程。

   這些不同概念被用於兩個不同任務: 

    • 有效文本分類 :有監督學習
    • 學習詞向量表征:無監督學習

三、fastText原理 

  包含三部分,模型架構,層次SoftMax,N-gram特征。

1、模型架構

  fastText模型架構和word2vec中的CBOW很相似, 不同之處是fastText預測標簽而CBOW預測的是中間詞,即模型架構類似但是模型的任務不同。

  1、word2vec的CBOW架構

  word2vec將上下文關系轉化為多分類任務,進而訓練邏輯回歸模型,這里的類別數量|V|詞庫大小。通常的文本數據中,詞庫少則數萬,多則百萬,在訓練中直接訓練多分類邏輯回歸並不現實。word2vec中提供了兩種針對大規模多分類問題的優化手段, negative sampling 和hierarchical softmax。在優化中,negative sampling 只更新少量負面類,從而減輕了計算量。hierarchical softmax 將詞庫表示成前綴樹,從樹根到葉子的路徑可以表示為一系列二分類器,一次多分類計算的復雜度從|V|降低到了樹的高度

                    

  2、fastText模型架構

  其中x1,x2,…,xN−1,xN表示一個文本中的n-gram向量,每個特征是詞向量的平均值。這和前文中提到的cbow相似,cbow用上下文去預測中心詞,而此處用全部的n-gram去預測指定類別;

  fastText 模型輸入一個詞的序列(一段文本或者一句話),輸出這個詞序列屬於不同類別的概率。序列中的詞和詞組組成特征向量,特征向量通過線性變換映射到中間層,中間層再映射到標簽。fastText 在預測標簽時使用了非線性激活函數,但在中間層不使用非線性激活函數。

                

  3、Subword子嵌入:

  一句話簡述:fastText提出了子詞嵌入(subword embedding)的方法。是一種監督學習方法。和word2vec 中的CBOW結構很相似。運行速度較快。

  對一些出現次數很少或者沒有出現的詞,使用subword的詞向量之和來表達,如coresponse這個詞,使用co的詞向量與response的詞向量之和來表示

 2、層次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,即

      

 最終得到參數更新公式為:

       

  對於有大量類別的數據集,fastText使用了一個分層分類器(而非扁平式架構)。不同的類別被整合進樹形結構中(想象下二叉樹而非 list)。在某些文本分類任務中類別很多,計算線性分類器的復雜度高。為了改善運行時間,fastText 模型使用了層次 Softmax 技巧。層次 Softmax 技巧建立在哈弗曼編碼的基礎上,對標簽進行編碼,能夠極大地縮小模型預測目標的數量。fastText 也利用了類別(class)不均衡這個事實(一些類別出現次數比其他的更多),通過使用 Huffman 算法建立用於表征類別的樹形結構。因此,頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高。

                    

    思考一下哈夫曼樹到底是怎么回事?

 

3、N-gram特征

  n-gram是基於語言模型的算法,基本思想是將文本內容按照子節順序進行大小為N的窗口滑動操作,最終形成窗口為N的字節片段序列。而且需要額外注意一點是n-gram可以根據粒度不同有不同的含義,有字粒度的n-gram和詞粒度的n-gram,下面分別給出了字粒度和詞粒度的例子:

            

  對於文本句子的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、由采用字粒度變化為采用詞粒度

四、api使用    

 

 

 

參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM