1. 程式人生 > >NLP系列文章:子詞嵌入(fastText)的理解!(附程式碼)

NLP系列文章:子詞嵌入(fastText)的理解!(附程式碼)

1. 什麼是fastText

英語單詞通常有其內部結構和形成⽅式。例如,我們可以從“dog”“dogs”和“dogcatcher”的字⾯上推測它們的關係。這些詞都有同⼀個詞根“dog”,但使⽤不同的字尾來改變詞的含義。而且,這個關聯可以推⼴⾄其他詞彙。

在word2vec中,我們並沒有直接利⽤構詞學中的資訊。⽆論是在跳字模型還是連續詞袋模型中,我們都將形態不同的單詞⽤不同的向量來表⽰。例如,“dog”和“dogs”分別⽤兩個不同的向量表⽰,而模型中並未直接表達這兩個向量之間的關係。鑑於此,fastText提出了⼦詞嵌⼊(subword embedding)的⽅法,從而試圖將構詞資訊引⼊word2vec中的CBOW。

這裡有一點需要特別注意,一般情況下,使用fastText進行文字分類的同時也會產生詞的embedding,即embedding是fastText分類的產物。除非你決定使用預訓練的embedding來訓練fastText分類模型,這另當別論。

2. n-gram表示單詞

word2vec把語料庫中的每個單詞當成原子的,它會為每個單詞生成一個向量。這忽略了單詞內部的形態特徵,比如:“book” 和“books”,“阿里巴巴”和“阿里”,這兩個例子中,兩個單詞都有較多公共字元,即它們的內部形態類似,但是在傳統的word2vec中,這種單詞內部形態資訊因為它們被轉換成不同的id丟失了。

為了克服這個問題,fastText使用了字元級別的n-grams來表示一個單詞。對於單詞“book”,假設n的取值為3,則它的trigram有:

“<bo”, “boo”, “ook”, “ok>”

其中,<表示字首,>表示字尾。於是,我們可以用這些trigram來表示“book”這個單詞,進一步,我們可以用這4個trigram的向量疊加來表示“apple”的詞向量。

這帶來兩點好處:

  1. 對於低頻詞生成的詞向量效果會更好。因為它們的n-gram可以和其它詞共享。
  2. 對於訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字元級n-gram向量。

3. fastText模型架構

之前提到過,fastText模型架構和word2vec的CBOW模型架構非常相似。下面是fastText模型架構圖:

注意:此架構圖沒有展示詞向量的訓練過程。可以看到,和CBOW一樣,fastText模型也只有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。

不同的是,

  • CBOW的輸入是目標單詞的上下文,fastText的輸入是多個單詞及其n-gram特徵,這些特徵用來表示單個文件;
  • CBOW的輸入單詞被one-hot編碼過,fastText的輸入特徵是被embedding過;
  • CBOW的輸出是目標詞彙,fastText的輸出是文件對應的類標。

值得注意的是,fastText在輸入時,將單詞的字元級別的n-gram向量作為額外的特徵;在輸出時,fastText採用了分層Softmax,大大降低了模型訓練時間。這兩個知識點在前文中已經講過,這裡不再贅述。

fastText相關公式的推導和CBOW非常類似,這裡也不展開了。

4. fastText核心思想

現在拋開那些不是很討人喜歡的公式推導,來想一想fastText文字分類的核心思想是什麼?

仔細觀察模型的後半部分,即從隱含層輸出到輸出層輸出,會發現它就是一個softmax線性多類別分類器,分類器的輸入是一個用來表徵當前文件的向量;

模型的前半部分,即從輸入層輸入到隱含層輸出部分,主要在做一件事情:生成用來表徵文件的向量。那麼它是如何做的呢?疊加構成這篇文件的所有詞及n-gram的詞向量,然後取平均。疊加詞向量背後的思想就是傳統的詞袋法,即將文件看成一個由詞構成的集合。

於是fastText的核心思想就是:將整篇文件的詞及n-gram向量疊加平均得到文件向量,然後使用文件向量做softmax多分類。這中間涉及到兩個技巧:字元級n-gram特徵的引入以及分層Softmax分類。

5. 輸出分類的效果

還有個問題,就是為何fastText的分類效果常常不輸於傳統的非線性分類器?

假設我們有兩段文字:

肚子 餓了 我 要 吃飯

肚子 餓了 我 要 吃東西

這兩段文字意思幾乎一模一樣,如果要分類,肯定要分到同一個類中去。但在傳統的分類器中,用來表徵這兩段文字的向量可能差距非常大。傳統的文字分類中,你需要計算出每個詞的權重,比如TF-IDF值, “吃飯”和“吃東西” 算出的TF-IDF值相差可能會比較大,其它詞類似,於是,VSM(向量空間模型)中用來表徵這兩段文字的文字向量差別可能比較大。

但是fastText就不一樣了,它是用單詞的embedding疊加獲得的文件向量,詞向量的重要特點就是向量的距離可以用來衡量單詞間的語義相似程度,於是,在fastText模型中,這兩段文字的向量應該是非常相似的,於是,它們很大概率會被分到同一個類中。

使用詞embedding而非詞本身作為特徵,這是fastText效果好的一個原因;另一個原因就是字元級n-gram特徵的引入對分類效果會有一些提升 。

6. fastText與Word2Vec的不同

有意思的是,fastText和Word2Vec的作者是同一個人。

相同點:

  • 圖模型結構很像,都是採用embedding向量的形式,得到word的隱向量表達。
  • 都採用很多相似的優化方法,比如使用Hierarchical softmax優化訓練和預測中的打分速度。

之前一直不明白fasttext用層次softmax時葉子節點是啥,CBOW很清楚,它的葉子節點是詞和詞頻,後來看了原始碼才知道,其實fasttext葉子節點裡是類標和類標的頻數。

Word2Vec fastText
輸入 one-hot形式的單詞的向量 embedding過的單詞的詞向量和n-gram向量
輸出 對應的是每一個term,計算某term概率最大 對應的是分類的標籤。

本質不同,體現在softmax的使用:

word2vec的目的是得到詞向量,該詞向量最終是在輸入層得到的,輸出層對應的h-softmax也會生成一系列的向量,但是最終都被拋棄,不會使用。

fastText則充分利用了h-softmax的分類功能,遍歷分類樹的所有葉節點,找到概率最大的label

fastText優點:

  1. 適合大型資料+高效的訓練速度:能夠訓練模型“在使用標準多核CPU的情況下10分鐘內處理超過10億個詞彙”
  2. 支援多語言表達:利用其語言形態結構,fastText能夠被設計用來支援包括英語、德語、西班牙語、法語以及捷克語等多種語言。FastText的效能要比時下流行的word2vec工具明顯好上不少,也比其他目前最先進的詞態詞彙表徵要好。
  3. 專注於文字分類,在許多標準問題上實現當下最好的表現(例如文字傾向性分析或標籤預測)。

7. 程式碼實現

清華文字分類資料集下載:https://thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zip

新聞文字分類程式碼

【機器學習通俗易懂系列文章】

8. 參考文獻

fastText原理及實踐


作者:@mantchs

GitHub:https://github.com/NLP-LOVE/ML-NLP

歡迎大家加入討論!共同完善此專案!群號:【541954936】