【NLP】NLP重铸篇之Fasttext
論文標(biāo)題:Bag of Tricks for Efficient Text Classification
論文鏈接:https://arxiv.org/pdf/1607.01759.pdf
代碼地址:https://github.com/facebookresearch/fastText
復(fù)現(xiàn)代碼地址:https://github.com/wellinxu/nlp_store/blob/master/papers/fasttext.py
論文標(biāo)題:Enriching Word Vectors with Subword Information
論文鏈接:https://arxiv.org/pdf/1607.04606.pdf
代碼地址:https://github.com/facebookresearch/fastText
復(fù)現(xiàn)代碼地址:https://github.com/wellinxu/nlp_store/blob/master/papers/fasttext.py
fasttext主要有兩個(gè)模型,一個(gè)是【Bag of Tricks for Efficient Text Classification】提出的文本分類(lèi)模型,一個(gè)是【Enriching Word Vectors with Subword Information】提出的文本表示模型,其結(jié)構(gòu)跟word2vec非常相似,最大區(qū)別是,分類(lèi)模型添加了詞粒度的ngram特征,表示模型添加了字符粒度的ngram特征(subword特征)。本文會(huì)分別介紹fasttext的分類(lèi)與表示模型,并復(fù)現(xiàn)相關(guān)代碼,具體可查看https://github.com/wellinxu/nlp_store。
fasttext
文本分類(lèi)
模型結(jié)構(gòu)
ngram特征
論文結(jié)果
文本表示
模型結(jié)構(gòu)
subword特征
論文結(jié)果
fasttext與word2vec結(jié)果比較
參考
fasttext
fasttext是facebook在2016年左右提出的模型,在相關(guān)代碼里面,主要包含了兩個(gè)模型:文本分類(lèi)模型和文本表示模型,因?yàn)閮蓚€(gè)模型都在同一個(gè)代碼包里,所以都被大家稱(chēng)為fasttext模型。根據(jù)原始論文來(lái)看,fasttext的文本分類(lèi)模型就是word2vec中的cbow+huffman樹(shù)的結(jié)構(gòu),區(qū)別在于添加了詞級(jí)別的ngram特征(并對(duì)ngram特征做了hash處理)并且預(yù)測(cè)的標(biāo)簽是具體的類(lèi)別;而fasttext的文本表示模型就是word2vec中的skip-gram+負(fù)采樣的結(jié)構(gòu),區(qū)別在于添加了字符級(jí)別的ngram特征(即subword,也進(jìn)行了hash處理)。因?yàn)閒asttext與word2vec模型非常相似,所以建議先看【NLP重鑄篇之Word2vec】。
文本分類(lèi)
【Bag of Tricks for Efficient Text Classification】論文中提出了一種文本分類(lèi)模型fasttext,可以作為一種高效的文本分類(lèi)基準(zhǔn),其精度較高,且速度飛快,使用標(biāo)準(zhǔn)的多核CPU,可以在10分鐘內(nèi)訓(xùn)練包含10億詞的文本,在一分鐘內(nèi)可以對(duì)包含30多萬(wàn)類(lèi)別的500萬(wàn)句文本進(jìn)行分類(lèi)(復(fù)現(xiàn)代碼的速度則遠(yuǎn)遠(yuǎn)不如,原代碼在工程上做了很多優(yōu)化)。
模型結(jié)構(gòu)
如上圖所示,與word2vec的CBOW結(jié)構(gòu)類(lèi)似,特征輸入模型后,直接進(jìn)行求和(或平均)然后就輸出預(yù)測(cè)模型,為了提高運(yùn)算速度,當(dāng)類(lèi)別比較多的時(shí)候,fasttext文本分類(lèi)模型也采用了層次softmax的方法,具體的也是使用的huffman樹(shù)的形式。更多關(guān)于COBW結(jié)構(gòu)與huffman樹(shù)的loss計(jì)算可參考【NLP重鑄篇之Word2vec】,這邊給出前向傳播相關(guān)代碼:
當(dāng)使用模型對(duì)文本進(jìn)行分類(lèi)的時(shí)候,層次softmax也有其優(yōu)點(diǎn)。
其中表示結(jié)點(diǎn),是的父結(jié)點(diǎn)。
如上計(jì)算公式,每個(gè)結(jié)點(diǎn)的概率,都是根結(jié)點(diǎn)到當(dāng)前結(jié)點(diǎn)路徑上所有結(jié)點(diǎn)的概率乘積,這也就導(dǎo)致了每個(gè)結(jié)點(diǎn)的概率,一定小于其父結(jié)點(diǎn)的概率,那選擇最優(yōu)類(lèi)別的時(shí)候,通過(guò)深度優(yōu)先遍歷,計(jì)算葉子結(jié)點(diǎn)概率,并保存最大概率,在遍歷過(guò)程中可以丟棄概率小于當(dāng)前最大概率的分支?;诖?#xff0c;模型的預(yù)測(cè)代碼為:
ngram特征
fasttext分類(lèi)模型與CBOW最大的不同,則是使用了ngram特征,CBOW丟棄了詞序特征,但如果精確地使用詞序特征會(huì)讓計(jì)算復(fù)雜度提高很多,所以fasttext中使用ngram特征作為附加特征來(lái)獲取局部詞序特征信息。具體的,分類(lèi)中的ngram特征是將連續(xù)n個(gè)詞作為一個(gè)特征添加到模型中,但是ngram的數(shù)量巨大,為了減少內(nèi)存消耗,模型使用hash技巧,將具有同樣hash值的ngram視為同一個(gè)特征。在復(fù)現(xiàn)過(guò)程中,為了簡(jiǎn)單,直接使用的python自帶的hash函數(shù),相關(guān)ngram特征獲取方式以及hash方式如下:
???def?_get_ngram(self,?alist,?is_train=True):#?獲取alist中包含的ngram特征result,?l?=?set(),?len(alist)for?n?in?self.ngram:for?i?in?range(l?-?n?+?1):w?=?"".join(alist[i:i?+?n])result.add(w)if?is_train:#?如果是訓(xùn)練階段,則將ngram特征添加到相應(yīng)map中if?self.is_embedding:self.ngram_num_map[w]?=?self.ngram_num_map.get(w,?0)?+?self.word_num_map[alist[1:-1]]else:self.ngram_num_map[w]?=?self.ngram_num_map.get(w,?0)?+?1return?resultdef?reduce_ngram_num_by_hash(self):#?如果ngram特征數(shù)量大于制定數(shù)量,則讓具有同樣hash值的ngram特征指向同一個(gè)表示向量for?w,?v?in?self.ngram_num_map.items():if?v?>=?self.min?and?w?not?in?self.ngram2id_map.keys():self.ngram2id_map[w]?=?len(self.ngram2id_map)?+?self.voc_sizeif?len(self.ngram2id_map)?>?self.ngram_num:idmap?=?{}for?w?in?self.ngram2id_map.keys():h?=?abs(hash(w))h?=?h?%?self.ngram_num????#?用hash值的最后幾位作為新hash值if?h?not?in?idmap.keys():idmap[h]?=?len(idmap)?+?self.voc_sizeself.ngram2id_map[w]?=?idmap[h]論文結(jié)果
如下面兩圖所示,fasttext在許多文本分類(lèi)任務(wù)上,都有不錯(cuò)的精度,且速度上會(huì)比其他模型快很多很多。下圖只顯示了添加了2gram特征的情況,論文中也有實(shí)驗(yàn),在Sogou等數(shù)據(jù)集上,使用3gram特征可以進(jìn)一步提高準(zhǔn)確性;同樣的,論文也實(shí)驗(yàn)了不同維度(下圖中特征是10維)對(duì)文本分類(lèi)效果的影響,一般來(lái)說(shuō),維度越大效果越好(論文中比較了200維跟50維的效果)。
文本表示
【Enriching Word Vectors with Subword Information】論文提出了一種文本表示模型fasttext。類(lèi)似wod2vec等模型,在學(xué)習(xí)詞表示的時(shí)候都忽略了詞的形態(tài)特征(如詞由哪些結(jié)構(gòu)組成),這就對(duì)那些詞匯量大和生僻詞多的語(yǔ)言不友好,也難以處理oov的詞語(yǔ)。而論文中提出的fasttext模型,則使用了subword特征(字符級(jí)別的ngram),每一個(gè)subword都會(huì)學(xué)一個(gè)表示,最終的詞向量,由該詞所有的subword向量的和來(lái)表示。
模型結(jié)構(gòu)
fasttext文本表示模型,是基于word2vec的skip-gram進(jìn)行擴(kuò)展,添加了subword特征。為了提高訓(xùn)練速度,模型也使用了負(fù)采樣的方式,根據(jù)之前文章【NLP重鑄篇之Word2vec】,負(fù)采樣的loss如下:
這是skip-gram結(jié)構(gòu)的負(fù)采樣loss,其中表示輸入向量,表示正樣本索引,表示負(fù)采樣的索引,表示索引為i的詞向量,表示索引為i的輸出參數(shù)向量,s是得分函數(shù)。
同樣的,更多關(guān)于skip-gram結(jié)構(gòu)與負(fù)采樣內(nèi)容,可參考【NLP重鑄篇之Word2vec】,下面給出前向傳播的代碼:
subword特征
每一個(gè)詞都可以被表示為一組字符級(jí)別的ngram集合,為了區(qū)分詞的開(kāi)頭和結(jié)尾,會(huì)在詞的前后添加"<"和">"兩個(gè)字符,同時(shí)也會(huì)將整個(gè)詞添加到ngram集合中去。舉個(gè)例子,如果詞為“自然語(yǔ)言”,n為3,此時(shí)字符ngram為:<自然、自然語(yǔ)、然語(yǔ)言、語(yǔ)言>、<自然語(yǔ)言>。需要注意的事,“<自然語(yǔ)言>”跟“自然語(yǔ)言”是兩個(gè)不同的token,前面是一個(gè)整詞,后面是一個(gè)詞中的4gram特征。添加了subword特征,改變了skip-gram的輸入(從一個(gè)變成多個(gè)),那得分函數(shù)也有所改變,如下:
其中表示詞w的字符ngram的索引集合,表示索引為g的向量表示,表示索引為c的輸出參數(shù)向量。跟分類(lèi)模型類(lèi)似,這里也會(huì)使用hash函數(shù),將具有同樣hash值的ngram特征用同一個(gè)向量表示。在訓(xùn)練完成后,每個(gè)詞的詞向量,則由該詞的所有ngram特征向量之和來(lái)表示,對(duì)于oov的詞,類(lèi)似的也用該詞存在的ngram向量之和表示。論文中,ngram的范圍是3-6。
subword的獲取方式以及hash方式與上面ngram一致,fasttext詞向量尤其是某些oov詞語(yǔ)向量的獲取方式如下:
論文結(jié)果
如上圖所示,論文對(duì)比了word2vec跟fasttext模型在各種語(yǔ)言上,人類(lèi)判斷跟模型計(jì)算的相似度得分的相關(guān)性,其中sg與cbow分別表示word2vec中的skip-gram與CBOW結(jié)構(gòu)的模型,sisg-與sisg都是fasttext模型,sisg-在處理oov詞的時(shí)候直接使用null的向量表示,sisg則使用該詞的ngram向量之和來(lái)表示,可看出sisg的結(jié)果基本都優(yōu)于其他結(jié)果,側(cè)面證明了subword帶來(lái)的有效信息。上圖的結(jié)果,則顯示了詞向量在不同語(yǔ)言上語(yǔ)義跟句法任務(wù)的準(zhǔn)確性,可以看出fasttext對(duì)大部分語(yǔ)言的句法任務(wù)都有顯著提升。
fasttext與word2vec結(jié)果比較
根據(jù)本文復(fù)現(xiàn)的fasttext文本表示模型,以及【NLP重鑄篇之Word2vec】中復(fù)現(xiàn)的word2vec模型,基于THUCNews文本分類(lèi)驗(yàn)證數(shù)據(jù)集cnews.val.txt的5000條文本進(jìn)行訓(xùn)練,得到的詞向量部分展示結(jié)果如下圖所示:
從上圖可以看出,fasttext的結(jié)果會(huì)偏向于具有相似的subword的詞,比如基金跟政策兩個(gè)詞的相似詞,fasttext的結(jié)果會(huì)偏向包含詞本身的結(jié)果,word2vec則不是;另外對(duì)于出現(xiàn)頻率較低的詞,但這個(gè)詞的subword出現(xiàn)頻率不低,則fasttext的效果略好,如上海大學(xué)這個(gè)詞;而對(duì)于oov的詞,word2vec是給不出結(jié)果的,fasttext則能給出相對(duì)還可以的結(jié)果,如南京大學(xué)這個(gè)詞。
參考
【1】基于tf2的word2vec模型復(fù)現(xiàn):https://github.com/wellinxu/nlp_store/blob/master/papers/word2vec.py
【2】基于tf2的fasttext模型復(fù)現(xiàn):https://github.com/wellinxu/nlp_store/blob/master/papers/fasttext.py
總結(jié)
以上是生活随笔為你收集整理的【NLP】NLP重铸篇之Fasttext的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【NLP】NLP文本风格迁移,秒变金庸风
- 下一篇: 【竞赛相关】Kaggle活跃竞赛(12月