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

1. 什麼是fastText

英語單詞一般有其內部結構和造成⽅式。例如,咱們能夠從「dog」「dogs」和「dogcatcher」的字⾯上推測它們的關係。這些詞都有同⼀個詞根「dog」,但使⽤不一樣的後綴來改變詞的含義。並且,這個關聯能夠推⼴⾄其餘詞彙。git

在word2vec中,咱們並無直接利⽤構詞學中的信息。⽆論是在跳字模型仍是連續詞袋模型中,咱們都將形態不一樣的單詞⽤不一樣的向量來表⽰。例如,「dog」和「dogs」分別⽤兩個不一樣的向量表⽰,而模型中並未直接表達這兩個向量之間的關係。鑑於此,fastText提出了⼦詞嵌⼊(subword embedding)的⽅法,從而試圖將構詞信息引⼊word2vec中的CBOW。github

這裏有一點須要特別注意,通常狀況下,使用fastText進行文本分類的同時也會產生詞的embedding,即embedding是fastText分類的產物。除非你決定使用預訓練的embedding來訓練fastText分類模型,這另當別論。面試

2. n-gram表示單詞

word2vec把語料庫中的每一個單詞當成原子的,它會爲每一個單詞生成一個向量。這忽略了單詞內部的形態特徵,好比:「book」 和「books」,「阿里巴巴」和「阿里」,這兩個例子中,兩個單詞都有較多公共字符,即它們的內部形態相似,可是在傳統的word2vec中,這種單詞內部形態信息由於它們被轉換成不一樣的id丟失了。架構

**爲了克服這個問題,fastText使用了字符級別的n-grams來表示一個單詞。**對於單詞「book」,假設n的取值爲3,則它的trigram有:app

「<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. 代碼實現

清華文本分類數據集下載:thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zi…

新聞文本分類代碼

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

3.png

8. 參考文獻

fastText原理及實踐


做者:@mantchs

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

歡迎你們加入討論!共同完善此項目!羣號:【541954936】NLP面試學習羣

相關文章
相關標籤/搜索