cs224n第二讲:简单的词向量表示:word2vec, Glove
第二講:簡單的詞向量表示:word2vec, Glove
How do we represent words?
在處理所有NLP任務(wù)的時候,我們首先需要解決非常重要的一個問題(可能是最重要的):用什么方式將詞組輸入到模型中去。早期的NLP工作并不將詞組作為獨(dú)立個體對待(atomic symbols),但現(xiàn)在的問題絕大多數(shù)需要這樣一個預(yù)處理,來體現(xiàn)詞組之間關(guān)聯(lián)/相似性和區(qū)別。所以我們引入詞向量的概念,如果把詞編碼成詞向量(word vectors),我們很容易從向量的角度去衡量不同的詞之間的關(guān)聯(lián)與差異(常用的距離測度法,包括Jaccard, Cosine, Euclidean等等,注:距離測度法,即用一個可觀測度量的量來描述一個不能直接觀測度量的量)。
Word Vectors
我們拿英文舉例。
英語中大約有1300萬個詞組(token,自定義字符串,譯作詞組),不過他們?nèi)渴仟?dú)立的嗎?并不是哦,比如有一些詞組,“Feline貓科動物”和“Cat貓”,“Hotel賓館“和”Motel汽車旅館”,其實(shí)有一定的關(guān)聯(lián)或者相似性在。因此,我們希望用詞向量編碼詞組,使它代表在詞組的N維空間中的一個點(diǎn)(而點(diǎn)與點(diǎn)之間有距離的遠(yuǎn)近等關(guān)系,可以體現(xiàn)深層一點(diǎn)的信息)。每一個詞向量的維度都可能會表征一些意義(物理含義),這些意義我們用“聲明speech”來定義。例如,語義維度可以用來表明時態(tài)(過去與現(xiàn)在與未來),計(jì)數(shù)(單數(shù)與復(fù)數(shù)),和性別(男性與女性)。
(a) Discrete representation of word
說起來,詞向量的編碼方式其實(shí)挺有講究的, 最簡單的編碼方式叫做one-hot vector:假設(shè)我們的詞庫總共有n個詞,那我們開一個1*n的高維向量,而每個詞都會在某個索引index下取到1,其余位置全部都取值為0.詞向量在這種類型的編碼中如下圖所示:
這種詞向量編碼方式簡單粗暴,我們將每一個詞作為一個完全獨(dú)立的個體來表達(dá)。遺憾的是,這種方式下,我們的詞向量沒辦法給我們?nèi)魏涡问降脑~組相似性度量。例如:
(注:hotel和motel是近義詞)
究其根本你會發(fā)現(xiàn),是你開了一個極高維度的空間,然后每個詞語都會占據(jù)一個維度,因此沒有辦法在空間中關(guān)聯(lián)起來。因此我們可能可以把詞向量的維度降低一些,在這樣一個子空間中,可能原本沒有關(guān)聯(lián)的詞就關(guān)聯(lián)起來了。
(b)Distributional similarity based representations
通過一個詞語的上下文可以學(xué)到這個詞語的很多知識,”You shall know a word by the company it keeps”。這是現(xiàn)代統(tǒng)計(jì)NLP很成功的一個觀點(diǎn)。其實(shí)這也符合人類的思維習(xí)慣,人理解一個詞并不是單純的看這個詞的拼寫來理解它的意思,而是通過上下文來理解其意思。
? Make neighbors represent words
1. Co-occurrence Matrix(共現(xiàn)矩陣)
使用co-occurrence matrix表示單詞,CM有兩種表示法:
? 詞-文檔矩陣(Word-Document Matrix)
它的大小是|V|M,|V|是詞匯表的大小,M是文檔的數(shù)目。Word-document的共現(xiàn)矩陣最終會得到泛化的主題(例如體育類詞匯會有相似的標(biāo)記),這就是淺層語義分析(LSA, Latent Semantic Analysis)。
? 基于窗口的共現(xiàn)矩陣(Windows based Co-occurrence Matrix)
它的大小是|V||V|,這種方法容易探測到單詞的Syntactic and semantic information,windows的選擇一般選5-10之間。一個簡單例子:
? 窗口長度是1(一般是5-10)
? 對稱(左右內(nèi)容無關(guān))
? 語料樣例:I like deep learning; I like NLP; I enjoy flying
CM存在的問題,
?規(guī)模隨著語料庫詞匯的增加而增加
?非常高的維度:需要大量的存儲
?過于稀疏,不利于后續(xù)分類處理
?模型不夠健壯
解決方案:低維向量
? idea: 將最重要的信息存儲在固定的,低維度的向量里:密集向量(dense vector)
? 維數(shù)通常是25-1000
那如何降維呢?
2. SVD(奇異值分解)
對共現(xiàn)矩陣X進(jìn)行奇異值分解。
觀察奇異值(矩陣的對角元素),并根據(jù)我們期待保留的百分比來選擇(只保留前k個維度):
然后我們把子矩陣U1:|V|,1:k視作我們的詞嵌入矩陣。也就是說,對于詞表中的每一個詞,我們都用一個k維的向量來表達(dá)了。
對X采用奇異值分解
通過選擇前K個奇異向量來進(jìn)行降維:
Python中簡單的詞向量SVD分解
? 語料:I like deep learning. I like NLP. I enjoy flying
? 打印U矩陣的前兩列這也對應(yīng)了最大的兩個奇異值
這兩種方法都能產(chǎn)生詞向量,它們能夠充分地編碼語義和句法的信息,但同時也帶來了其他的問題:
? 矩陣的維度會經(jīng)常變化(新的詞語經(jīng)常會增加,語料庫的大小也會隨時變化)。
? 矩陣是非常稀疏的,因?yàn)榇蠖鄶?shù)詞并不同時出現(xiàn)。
? 矩陣的維度通常非常高(≈106×106)
? 訓(xùn)練需要O(n2)的復(fù)雜度(比如SVD)
? 需要專門對矩陣X進(jìn)行特殊處理,以應(yīng)對詞組頻率的極度不平衡的狀況
當(dāng)然,有一些辦法可以緩解一下上述提到的問題:
? 忽視諸如“he”、“the” 、“has”等功能詞。
? 使用“傾斜窗口”(ramp window),即:根據(jù)文件中詞組之間的距離給它們的共現(xiàn)次數(shù)增加相應(yīng)的權(quán)重。
? 使用皮爾森的相關(guān)性(Pearson correlation),將0記為負(fù)數(shù),而不是它原來的數(shù)值。
Hacks to CM
之前用SVD處理的方法很好,但是在原始的CM中有很多問題。
?功能詞(the,he, has)太多,對語法有很大影響,解決辦法是使用或完全忽略功能詞。
?之前的CM建立方法不合理,很顯然距離單詞越近的詞和這個詞的相關(guān)性越高,反之相關(guān)性越小,所以我們可以使用一個Ramped windows(斜的窗)來建立CM,類似于用一個weight乘count,距離越遠(yuǎn)weight越小反之越大(weight是個bell shape函數(shù));
?用皮爾遜相關(guān)系數(shù)代替計(jì)數(shù),并置負(fù)數(shù)為0
Interesting semantic patterns emerge in the vectors
至此使用SVD處理就大概講完了,這玩意有啥用呢?這時出現(xiàn)了三個美麗的Patterns。第一個就是用Hierarchical Clustering來聚類行向量可以進(jìn)行同義詞聚類,這個video上講的比較略,我是通過網(wǎng)上查了半天太查出來這個東東(- -);第二個美麗的pattern就是同義的單詞在word-spaces里,同義詞靠的近,不同意思的詞靠的遠(yuǎn);第三個美麗的pattern就是相似的semantic pair word之間的向量距離也類似。
problems with SVD
?計(jì)算量極大,人類的語料庫有數(shù)以trillion的數(shù)據(jù),將它保存到一個矩陣中,然后做SVD恐怕目前最先進(jìn)的計(jì)算機(jī)都吃不消;對于n*m的矩陣來說計(jì)算的時間復(fù)雜度是O(mn^2)。
?對于新詞或者新的文檔很難及時更新;
?相對于其他的DL模型,有著不同的學(xué)習(xí)框架。
3.基于迭代的方法-word2vec
現(xiàn)在我們退后一步,來嘗試一種新的方法。在這里我們并不計(jì)算和存儲全局信息,因?yàn)檫@會包含太多大型數(shù)據(jù)集和數(shù)十億句子。我們嘗試創(chuàng)建一個模型,它能夠一步步迭代地進(jìn)行學(xué)習(xí),并最終得出每個單詞基于其上下文的條件概率。
詞語的上下文:一個詞語的上下文是它周圍C個詞以內(nèi)的詞。如果C=2,句子"The quick brown fox jumped over the lazy dog"中單詞"fox"的上下文為 {“quick”, “brown”, “jumped”, “over”}.
思想是設(shè)計(jì)一個模型,它的參數(shù)就是詞向量,然后訓(xùn)練這個模型。在每次迭代過程中,這個模型都能夠評估其誤差,并按照一定的更新規(guī)則,懲罰那些導(dǎo)致誤差的參數(shù)。這種想法可以追溯到1986年(Learning representations by back-propagating errors. David E. Rumelhart, Geoffrey E. Hinton, and Ronald J.Williams (1988)),我們稱之為誤差“反向傳播”法。
通過向量定義詞語的含義
對每個詞組都創(chuàng)建一個dense vector,使得它能夠預(yù)測上下文其他單詞(其他單詞也是用向量表示)。
補(bǔ)充:詞向量目前常用的有2種表示方法,one-hot representation和distributed representation。詞向量,顧名思義就是將一個詞表示為向量的形式,一個詞,怎么可以將其表現(xiàn)為向量呢?最簡單的就是One-hot representation,它是以詞典V中的詞的個數(shù)作為向量的維度,按照字典序或某種特定的順序?qū)排序后,詞w的向量可以表示為: [0,0,1,0,0,…,0],即詞w出現(xiàn)的位置為1,其余均為0. 可以看到,這種方法表示的詞向量太過于稀疏,維度太高,會引起維度災(zāi)難,而且非常不利于計(jì)算詞之間的相似度。另一種distributed representation可以解決上述問題,它通過訓(xùn)練將一個詞映射為相對于One-hot representation來說一個比較短的向量,它的表示形式類似于:[0.1,0.34,0.673,0.983]。
■ 學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)word embeddings的基本思路
定義一個以預(yù)測某個單詞的上下文的模型:
p(context∣wt)=...p(context|w_t)=...p(context∣wt?)=...
損失函數(shù)定義如下:
J=1?p(w?t∣wt)J=1-p(w_{-t}|w_t)J=1?p(w?t?∣wt?)
這里的w?t表示wt的上下文(負(fù)號通常表示除了某某之外),如果完美預(yù)測,損失函數(shù)為零。
然后在一個大型語料庫中的不同位置得到訓(xùn)練實(shí)例,調(diào)整詞向量,最小化損失函數(shù)。
■直接學(xué)習(xí)低維度的詞向量
這其實(shí)并不是多么新潮的主意,很早就有一些研究了:
? Learning representations by back-propagating errors (Rumelhart et al., 1986)
? A neural probabilistic language model (Bengio et al., 2003)
? NLP (almost) from Scratch (Collobert & Weston, 2008)
? A recent, even simpler and faster model: word2vec (Mikolov et al. 2013)
只不過以前一直沒有引起重視,直到Bengio展示了它的用處之大。后來研究才開始火熱起來,并逐漸出現(xiàn)了更快更工業(yè)化的模型。
3.1 語言模型(1-gram,2-gram等等)
首先,我們需要建立一個能給“分詞序列”分配概率的模型。我們從一個例子開始:
“The cat jumped over the puddle.”(貓 跳 過 水坑)
一個好的語言模型會給這句話以很高的概率,因?yàn)檫@是一個在語法和語義上完全有效的句子。同樣地,這句”stock boil fish is toy”(股票 煮 魚 是 玩具)就應(yīng)該有一個非常低的概率 ,因?yàn)樗菦]有任何意義的。在數(shù)學(xué)上,我們可以令任意給定的n個有序的分詞序列的概率為:
p(w1,w2,...wn)p(w_1,w_2,...w_n)p(w1?,w2?,...wn?)
我們可以采用一元語言模型。它假定詞語的出現(xiàn)是完全獨(dú)立的,于是可以將整個概率拆開相乘: p(w1,w2,...wn=∏i=1np(wi))p(w_1 ,w_2,...w_n= \prod_{i=1}^n p(w_i)) p(w1?,w2?,...wn?=i=1∏n?p(wi?))
看到這里,肯定很多同學(xué)就要噴了,這不對,詞和詞之間沒有關(guān)聯(lián)嗎?確實(shí),我們知道一句話中每一個詞語都跟它前面的詞語有很強(qiáng)的依賴關(guān)系,忽略這一點(diǎn)的話,一些完全無意義的句子,可能會有很高的概率。咱們稍微改一改,讓一個詞語的概率依賴于它前面一個詞語。我們將這種模型稱作bigram(2-gram,二元語言模型),表示為: p(w1,w2,...wn=∏i=2np(wi∣wi?1))p(w_1 ,w_2,...w_n= \prod_{i=2}^n p(w_i|w_{i-1})) p(w1?,w2?,...wn?=i=2∏n?p(wi?∣wi?1?))
看起來還是有點(diǎn)簡單?恩,也對,我們只考慮一個詞語依賴于其相鄰的一個詞語的關(guān)系,而不是考慮其依賴整個句子的情況。別著急,接下來將會看到,這種方法能讓我們有非常顯著的進(jìn)步。考慮到前面 “詞-詞”矩陣的情況,我們至少可以算出兩個詞語共同出現(xiàn)的概率。但是,舊話重提,這仍然要求儲存和計(jì)算一個非常的大數(shù)據(jù)集里面的全部信息。
現(xiàn)在我們理解了“分詞序列”的概率(其實(shí)就是N-gram語言模型啦)。
補(bǔ)充:
語言模型可以分為文法型模型和統(tǒng)計(jì)語言模型。在實(shí)際應(yīng)用中語言識別、手寫體文字識別、機(jī)器翻譯、鍵盤輸入、信息檢索等研究領(lǐng)域都用到了語言模型。文法型語言模型是人工編制的語言學(xué)文法,文法規(guī)則來源于語言學(xué)家掌握的語言學(xué)知識和領(lǐng)域知識,但這種語言模型不能處理大規(guī)模真實(shí)文本。因此,統(tǒng)計(jì)語言模型出現(xiàn)了,并且得到了廣泛的應(yīng)用,統(tǒng)計(jì)語言模型是基于概率的,包括了N元文法模型(N-gram Model)、隱馬爾科夫模型(Hidden Markov Model,簡稱HMM)、最大熵模型(Maximum Entropy Model)。
1、統(tǒng)計(jì)語言模型的基本原理
統(tǒng)計(jì)語言模型是以概率分布的形式說明了一個字符串出現(xiàn)的概率。假設(shè)詞(word)是語言的最小單位,句子S是由一系列的詞w1,w2,…,wk順序構(gòu)成,則句子S的概率為下: p(s)=p(w1)p(w2∣w1)...p(wn∣w1,w2,…,wn?1)=∏i=1np(wi∣w1,w2,...wi?1)p(s)=p(w_1)p(w_2|w_1)...p(w_n|w_1 ,w_2 ,…, w_{n?1})=\prod_{i=1}^np(w_i|w_1,w_2,...w_{i-1})p(s)=p(w1?)p(w2?∣w1?)...p(wn?∣w1?,w2?,…,wn?1?)=i=1∏n?p(wi?∣w1?,w2?,...wi?1?)且,上式中約定p(w1|w0)=p(w1).觀察上式可以發(fā)現(xiàn),句子S的概率計(jì)算是很復(fù)雜的,因此,往往采用一些方法來估計(jì)語料庫中句子的概率。
2、主要的統(tǒng)計(jì)語言模型
1)、上下文無關(guān)模型
上下文無關(guān)模型就是詞w1的出現(xiàn)與它所處的環(huán)境無關(guān),僅僅是它在語料中出現(xiàn)的概率,即它是n-gram中n=1的情況,但是實(shí)際上,這種方法效果并不是很好。
2)、 n-gram模型
n-gram模型是要考慮上下文的。w1出現(xiàn)的是依賴于它之前的n-1個詞的,即需要計(jì)算詞表中的每一個n-1元組的概率,此計(jì)算量是巨大的,因此實(shí)際中,常取n=2 或n=3.
3)、暫時記錄在此
隱馬爾科夫模型(Hidden Markov Model,簡稱HMM)和最大熵模型(Maximum Entropy Model)暫時還沒有深入研究,暫時記錄下來,以后進(jìn)行補(bǔ)充。
3.2 word2vec
Word2vec主要思想: Predict between every word and its context words!
包含兩個算法:
? Skip-gram (SG): 預(yù)測上下文。
? Continuous Bag of Words (CBOW): 預(yù)測目標(biāo)單詞。
以及兩種訓(xùn)練方法:
? hierarchical softmax: 通過樹結(jié)構(gòu)來定義目標(biāo)函數(shù),來計(jì)算所有詞匯的概率。
? negative sampling: 通過負(fù)樣本采樣,來定義目標(biāo)函數(shù)
Skip-gram (SG):
在每次迭代過程中,以一個詞組為中心(center word),預(yù)測一個窗口中的上下文詞組。所以模型定義了一個概率分布,這個概率分布就是指給定中心詞組時,上下文詞組出現(xiàn)的概率。我們需要做的就是最大化這個概率分布。
細(xì)節(jié):
對每個詞組t=1…T,預(yù)測每個詞組半徑為m的窗口內(nèi)的上下文詞組。
目標(biāo)函數(shù):對于一個中心詞,最大化上下文任意單詞的概率:
J0(θ)=∏t=1T∏?m≤j≤m,j≠0p(wt+j∣p(wt);θ)J^{0}(\theta)=\prod_{t=1}^T\prod_{-m\le{j}\le{m} , j\ne{0}}p(w_{t+j}|p(w_t);\theta)J0(θ)=t=1∏T??m≤j≤m,j??=0∏?p(wt+j?∣p(wt?);θ)
將其轉(zhuǎn)換成負(fù)的對數(shù)似然形式:
J(θ)=?1T∑t=1T∑?m≤j≤m,j≠0logp(wt+j∣p(wt))J(\theta)=-\frac{1}{T}\sum_{t=1}^T\sum_{-m\le{j}\le{m} , j\ne{0}} log p(w_{t+j}|p(w_t))J(θ)=?T1?t=1∑T??m≤j≤m,j??=0∑?logp(wt+j?∣p(wt?))
目標(biāo)函數(shù)的細(xì)節(jié):
? 對于概率分布通常使用的損失: 交叉熵?fù)p失(cross-entropy loss)
? 我們的目標(biāo)是one-hot的 ,它只是來預(yù)測實(shí)際出現(xiàn)的詞組。那么交叉熵?fù)p失中僅剩的就是真實(shí)類別的負(fù)概率。
預(yù)測到的某個上下文條件概率 可由softmax得到:
這里,o是輸出單詞在詞匯表中的下標(biāo),c是中心詞的下標(biāo),vcv_cvc? 是center word vectors,uou_ouo? 是context word vectors。uoTvcu_o^Tv_cuoT?vc? 是兩個向量的點(diǎn)積。對于點(diǎn)積,uTv=u?v=∑i=1nuiviu^Tv=u\cdot{v}=\sum_{i=1}^nu_iv_iuTv=u?v=∑i=1n?ui?vi? ,若u和v比較相似的話,那么它們的點(diǎn)積更大,因此點(diǎn)積是相似度的一種度量方式。這里, 表示每個詞組和v的相似程度,然后我們把它放到softmax中。
Softmax function:從實(shí)數(shù)空間到概率分布的標(biāo)準(zhǔn)映射方法
指數(shù)函數(shù)可以把實(shí)數(shù)映射成正數(shù),然后歸一化得到概率。
softmax之所叫softmax,是因?yàn)橹笖?shù)函數(shù)會導(dǎo)致較大的數(shù)變得更大,小數(shù)變得微不足道;這種選擇作用類似于max函數(shù)。
■ Skip-gram模型:
從左到右, wtw_twt?是中心詞的one-hot vector,W是中心詞的表示矩陣, vc=Wwtv_c=Ww_tvc?=Wwt?是中心詞的嵌入詞向量(embedded word vector)。 W′W'W′是context words的表示矩陣,注意在每個位置都是同一個表示矩陣,也就是說我們只有一個context word matrix。
從左到右是one-hot向量,乘以center word的W于是找到詞向量,乘以另一個context word的矩陣W’得到對每個詞語的“相似度”,對相似度取softmax得到概率,與答案對比計(jì)算損失。
整理上面的圖,得到下圖。
這兩個矩陣都含有V個詞向量,也就是說同一個詞有兩個詞向量,哪個作為最終的、提供給其他應(yīng)用使用的embeddings呢?有兩種策略,要么加起來,要么拼接起來。在CS224n的編程練習(xí)中,采取的是拼接起來的策略:
# concatenate the input and output word vectors wordVectors = np.concatenate((wordVectors[:nWords,:], wordVectors[nWords:,:]),axis=0) # wordVectors = wordVectors[:nWords,:] + wordVectors[nWords:,:]他們管W中的向量叫input vector,W’中的向量叫output vector。
實(shí)際上,在原始的CBOW / Skip-gram模型中,任一個詞 wiw_iwi? 將得到兩個word embedding(設(shè)維度為 n ):作為中心詞時的詞向量,也稱為輸出詞向量vi∈Rn×1v_i\in{R^{n\times{1}}}vi?∈Rn×1 ;以及作為周圍詞時的詞向量,也稱為輸入詞向量 ui∈Rn×1u_i\in{R^{n\times{1}}}ui?∈Rn×1 。詞向量的下標(biāo)和詞的下標(biāo)相對應(yīng),比如說目標(biāo)詞 wtw_twt?的詞向量就對應(yīng)為 vtv_tvt? 和 utu_tut?。
訓(xùn)練模型:計(jì)算參數(shù)向量的梯度
把所有參數(shù)寫進(jìn)向量θ,對d維的詞向量和大小V的詞表來講,有:
由于上述兩個矩陣的原因,所以θ的維度中有2個。
我們要優(yōu)化的目標(biāo)函數(shù)為:
損失/目標(biāo)函數(shù)
梯度有了,參數(shù)減去梯度就能朝著最小值走了。
梯度下降、SGD
只有一句比較新鮮,神經(jīng)網(wǎng)絡(luò)喜歡嘈雜的算法,這可能是SGD成功的另一原因。
Continuous Bag of Words Model (CBOW):
連續(xù)詞袋模型是根據(jù)上下文context words來預(yù)測center word。如根據(jù){“The”,”cat”,”over”,”the”,”puddle”}預(yù)測中間詞”jumped”。
CBOW示意圖:
損失函數(shù):
總結(jié)
以上是生活随笔為你收集整理的cs224n第二讲:简单的词向量表示:word2vec, Glove的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何用 Python 生成炫酷二维码及解
- 下一篇: 第五章 限时订单实战笔记