word2vec介绍
word2vec是一種將word轉(zhuǎn)為向量的方法,其包含兩種算法,分別是skip-gram和CBOW,它們的最大區(qū)別是skip-gram是通過中心詞去預(yù)測中心詞周圍的詞,而CBOW是通過周圍的詞去預(yù)測中心詞。
這個word2vec的方法是在2013年的論文《Efficient Estimation of Word Representations inVector Space》中提出的,作者來自google,文章下載鏈接:https://arxiv.org/pdf/1301.3781.pdf
文章提出了這兩種方法如下圖所示:
你現(xiàn)在看這張圖可能一頭霧水,不知所措,沒關(guān)系,我們慢慢來學(xué)習(xí)。
在處理自然語言時,通常將詞語或者字做向量化,例如one-hot編碼,例如我們有一句話為:“我愛北京天安門”,我們分詞后對其進(jìn)行one-hot編碼,結(jié)果可以是:
“我”: 【1,0,0,0】
“愛”: 【0,1,0,0】
“北京”: 【0,0,1,0】
“天安門”: 【0,0,0,1】
這樣,我們就可以將每個詞用一個向量表示了。
但是ont-hot編碼在大量數(shù)據(jù)的情況下會出現(xiàn)維度災(zāi)難,通過觀察我們可以知道上面的one-hot編碼例子中,如果不同的詞語不是4個而是n個,則one-hot編碼的向量維度為1*n,也就是說,任何一個詞的one-hot編碼中,有一位為1,其他n-1位為0,這會導(dǎo)致數(shù)據(jù)非常稀疏(0特別多,1很少),存儲開銷也很大(n很大的情況下)。
那有什么辦法可以解決這個問題呢?
于是,分布式表示被提出來了。什么是分布式表示?
它的思路是通過訓(xùn)練,將每個詞都映射到一個較短的詞向量上來。這個較短的詞向量維度是多大呢?這個一般需要我們在訓(xùn)練時自己來指定?,F(xiàn)在很常見的例如300維。
例如下面圖展示了四個不同的單詞,可以用一個可變化的維度長度表示(圖中只畫出了前4維),其實(shí)可以是多少維由你指定。假設(shè)為4維。
大家如果細(xì)心,會發(fā)現(xiàn)在展示的這些維度中的數(shù)字已經(jīng)不是1和0了,而是一些其他的浮點(diǎn)數(shù)。
這種將高維度的詞表示轉(zhuǎn)換為低維度的詞表示的方法,我們稱之為詞嵌入(word embedding)。
上圖是將一個3維詞向量表示轉(zhuǎn)為2維詞向量表示。
有個有意思的發(fā)現(xiàn)是,當(dāng)我們使用詞嵌入后,詞之間可以存在一些關(guān)系,例如:
kingkingking的詞向量減去manmanman的詞向量,再加上womanwomanwoman的詞向量會等于queenqueenqueen的詞向量!
出現(xiàn)這種神奇現(xiàn)象的原因是,我們使用的分布式表示的詞向量包含有詞語上下文信息。
怎么理解上下文信息呢?
其實(shí)很簡單,我們在上學(xué)時,做閱讀理解經(jīng)常會提到聯(lián)系上下文,所謂的上下文信息無非是當(dāng)前內(nèi)容在文本中前后的其他內(nèi)容信息。
如下圖所示,learning這個詞的上下文信息可以是它左右兩邊的content標(biāo)記的內(nèi)容。
試想一下,如果這里的learning換成studying,是不是這句話仍然很合適呢?畢竟這兩個單詞都是學(xué)習(xí)的意思。
再轉(zhuǎn)換一下思維,由于在當(dāng)前上下文信息中,learning和studying都可以出現(xiàn),是不是learning和studying是近義詞了呢?沒錯,在當(dāng)前的CBOW下確實(shí)是這樣,甚至man和woman,cat和dog都可能是近義詞。
所以大家是否理解了呢?
其實(shí)就是擁有相似或者相同的上下文的多個詞可能是近義詞或者同義詞。
這里慢慢將CBOW的算法思想透露出來了,因為CBOW就是通過當(dāng)前中心詞的上下文單詞信息預(yù)測當(dāng)前中心詞。
此時再來看CBOW這張示意圖,是不是有點(diǎn)感覺了?
接下來進(jìn)入具體的算法模型部分!
首先我們需要訓(xùn)練CBOW模型,該模型的結(jié)構(gòu)如下圖:
這張圖略微復(fù)雜,我們需要從最左邊開始看,最左邊的一列是當(dāng)前詞的上下文詞語,例如當(dāng)前詞的前兩個詞和后兩個詞,一共4個上下文詞。
這些上下文詞即為圖中的x1kx_{1k}x1k?、x2kx_{2k}x2k?…xckx_{ck}xck?。
這些詞是one-hot編碼表示,維度為1V(雖然圖上畫得像列向量V1,這圖畫的容易理解錯誤,其中V為詞空間的大小,也就是有多少個不同的詞,則one-hot編碼的維度為多少,也就是V個不同的詞)。
然后剛說的每個上下文的詞向量都需要乘以一個共享的矩陣WWW,由于整個模型是一個神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),我們將這個存在于輸入層和隱藏層之間的矩陣稱為W1W_1W1?,該矩陣的維度為V?NV*NV?N,其中VVV如前所述,NNN為我們自己定義的一個維度。
學(xué)過線性代數(shù)的矩陣乘法我們知道,這里的one-hot編碼向量1?V1*V1?V乘上維度為V?NV*NV?N的矩陣W1W_1W1?,結(jié)果是1?N1*N1?N的向量。
這里因為一個中心詞會有多個上下文詞,而每個上下文詞都會計算得到一個1?N1*N1?N向量,我們將這些上下文詞的1?N1*N1?N向量相加取平均,得到中間層(隱藏層)的向量,這個向量也為1?N1*N1?N,之后,這個向量需要乘以一個N?VN*VN?V的矩陣W2W_2W2?,最終得到的輸出層維度為1?V1*V1?V。
然后將1?V1*V1?V的向量softmax歸一化處理得到新的1?V1*V1?V向量,在VVV個取值中概率值最大的數(shù)字對應(yīng)的位置所表示的詞就是預(yù)測結(jié)果。如果對softmax的概念陌生,可以搜索學(xué)習(xí)一下。
而這個輸出的結(jié)果1?V1*V1?V就是預(yù)測出的中心詞的分布式表示。
別急,我們只是講通了這個CBOW模型的前向計算過程。
我們接下來說說模型的訓(xùn)練過程。
預(yù)測的時候,做一次前向傳播即可得到預(yù)測的中心詞結(jié)果。
你可能會想,word2vec不是要將詞轉(zhuǎn)為分布式表示的詞嵌入么?怎么變成預(yù)測中心詞了?
其實(shí)我們在做CBOW時,最終要的是W1W_1W1?這個V?NV*NV?N矩陣,想想這是為什么呢?
因為我們是要將詞轉(zhuǎn)換為分布式表示的詞嵌入,我們先將詞進(jìn)行one-hot編碼,每個詞的向量表示是1?V1*V1?V的,經(jīng)過乘以W1W_1W1?后,根據(jù)矩陣乘法的理解,假設(shè)1?V1*V1?V向量中第n位是1,其他是0,則矩陣乘法結(jié)果是得到了W1W_1W1?矩陣中的第n行結(jié)果,也就是將詞表示為了一個1?N1*N1?N的向量,一般NNN遠(yuǎn)小于VVV,這也就將長度為VVV的one-hot編碼稀疏詞向量表示轉(zhuǎn)為了稠密的長度為NNN的詞向量表示。
如果還沒啥感覺,看下面這張圖幫助你理解:
所以,當(dāng)我們下次要查某個詞的詞向量時,只需要和矩陣W1W_1W1?相乘就能得到結(jié)果。常用的詞向量長度有300,大家想想300是不是遠(yuǎn)小于我們詞表里所有不重復(fù)詞的數(shù)量呢?
總結(jié)
以上是生活随笔為你收集整理的word2vec介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 拔牙后补牙需要订做牙齿吗
- 下一篇: pandas parse_data出现异