【2019斯坦福CS224N筆記】(2)詞向量的優(yōu)化與評(píng)價(jià)
[toc]
寫在前面
在【2019斯坦福CS224N筆記】(1)中牡昆,我們介紹了計(jì)算機(jī)是如何表示單詞的語(yǔ)義攒霹,以及重點(diǎn)講解了word2vec方法及其梯度下降的推導(dǎo)菇存,但是其中還存在一些問題灌诅,需要進(jìn)行優(yōu)化。本節(jié)我們將介紹一些關(guān)于word2vec的優(yōu)化方法及詞向量的評(píng)價(jià)方式停做。
本節(jié)的主要內(nèi)容包括:
- word2vec的優(yōu)化
- word2vec的一些表示方法
- 如何評(píng)價(jià)詞向量
一钳踊、word2vec的優(yōu)化
1.復(fù)習(xí):word2vec的主要思想:
word2vec算法一般可分為CBOW和Skip-Grams兩種模型衷敌。我們?nèi)绻ㄟ^上下文來預(yù)測(cè)中心的詞是什么,這樣的方法叫做Continuous Bag of Words(CBOW)拓瞪。反之缴罗,我們?nèi)羰窍胍ㄟ^中心詞來預(yù)測(cè)上下文的詞,這樣的方法叫Skip-grams祭埂,本文講的是第二種方法面氓,其主要思路為:
- 遍歷整個(gè)語(yǔ)料庫(kù)中的每個(gè)單詞
- 每個(gè)單詞用分別用中心詞和上下文詞向量表示
- 更新參數(shù)以使目標(biāo)函數(shù)最小化
順便說一下,為什么我們要用兩個(gè)向量表示一個(gè)單詞蛆橡?答案很簡(jiǎn)單舌界,因?yàn)閮蓚€(gè)向量更容易我們表示單詞,因?yàn)橥粋€(gè)單詞泰演,它既可能作為中心詞呻拌,也可能是別的單詞的上下文詞。你可以通過平均兩個(gè)向量來得到最后的一個(gè)向量睦焕,也可以求和藐握,拼接等等。
那么垃喊,Word2vec中的參數(shù)是如何計(jì)算呢猾普?如圖:
- 首先,我們需要注意在TensorFlow本谜、Pytorch等一些框架中初家,單詞向量表示為行 。U耕突、V兩個(gè)矩陣都有六個(gè)單詞笤成,每個(gè)單詞有一個(gè)五維向量评架。其中U為每個(gè)單詞作為上下文詞時(shí)的表示向量眷茁,V為每個(gè)單詞作為中心詞時(shí)的表示向量
- 對(duì)U,v4Tv_4^Tv4T做點(diǎn)積運(yùn)算纵诞,其中v_4是V矩陣中的一個(gè)行向量上祈。
- 最后對(duì)上一步的每一個(gè)數(shù)字上,做softmax,這就會(huì)得到上下文中單詞的概率分布
我們?cè)賮砗?jiǎn)單回顧一下梯度下降算法:
- 我們最小化目標(biāo)函數(shù):J
- 而梯度下降是一種最小化J的算法
- 思想:對(duì)于當(dāng)前θ值登刺,計(jì)算J的值籽腕,然后在負(fù)梯度的方向上邁步
- 更新方程(以矩陣表示)
- 新方程(對(duì)于單個(gè)參數(shù))
- 算法
但是,隨機(jī)梯度下降算法存在一個(gè)很大問題纸俭。即目標(biāo)函數(shù)中的每個(gè)向量皇耗,是語(yǔ)料庫(kù)中所有窗口的函數(shù)(數(shù)以億計(jì)),所以計(jì)算J(θ)的梯度非常耗費(fèi)資源揍很,您需要等待很長(zhǎng)時(shí)間才能進(jìn)行一次更新郎楼,對(duì)于幾乎所有的神經(jīng)網(wǎng)絡(luò)來說,這是一個(gè)非常糟糕的方法窒悔。所以我們提出了用隨機(jī)梯度下降算法進(jìn)行優(yōu)化呜袁。
2.隨機(jī)梯度下降
隨機(jī)梯度下降算法(Stochastic gradient descent,SGD)简珠,我們只取了一個(gè)采樣窗口阶界,在實(shí)踐中,我們采用一個(gè)small batch,一般為32或者64的batch聋庵,用小批量計(jì)算梯度膘融。這樣做有兩個(gè)優(yōu)點(diǎn),一個(gè)是可以減少噪音估計(jì)祭玉。第二個(gè)原因托启,如果我們?cè)谑褂肎PU時(shí)希望計(jì)算速度快,需要得到一大堆相同的操作并行化攘宙。因此屯耸,如果你使用32或64等批次,你可以獲得更好的加速蹭劈。而不是用42或者別的數(shù)字疗绣,只因?yàn)樗悄阕钕矚g的數(shù)字。
隨機(jī)梯度下降算法:
- 隨機(jī)梯度下降與詞向量:迭代地在每個(gè)這樣的窗口為SGD取梯度铺韧,但是在每個(gè)窗口中多矮,我們最多只有2m + 1個(gè)單詞,所以?θJt(θ)\nabla_\theta J_t(\theta)?θJt(θ)非常稀疏(會(huì)有很多的0元素)哈打,我們只能更新出樣本中出現(xiàn)的向量塔逃,如圖:
3.negative sampling
為什么提出負(fù)樣本這個(gè)概念?因?yàn)闅w一化時(shí)料仗,分母的計(jì)算開銷太大湾盗。如下圖。因此立轧,在標(biāo)準(zhǔn)word2vec中格粪,使用負(fù)抽樣實(shí)現(xiàn)skip gram模型躏吊,我們以前是研究一個(gè)多分類問題:給定一個(gè)單詞,預(yù)測(cè)其周圍的單詞可能是N個(gè)中的哪一個(gè)(N為字典的長(zhǎng)度)帐萎。而負(fù)采樣算法將問題變?yōu)榱?strong>二分類:給定兩個(gè)詞比伏,預(yù)測(cè)這兩個(gè)詞是否應(yīng)該挨在一起。
我們令x為第一個(gè)詞o的U詞向量和第二個(gè)詞c的V詞向量的乘積疆导,即x = Uo * Vc采用sigmoid函數(shù)來得到概率分布赁项。如果這兩個(gè)詞應(yīng)該挨在一起,比如“我”澈段,“是”這兩個(gè)詞挨在一起的概率很大肤舞,組合可以是“我是個(gè)好人”。那么x = Uo * Vc后均蜜,我們希望x是一個(gè)很大的整數(shù)李剖。若兩個(gè)詞毫無(wú)關(guān)聯(lián),如“螞蟻”囤耳,“木星”篙顺,我們希望x是一個(gè)絕對(duì)值很大的負(fù)數(shù)。我們使用sigmoid函數(shù)可以將x的取值縮放到0-1之間充择。我們用σ(x)來表示兩個(gè)詞是否應(yīng)該挨在一起的概率德玫。
主要思想(該思路來源于論文:“Distributed Representations of Words and Phrases and their Compositionality” (Mikolov et al. 2013)):**對(duì)分子進(jìn)行改變。**即椎麦,想要將實(shí)際觀察到的單詞概率更大化宰僧。訓(xùn)練一個(gè)真詞對(duì)(中心詞及其上下文窗口中的詞)與隨機(jī)采樣幾個(gè)噪聲對(duì)(一般不超過15個(gè),使中心詞與隨機(jī)詞搭配,盡量給它們盡可能低的概率)
該論文提出的整體目標(biāo)函數(shù)(使其最大化)如下圖:
下圖是改進(jìn)后的新目標(biāo)函數(shù):
- 取k個(gè)負(fù)樣本观挎,例如:10琴儿,15個(gè),使真實(shí)的上下文單詞出現(xiàn)的概率最大化嘁捷,加負(fù)號(hào)后造成,相當(dāng)于使問題最小化。
- 使用unigram分布來挑選負(fù)樣本詞雄嚣,其中晒屎,分母Z是用于歸一化,以使所有的詞被選取的概率和等于一缓升,即∑p(w)=1鼓鲁。通過這種方式,減少你采樣中非常常見的單詞港谊,使頻率較低的單詞(稀有詞)被更頻繁地采樣
- 需要注意骇吭,窗口的大小我們作為一個(gè)超參數(shù)(一般為2-10),進(jìn)行調(diào)試封锉,嘗試幾個(gè)數(shù)字绵跷,來看看實(shí)際效果,這里并沒有什么科學(xué)依據(jù)成福。這里3/4其實(shí)也是一個(gè)超參數(shù)碾局。
unigram分布如下圖所示:
接下來我們來簡(jiǎn)單總結(jié)一下詞向量的表示方法
二、基于統(tǒng)計(jì)的一些詞向量表示方法
1.HAL算法(Hyperspace Analogue to Language method)
與word2vec類似奴艾,在每個(gè)單詞周圍使用窗口净当,同時(shí)包含語(yǔ)法(POS)和語(yǔ)義信息。例子(基于窗口的共現(xiàn)矩陣):
- 窗口長(zhǎng)度1(更常見:5-10)
- 對(duì)稱的(與左右上下文無(wú)關(guān))
- 語(yǔ)料庫(kù)示例:I like deep learning.I like NLP.I enjoy flying.
該算法存在一些問題:
如果語(yǔ)料庫(kù)的詞匯量很大蕴潦,非常高維:需要很大的存儲(chǔ)空間
共現(xiàn)矩陣存在稀疏性問題像啼。
2.LSA算法(Latent Semantic Analysis)
為了解決上述問題,我們可以采用低維向量表示潭苞。主要思想:將“大多數(shù)”重要信息存儲(chǔ)在一個(gè)固定的忽冻、少量的維度中:一個(gè)密集的向量。通常是25-1000個(gè)維度此疹,類似于word2vec僧诚。如何降低維度?我們可以采用共現(xiàn)矩陣X的奇異值分解(對(duì)于任何矩陣,都可以做奇異值分解)蝗碎。因式分解X到UΣV^T, U和V是正交的湖笨。即 ,如下圖:
如圖,在將X分解為三個(gè)矩陣后蹦骑,我們舍棄圖中被框柱(這些部分存儲(chǔ)的信息不是很重要)慈省。之后我們將剩余的U、∑眠菇、V矩陣重新合并為X矩陣边败。新的X矩陣會(huì)比原來的矩陣小很多(根據(jù)舍棄U、∑捎废、V矩陣的比例而定)放闺,且保留的內(nèi)容都是十分重要的信息。
當(dāng)然缕坎,這里也有一些小的trick怖侦,比如說:
- the/he/has這里詞出現(xiàn)的次數(shù)太多了∶仗荆可以限制共現(xiàn)矩陣X中每個(gè)值最大取100匾寝,或者在矩陣X中刪除所有the/he/has這樣常見的詞。
- 計(jì)算次數(shù)時(shí)可以加權(quán)計(jì)算荷腊。離中心詞越近的詞權(quán)重越高艳悔,越遠(yuǎn)的詞權(quán)重越低。另外女仰,除了用SVD降維猜年,我們還可以使用PCA來實(shí)現(xiàn)降維抡锈。
三、基于神經(jīng)網(wǎng)絡(luò)方法
神經(jīng)網(wǎng)絡(luò)方法:我們將詞向量當(dāng)做神經(jīng)網(wǎng)絡(luò)中的一層(詞嵌入層)乔外。假設(shè)我們的詞典有N個(gè)詞床三,詞向量維度為D。那么我們輸入一個(gè)詞的one-hot編碼(X = [0, 0, 0, …, 1, … 0, 0]^T杨幼,大小為N * 1)撇簿,經(jīng)過詞嵌入層W(大小為N*D)之后,我們會(huì)得到該詞的詞向量(如X’ = [0.23, -0.49, 0.32, …, 0.48]差购,1 * D)四瘫。即一個(gè)詞的詞向量為:
此處詞嵌入W的取值,我們可以采用之前HAL欲逃、LSA找蜜、word2vec等算法得到的詞向量,也可以完全隨機(jī)初始化稳析。
只要我們的訓(xùn)練樣本足夠大锹杈,我們完全可以讓執(zhí)行某一NLP任務(wù)(如機(jī)器翻譯、閱讀理解迈着、文本分類等等)的神經(jīng)網(wǎng)絡(luò)的詞嵌入層隨機(jī)初始竭望,詞嵌入層會(huì)隨著神經(jīng)網(wǎng)絡(luò)的訓(xùn)練而不斷更新,直到收斂裕菠。在有海量訓(xùn)練數(shù)據(jù)的情況下咬清,隨著神經(jīng)網(wǎng)絡(luò)一起訓(xùn)練的詞向量往往學(xué)習(xí)到了詞與詞之間的相似性,以及捕獲了語(yǔ)法和語(yǔ)義的信息奴潘。關(guān)于如何用神經(jīng)網(wǎng)絡(luò)執(zhí)行NLP任務(wù)旧烧,我們將會(huì)在下一篇文章中講述。
迭代法:即針對(duì)某一個(gè)目標(biāo)函數(shù)画髓,通過不斷迭代掘剪,如梯度下降法或者隨機(jī)梯度下降算法使目標(biāo)函數(shù)不斷變小。當(dāng)目標(biāo)函數(shù)收斂至某一極小值時(shí)奈虾,我們選擇該過程的中間產(chǎn)物作為我們的詞向量夺谁。常見的算法有word2vec、Glove肉微。
基于計(jì)數(shù)的預(yù)測(cè)vs.直接預(yù)測(cè)的比較:
基于計(jì)數(shù)的算法訓(xùn)練速度相對(duì)較快匾鸥,且很好地利用了統(tǒng)計(jì)學(xué)的知識(shí)。但是這種算法只是捕捉到了詞與詞之間的相似度碉纳。
而使用直接預(yù)測(cè)的算法勿负,雖然能捕獲到詞語(yǔ)相似度以外更復(fù)雜的語(yǔ)義信息,使用此類算法得到的詞向量用于NLP任務(wù)時(shí)可以獲得更好的效果劳曹,但此類算法沒有很好地利用統(tǒng)計(jì)學(xué)知識(shí)奴愉,且訓(xùn)練時(shí)間一般較長(zhǎng)琅摩。
四、基于統(tǒng)計(jì)與預(yù)測(cè)相結(jié)合——Glove
我們可以結(jié)合兩種思想锭硼,通過控制共現(xiàn)概率與編碼意義之間的比率房资,從而有了Glove算法。
如上圖所示账忘,當(dāng)x取solid時(shí)志膀,ice(冰)周圍出現(xiàn)的概率很大熙宇,在steam(蒸汽)這個(gè)詞周圍出現(xiàn)的概率很小鳖擒。那么 P(x|ice)/P(x|steam)將會(huì)是一個(gè)很大的值,那就意味著x和ice關(guān)系極大烫止,和steam關(guān)系極小蒋荚。
在word2vec負(fù)采樣中,我們希望兩個(gè)詞的詞向量Uo * Vc很大代表詞o和詞c相鄰馆蠕,Uo * Vc很小代表詞o和詞c不相鄰期升。類比這個(gè)思想,在Glove中互躬,每個(gè)詞只有一個(gè)詞向量播赁,我們希望詞i和詞j的詞向量乘積可以代表詞i在詞j周圍出現(xiàn)的概率。
如上圖吼渡,glove中容为,每個(gè)詞只有一個(gè)詞向量,詞i和詞j的詞向量乘積代表詞i在詞j周圍出現(xiàn)的概率寺酪。Wx ( Wa – Wb )越大坎背,x與a有關(guān);越小寄雀,x與b有關(guān)得滤;取值適中,x可能與a和b都有關(guān)或都無(wú)關(guān)盒犹。
這里的P(x|a)是詞a周圍x出現(xiàn)的頻率懂更,是通過計(jì)數(shù)的方法來統(tǒng)計(jì)的,類似LSA算法急膀,需要計(jì)算共現(xiàn)矩陣
此外膜蛔,glove模型還有一個(gè)目標(biāo)函數(shù),此處就體現(xiàn)了預(yù)測(cè)算法的特點(diǎn):
上圖中w是詞向量脖阵,X是共現(xiàn)矩陣皂股,b是偏置(神經(jīng)網(wǎng)絡(luò)中很常見)。f(x)是一個(gè)人為規(guī)定的函數(shù)命黔,該函數(shù)如下圖呜呐【徒铮可近似為min(t,100),意義是降低常見的”the”蘑辑,”a” 這類詞的重要性,f函數(shù)限制了常見單詞對(duì)系統(tǒng)的影響洋机。glove模型即使使用小語(yǔ)料庫(kù)和小向量,性能也很好洋魂。
我們最小化上述目標(biāo)函數(shù)J绷旗,其意義是我們希望兩個(gè)詞向量的乘積可以代表著兩個(gè)詞共同出現(xiàn)的頻率。
五副砍、如何評(píng)詞向量衔肢?
與NLP的一般評(píng)估相關(guān):內(nèi)部與外部評(píng)價(jià)。
- 內(nèi)部評(píng)價(jià)是在一個(gè)中間任務(wù)上評(píng)價(jià)詞向量的好壞豁翎。該方法計(jì)算速度快角骤,能幫助我們更好地理解系統(tǒng)。但是在Intrinsic上表現(xiàn)好并不意味著詞向量在真實(shí)任務(wù)中會(huì)有好的效果心剥。
- 外部評(píng)價(jià)是在一個(gè)真正的NLP任務(wù)(如文本分類邦尊、機(jī)器翻譯)中使用詞向量,以此來評(píng)判詞向量的好壞优烧。但是計(jì)算Extrinsic任務(wù)會(huì)消耗很長(zhǎng)的時(shí)間蝉揍。即使Extrinsic任務(wù)出現(xiàn)了問題,我們也不清楚是詞向量的問題還是其他子系統(tǒng)的問題畦娄。
關(guān)于Intrinsic:
我們希望詞向量能捕獲語(yǔ)義和語(yǔ)法信息又沾。(語(yǔ)義如 男孩:女孩 = 男人:女人,語(yǔ)法則如 small:smaller = tall:taller)
比如詞向量可以知道“man”類比于“woman”就相當(dāng)于“king”類比于“queen”纷责;“eat”類比于“ate”就相當(dāng)于“drink”類比于“drunk”;“small”類比于“smaller”就相當(dāng)于“tall”類比于“taller”等等捍掺。
這樣的類比在詞向量中其實(shí)很簡(jiǎn)單,“woman”詞向量減去“man”詞向量近似于“king”詞向量減去“queen”詞向量即可再膳。就如下圖:
我們先人為規(guī)定幾百條挺勿、上千條這樣的類比規(guī)則。然后采用man:woman = king:?的方式喂柒,已知三個(gè)詞不瓶,求另一個(gè)詞。算法如下:
在詞向量應(yīng)用上圖算法得到另一個(gè)詞之后灾杰,我們對(duì)比詞向量得到的詞是否與我們?nèi)藶橐?guī)定的詞相符蚊丐。如man:woman = king:? 中,問號(hào)處應(yīng)該填queen艳吠。
我們統(tǒng)計(jì)其預(yù)測(cè)的正確率麦备,以此來代表詞向量的好壞。
不同算法(CBOW,Glove等)在不同詞向量維度上(100維凛篙、300維黍匾、1000維)以及不同訓(xùn)練文本大小(15億——42億)上訓(xùn)練的詞向量在某一個(gè)Intrinsic評(píng)價(jià)數(shù)據(jù)集上的結(jié)果。(Sem.代表語(yǔ)義得分呛梆,Syn.代表句法得分锐涯,Tot.代表總分)
上圖說明:
不同的詞向量訓(xùn)練算法的效果截然不同。
詞向量的效果隨著訓(xùn)練文本量的增加而增加填物。
不對(duì)稱上下文(只有左邊的單詞)就不那么好了
詞向量維度過低或過高時(shí)纹腌,在300維的時(shí)候,訓(xùn)練效果較好滞磺。(過低模型偏差大升薯,過高則模型方差大)
glove模型在Window size = 8 時(shí)效果比較好
上圖說明,在維基百科中的數(shù)據(jù)語(yǔ)義精確性比較高雁刷,可能是因?yàn)榫S基百科本身里的內(nèi)容就是在說什么是什么的問題覆劈。
Intrinsic評(píng)判標(biāo)準(zhǔn)除了上述的a:b=c:? 查看語(yǔ)義語(yǔ)法以外保礼,還有查看詞語(yǔ)之間的相似度沛励。
比如找10個(gè)人,問他們認(rèn)為“老虎”和“貓”之間的相似度是多少炮障,讓他們從0-10中打分目派。之后我們平均這10個(gè)人的打分,得到“老虎”這個(gè)單詞和“貓”這個(gè)單詞的相似度胁赢。以這樣的方法企蹭,我們?nèi)藶闃?biāo)記單詞之間的相似度。計(jì)算詞向量中兩個(gè)單詞的相似度(歐氏距離智末、乘積谅摄、向量夾角等方法),然后對(duì)比其與我們?nèi)藶槎x的標(biāo)準(zhǔn)的差距系馆。
其他:
一詞多義的現(xiàn)象很普遍送漠。像“好”這樣的詞,可以是“質(zhì)量好”的意思由蘑,也可以是“非趁龉眩”的意思,如“好奇怪”尼酿。此時(shí)爷狈,如果能將一個(gè)詞的多個(gè)意思用不同的詞向量來表示就更好的。
讀者若是有興趣可以參考Linear Algebraic Structure of Word Senses, with Applications to Polysemy裳擎。該文章講述了如何將多義詞用多個(gè)詞向量來表達(dá)涎永。
小結(jié)
計(jì)算詞向量的方法多種多樣。定義并最小化一個(gè)目標(biāo)函數(shù),從而學(xué)習(xí)到某些參數(shù)羡微。這是深度學(xué)習(xí)中最常見的方法支救。負(fù)采樣方法將多分類問題變?yōu)槎诸悊栴},避免了計(jì)算softmax函數(shù)拷淘,大大降低了計(jì)算量各墨。 Glove算法結(jié)合了共現(xiàn)矩陣與優(yōu)化目標(biāo)函數(shù)。由Glove算法的到的詞向量表現(xiàn)效果很好启涯。
評(píng)價(jià)詞向量的好壞有Intrinsic Evaluation(內(nèi)部評(píng)價(jià))和Extrinsic Evaluation(外部評(píng)價(jià))兩種贬堵。內(nèi)部評(píng)價(jià)可快速得知詞向量的對(duì)于語(yǔ)法、語(yǔ)義等信息的捕獲效果结洼,但是不知道詞向量在真實(shí)任務(wù)中的效果如何黎做。外部評(píng)價(jià)可以知道詞向量的應(yīng)用效果如何,但計(jì)算太慢松忍。
本文使用 文章同步助手 同步