這篇博客主要針對Bag of Tricks for Efficient Text Classification文章的一些理解。主要是介紹FastText算法是速度多塊,通過標籤預測和情感分析兩個任務來說明。
1. 模型的結構,文章中給出了這樣的圖
上圖註解中提到,x1,x2,,xN都是一個詞向量,那麼hidden是對N個詞的詞向量求平均,那麼具體怎麼計算呢?
這個圖不是非常直觀能看出如何計算的,文章中提到了結構和cbow很類似,於是找到了介紹word2vec的文章,見下圖
這裏說明幾點:
- V表示詞典的大小,即一個詞的embedding的長度
- C表示詞序列的長度
- W對每個詞是共享的,這點要注意
Hidden layer怎麼算呢? 文章中也給出公式了
x1,x2,xC均爲詞向量, V*1 , W是V*N維,N表示隱藏層的神經元的個數,所以h的結構爲N*V*V*1=N*1
對於FastText算法而言,隱藏層的平均同這裏是一致的;
2. 損失函數
- 最小化損失函數
- A就是input layer 到hidden layer的矩陣,也就是word2vec中的W
- B就是hidden layer 到 output layer的矩陣,也就是word2vec中的W‘
- 訓練中採用SGD ,學習率是線性衰減的
- 這裏的xn表示的第n個document的特徵集 ,N表示文檔的數量,yn表示標籤
3.層次SoftMax
如果要分的類是非常非常多的,比如cbow中,需要根據上下文的詞預測中間詞,中間詞的類別是巨大的,等同於詞典的數量,
所以word2vec中用到了softmax,那麼fasttext中也用到該技術
- 將所有的類別作爲二叉樹的葉子節點,共有V個類,那麼二叉樹的內部節點就有V-1個;(這種說法應該針對的是完全二叉樹)
- 對於每個葉子節點,都有唯一的從根節點到該葉子節點的路徑
- 葉子節點可以用路徑來替代
目標函數轉變爲:
- 要求的參數是,這個參數對於每個葉子節點也是共享的,其中n(w,j) 中 j表示到w葉子節點要走的第j步
- 這個東西看上去很複雜,實際意思就是走左邊的時候,取值爲1,走右邊,取值爲-1
- L(w) 就是走到w的長度,例如L(w2)爲4,實際走了三步,所以目標函數中 L(w) 需要 -1 =>>> L(w)-1
- 拿w2舉例,目標函數爲
- 採用對數似然,那麼目標函數就轉變爲
- 經過一些列推導,得到參數的更新
- 好處:訓練的時候,對於每個文本的分類,複雜度從O(V) 降低到O(logV),參數量由V個變爲V-1個
4. 一些實驗的結果
基於情感分析8個數據集
- 準確度上
fasttext 用了5個epoch,學習率的集合爲 0.05,0.1,0.2,0.5,如果用bigram,那麼準確率有1%-4%的提升,如果用trigrams,準確率可以達到97.1%
- 訓練時間上,下面是每個epoch的耗費的時間
參考:
https://arxiv.org/pdf/1607.01759.pdf Bag of Tricks for Efficient Text Classification
https://arxiv.org/pdf/1411.2738.pdf word2vec Parameter Learning Explained