1. 程式人生 > >深度學習----NLP-fastext原理細解

深度學習----NLP-fastext原理細解

文章目錄

  • 3. fastText和word2vec的區別
  • 4. 總結
  • 出處: https://www.cnblogs.com/huangyc/p/9768872.html

    1. 前言

    自然語言處理(NLP)是機器學習,人工智慧中的一個重要領域。文字表達是 NLP中的基礎技術,文字分類則是 NLP 的重要應用。fasttext是facebook開源的一個詞向量與文字分類工具,在2016年開源,典型應用場景是“帶監督的文字分類問題”

    。提供簡單而高效的文字分類和表徵學習的方法,效能比肩深度學習而且速度更快。

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

    image


    2. FastText原理

    fastText方法包含三部分,模型架構,層次SoftMax和N-gram子詞特徵

    2.1 模型架構

    fastText的架構和word2vec中的CBOW的架構類似,因為它們的作者都是Facebook的科學家Tomas Mikolov,而且確實fastText也算是word2vec所衍生出來的。

    • CBOW的架構:輸入的是個詞,經過隱藏層後,輸出的是x_1,x_2,...,x_{N-1},x_N表示一個文字中的n-gram向量,每個特徵是詞向量的平均值。這和前文中提到的cbow相似,cbow用上下文去預測中心詞,而此處用全部的n-gram去預測指定類別。

    image

    2.2 層次SoftMax

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

    fastText 也利用了類別(class)不均衡這個事實(一些類別出現次數比其他的更多),通過使用 Huffman 演算法建立用於表徵類別的樹形結構。因此,頻繁出現類別的樹形結構的深度要比不頻繁出現類別的樹形結構的深度要小,這也使得進一步的計算效率更高。

    image

    2.3 N-gram子詞特徵

    fastText 可以用於文字分類和句子分類。不管是文字分類還是句子分類,我們常用的特徵是詞袋模型。但詞袋模型不能考慮詞之間的順序,因此 fastText 還加入了 N-gram 特徵。在 fasttext 中,每個詞被看做是 n-gram字母串包。為了區分前後綴情況,"<", ">"符號被加到了詞的前後端。除了詞的子串外,詞本身也被包含進了 n-gram字母串包。以 where 為例,n=3n=3 的情況下,其子串分別為
    <wh, whe, her, ere, re>,以及其本身


    3. fastText和word2vec的區別

    • 相似處:
    1. 圖模型結構很像,都是採用embedding向量的形式,得到word的隱向量表達。
    2. 都採用很多相似的優化方法,比如使用Hierarchical softmax優化訓練和預測中的打分速度。
    • 不同處:
    1. 模型的輸出層:word2vec的輸出層,對應的是每一個term,計算某term的概率最大;而fasttext的輸出層對應的是分類的label。不過不管輸出層對應的是什麼內容,起對應的vector都不會被保留和使用。
    2. 模型的輸入層:word2vec的輸出層,是 context window 內的term;而fasttext 對應的整個sentence的內容,包括term,也包括 n-gram的內容。
    • 兩者本質的不同,體現在 h-softmax的使用:
    1. Word2vec的目的是得到詞向量,該詞向量 最終是在輸入層得到,輸出層對應的 h-softmax
      也會生成一系列的向量,但最終都被拋棄,不會使用。
    2. fastText則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label(一個或者N個)

    4. 總結

    fastText是一個能用淺層網路取得和深度網路相媲美的精度,並且分類速度極快的演算法。按照作者的說法“在標準的多核CPU上,能夠訓練10億詞級別語料庫的詞向量在10分鐘之內,能夠分類有著30萬多類別的50多萬句子在1分鐘之內”。但是它也有自己的使用條件,它適合類別特別多的分類問題,如果類別比較少,容易過擬合。