一刁卜、GloVe模型
基于統(tǒng)計的詞向量模型以基于SVD分解技術(shù)的LSA模型為代表啤呼,通過構(gòu)建一個共現(xiàn)矩陣得到隱層的語義向量局服,充分利用了全局的統(tǒng)計信息磷仰。然而這類模型得到的語義向量往往很難把握詞與詞之間的線性關(guān)系(例如著名的King、Queen颁井、Man厅贪、Woman等式)。
基于預測的詞向量模型則以基于神經(jīng)網(wǎng)絡的Skip-gram模型為代表雅宾,通過預測一個詞出現(xiàn)在上下文里的概率得到embedding詞向量养涮。這類模型的缺陷在于其對統(tǒng)計信息的利用不充分,訓練時間與語料大小息息相關(guān)秀又。不過单寂,其得到的詞向量能夠較好地把握詞與詞之間的線性關(guān)系贬芥,因此在很多任務上的表現(xiàn)都要略優(yōu)于SVD模型吐辙。
既然兩種模型各有優(yōu)劣,那么能不能二者各取其長蘸劈,構(gòu)造一個更強大的詞向量模型呢昏苏?
在GloVe的原始論文里,作者首先分析了Skip-gram模型能夠挖掘出詞與詞之間線性關(guān)系的背后成因,然后通過在共現(xiàn)矩陣上構(gòu)造相似的條件贤惯,得到一個基于全局信息的詞向量模型——GloVe模型洼专。
1.1 統(tǒng)計共現(xiàn)矩陣
共出矩陣其實很容易理解,假設現(xiàn)在有共現(xiàn)矩陣為 X
孵构,則 X_i,j
的意義就是在整個語料庫中屁商,單詞 i
和單詞 j
共同出現(xiàn)在一個窗口中的次數(shù)。
例如有語料庫:i love you but you love him i am sad
這個小小的語料庫只有1個句子颈墅,涉及到7個單詞:i蜡镶、love、you恤筛、but官还、him、am毒坛、sad望伦。
如果我們采用一個窗口寬度為5(左右長度都為2)的統(tǒng)計窗口,那么就有以下窗口內(nèi)容:
以窗口5為例說明如何構(gòu)造共現(xiàn)矩陣:
中心詞為love煎殷,語境詞為but屯伞、you、him豪直、i愕掏,則:
使用窗口將整個語料庫遍歷一遍,即可得到共現(xiàn)矩陣X顶伞。
1.2 使用GloVe模型的原理
如果想利用全局的統(tǒng)計信息的話饵撑,那么必然需要將其納入到詞向量的訓練過程中,最直接的方法當然是構(gòu)建包含全局統(tǒng)計信息的損失函數(shù)唆貌。那么滑潘,該如何構(gòu)建呢?
首先我們考慮共現(xiàn)矩陣的信息能不能用另外的方式來表示锨咙,使得我們可以通過網(wǎng)絡學習语卤。
如上面的共現(xiàn)矩陣表示形式,表示了詞 k 和 詞 i 所在的上下文中出現(xiàn)的次數(shù)酪刀, 表示以詞i為中心的上下文的所有詞粹舵,那么我們就可以得到:
使用同樣的計算過程,我們可以得到單詞 k
出現(xiàn)在單詞 j
語境中的概率骂倘。通過將兩個概率相除眼滤,便可以得到如下結(jié)果:
通過研究最后一行的可以看出,這個比值很好地反應了詞之間的關(guān)系:
也就是說历涝,只要我們使用網(wǎng)絡诅需,讓其學習這個概率漾唉,那么最后學習得到的詞向量也就包含了共現(xiàn)矩陣的全局統(tǒng)計信息。
所以堰塌,現(xiàn)在的問題也就轉(zhuǎn)化成了如何用網(wǎng)絡或者說設計損失函數(shù)學習這一規(guī)律赵刑。
由這些信息直接構(gòu)建損失函數(shù)有點困難,那么干脆我們由果索因场刑,如果我們有這么一個網(wǎng)絡可以做到我們所設想的事情般此,那么它比如可以寫出如下的式子:
g函數(shù)就是我們的網(wǎng)絡,也就是說牵现,我們最后學到網(wǎng)絡必然應該使得上式盡可能成立恤煞。那么,最自然的想法就是用差值來衡量兩者的相近程度:
但這樣的包含3個單詞的損失函數(shù)是極難訓練的施籍,所以比如需要對g函數(shù)做一定的優(yōu)化居扒。
首先考慮的是 , 直接的關(guān)系,可以想象由于 和 之間的差異才會使得上述規(guī)律存在丑慎,那么網(wǎng)絡在學習用 喜喂、 和 作為輸入得到 時,必然會學習 , 之間的差異竿裂,那么我們直接先用式子表示出,之間的差異不就可以減少網(wǎng)絡學習的難度了嗎玉吁?
由于詞向量具有線性關(guān)系,也就是說向量空間是內(nèi)在的線性結(jié)構(gòu)腻异,所以表示 , 之間的差異最自然有效的方法就是做差进副。(PS:其實我覺得這邊做差其實也就是為了簡單,因為神經(jīng)網(wǎng)絡是一個很強的非線性模型悔常,所以其完全可以在學習過程中修正只是做差所帶來的差異影斑。也就是說,我們這邊做差只是幫網(wǎng)絡簡化了其學習過程机打,否則它可能還要試試更多的四則運算從而才能找到最后的結(jié)果矫户。與其這樣,不如我們直接就給出一個相對比較正確的差異表示方法残邀,從而節(jié)省一些沒必要的嘗試過程)
又因為考慮到 是一個標量皆辽,而 、和 都是向量芥挣,那么從向量到標量最直接的方法也就是點乘:
這樣我們也就表示出來g函數(shù)驱闷,但是仔細一看,這個損失函數(shù)還是很難訓練空免。那么接著考慮空另,我們可以看出 是一個除法結(jié)構(gòu),那么作為等式的另一邊鼓蜒,必然也應該可以表示成這樣的除法結(jié)構(gòu)痹换。于是考慮通過引入exp函數(shù)做到這樣的操作:
然后就發(fā)現(xiàn)找到簡化方法了:只需要讓上式分子對應相等,分母對應相等都弹。
通過觀察可以發(fā)現(xiàn)娇豫,分子分母的形式是相似的,也就是說我們完全可以通過統(tǒng)一的形式來學習:
注意:這邊下標表示替換了一下畅厢,與上面的表示方法并不相同冯痢,不要對號入座
通過對兩邊去對數(shù),我們可以將損失函數(shù)簡化成:
但仔細深究就會發(fā)現(xiàn)這個損失函數(shù)是有問題的框杜,由上述推導可以得到:
對于這樣的向量乘法來說浦楣,互換下標不會改變其最后的結(jié)果,但P互換則不相等咪辱。我們將展開可以得到:
我們發(fā)現(xiàn)前一項剛好下標互換不會改變結(jié)果振劳,那么我們可以學習這一項:
于是損失函數(shù)就變成了:
該損失函數(shù)的一個主要缺點為它認為所有的共現(xiàn)詞權(quán)重相等,即使很少出現(xiàn)或沒有出現(xiàn)的詞油狂,所以為了克服這一缺點历恐,使用了加權(quán)最小二乘回歸模型。也就是說基于出現(xiàn)頻率越高的詞對其權(quán)重應該越大的原則专筷,在損失函數(shù)中添加權(quán)重項弱贼,于是代價函數(shù)進一步完善:
具體權(quán)重函數(shù)應該是怎么樣的呢?
首先應該是非減的磷蛹,其次當詞頻過高時吮旅,權(quán)重不應過分增大,作者通過實驗確定權(quán)重函數(shù)為:
二味咳、fastText 模型
寫在前面的話:fastText的分類模型和詞向量訓練模型是不一樣的庇勃,網(wǎng)上很多博客把分類模型作為詞向量訓練模型來講(PS:本人就被誤導得很慘,幸好及時發(fā)現(xiàn))
2.1 基本原理
fastText的詞向量訓練模型并不復雜槽驶,就是在原來的word2vec上加入的子詞信息匪凉,理解了子詞,基本上fastText的詞向量訓練模型就掌握了捺檬。(子詞其實在后面的詞向量模型和NLP預訓練模型中都有用到)
什么是子詞呢再层?例如對于where這個詞,如果我們對這一個詞使用n-gram模型堡纬,那么若n為3時聂受,我們可以得到<wh, whe, her, ere, re>(fasttext模型中會對一次詞添加上<
和>
符號,也就是說原來的where這個詞在fastText的表示中會變成<where>的形式)烤镐。另外蛋济,其實還會再加上整個詞<where>作為一個特殊的子詞。也就是說炮叶,在訓練詞向量的時候碗旅,每一個詞都會變成一個子詞集合加入訓練渡处,而不是原來單詞的一個詞。最后在表示一個詞的詞向量時祟辟,通過將子詞向量直接加和即可得到詞向量医瘫。
其訓練過程基本和之前的word2vec一致,雖然同樣可以采用cbow和skip-gram兩種方式旧困,但官方提到在實踐過程中skip-gram模型對于子詞信息的處理比cbow更好:
但是對每個詞都加入其子詞信息會導致所需資源過多醇份,為了有效地減小子詞規(guī)模,fastText使用hash映射的方法吼具,這也是一種常用的trick僚纷,這里就不展開介紹了,有興趣可以參考:Hash Trick
2.2 子詞
fastText的詞向量訓練模型和傳統(tǒng)word2vec模型最大的不同就是在子詞的引入上拗盒,那么子詞信息的引入可以帶來什么優(yōu)勢呢怖竭?
首先,自然是對詞的結(jié)構(gòu)的學習陡蝇∏肿矗考慮到詞根、詞形等特殊結(jié)構(gòu)毅整,如果和傳統(tǒng)的word2vec一樣只將詞作為一個整體來學習趣兄,那么就很容易丟失掉這些信息,這是相當可惜的悼嫉。另外艇潭,由于是通過對一個詞使用n-gram模型得到子詞之后再得到的詞向量,所以若在實際使用中出現(xiàn)一個從未出現(xiàn)過的詞戏蔑,便可通過這個新詞的子詞組合來獲得詞向量蹋凝。
參考:
- CS224n筆記3 高級詞向量表示
- http://www.ijiandao.com/2b/baijia/89997.html
- https://blog.csdn.net/sinat_26917383/article/details/54847240
- http://www.reibang.com/p/2acc49549af6
- glove 學習筆記
- word2vec以及GloVe總結(jié)
- https://www.cnblogs.com/iloveai/p/cs224d-lecture3-note.html
- https://fasttext.cc/docs/en/unsupervised-tutorial.html
- 論文:Enriching Word Vectors with Subword Information