英語單詞一般有其內部結構和造成⽅式。例如,咱們能夠從「dog」「dogs」和「dogcatcher」的字⾯上推測它們的關係。這些詞都有同⼀個詞根「dog」,但使⽤不一樣的後綴來改變詞的含義。並且,這個關聯能夠推⼴⾄其餘詞彙。git
在word2vec中,咱們並無直接利⽤構詞學中的信息。⽆論是在跳字模型仍是連續詞袋模型中,咱們都將形態不一樣的單詞⽤不一樣的向量來表⽰。例如,「dog」和「dogs」分別⽤兩個不一樣的向量表⽰,而模型中並未直接表達這兩個向量之間的關係。鑑於此,fastText提出了⼦詞嵌⼊(subword embedding)的⽅法,從而試圖將構詞信息引⼊word2vec中的CBOW。github
這裏有一點須要特別注意,通常狀況下,使用fastText進行文本分類的同時也會產生詞的embedding,即embedding是fastText分類的產物。除非你決定使用預訓練的embedding來訓練fastText分類模型,這另當別論。面試
word2vec把語料庫中的每一個單詞當成原子的,它會爲每一個單詞生成一個向量。這忽略了單詞內部的形態特徵,好比:「book」 和「books」,「阿里巴巴」和「阿里」,這兩個例子中,兩個單詞都有較多公共字符,即它們的內部形態相似,可是在傳統的word2vec中,這種單詞內部形態信息由於它們被轉換成不一樣的id丟失了。架構
**爲了克服這個問題,fastText使用了字符級別的n-grams來表示一個單詞。**對於單詞「book」,假設n的取值爲3,則它的trigram有:app
「<bo」, 「boo」, 「ook」, 「ok>」機器學習
其中,<表示前綴,>表示後綴。因而,咱們能夠用這些trigram來表示「book」這個單詞,進一步,咱們能夠用這4個trigram的向量疊加來表示「apple」的詞向量。工具
這帶來兩點好處:性能
以前提到過,fastText模型架構和word2vec的CBOW模型架構很是類似。下面是fastText模型架構圖:學習
注意:此架構圖沒有展現詞向量的訓練過程。能夠看到,和CBOW同樣,fastText模型也只有三層:輸入層、隱含層、輸出層(Hierarchical Softmax),輸入都是多個經向量表示的單詞,輸出都是一個特定的target,隱含層都是對多個詞向量的疊加平均。優化
不一樣的是,
**值得注意的是,fastText在輸入時,將單詞的字符級別的n-gram向量做爲額外的特徵;在輸出時,fastText採用了分層Softmax,大大下降了模型訓練時間。**這兩個知識點在前文中已經講過,這裏再也不贅述。
fastText相關公式的推導和CBOW很是相似,這裏也不展開了。
如今拋開那些不是很討人喜歡的公式推導,來想想fastText文本分類的核心思想是什麼?
仔細觀察模型的後半部分,即從隱含層輸出到輸出層輸出,會發現它就是一個softmax線性多類別分類器,分類器的輸入是一個用來表徵當前文檔的向量;
模型的前半部分,即從輸入層輸入到隱含層輸出部分,主要在作一件事情:生成用來表徵文檔的向量。那麼它是如何作的呢?**疊加構成這篇文檔的全部詞及n-gram的詞向量,而後取平均。**疊加詞向量背後的思想就是傳統的詞袋法,即將文檔當作一個由詞構成的集合。
**因而fastText的核心思想就是:將整篇文檔的詞及n-gram向量疊加平均獲得文檔向量,而後使用文檔向量作softmax多分類。**這中間涉及到兩個技巧:字符級n-gram特徵的引入以及分層Softmax分類。
還有個問題,就是爲什麼fastText的分類效果經常不輸於傳統的非線性分類器?
假設咱們有兩段文本:
肚子 餓了 我 要 吃飯
肚子 餓了 我 要 吃東西
這兩段文本意思幾乎如出一轍,若是要分類,確定要分到同一個類中去。但在傳統的分類器中,用來表徵這兩段文本的向量可能差距很是大。傳統的文本分類中,你須要計算出每一個詞的權重,好比TF-IDF值, 「吃飯」和「吃東西」 算出的TF-IDF值相差可能會比較大,其它詞相似,因而,VSM(向量空間模型)中用來表徵這兩段文本的文本向量差異可能比較大。
可是fastText就不同了,它是用單詞的embedding疊加得到的文檔向量,詞向量的重要特色就是向量的距離能夠用來衡量單詞間的語義類似程度,因而,在fastText模型中,這兩段文本的向量應該是很是類似的,因而,它們很大機率會被分到同一個類中。
使用詞embedding而非詞自己做爲特徵,這是fastText效果好的一個緣由;另外一個緣由就是字符級n-gram特徵的引入對分類效果會有一些提高 。
有意思的是,fastText和Word2Vec的做者是同一我的。
相同點:
以前一直不明白fasttext用層次softmax時葉子節點是啥,CBOW很清楚,它的葉子節點是詞和詞頻,後來看了源碼才知道,其實fasttext葉子節點裏是類標和類標的頻數。
Word2Vec | fastText | |
---|---|---|
輸入 | one-hot形式的單詞的向量 | embedding過的單詞的詞向量和n-gram向量 |
輸出 | 對應的是每個term,計算某term機率最大 | 對應的是分類的標籤。 |
本質不一樣,體如今softmax的使用:
word2vec的目的是獲得詞向量,該詞向量最終是在輸入層獲得的,輸出層對應的h-softmax也會生成一系列的向量,可是最終都被拋棄,不會使用。
fastText則充分利用了h-softmax的分類功能,遍歷分類樹的全部葉節點,找到機率最大的label
fastText優勢:
清華文本分類數據集下載:thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zi…
做者:@mantchs
GitHub:github.com/NLP-LOVE/ML…