word2vec原理猾瘸、推導與總結(jié)

本篇博客主要記錄一下對語言模型界赔、Word2Vec、ELMo和BERT學習和總結(jié)牵触,有些地方肯定理解不到位淮悼,希望小伙伴們賜教。

一揽思、詞表征(Word Representation)

1袜腥、詞表征

首先明確句子是序列化,里面攜帶了大量大信息钉汗。在NLP發(fā)展的進程里面羹令, 采用了one-hot vector的形式來表示一個句子里面的詞是一種方式。表示這個句子的方式如下:
1损痰、首先是創(chuàng)建一張詞匯表(Vocabulary)福侈,然后每個詞都有對應的位置,假設現(xiàn)在我們有10000個單詞卢未。本例子來自于吳恩達的Deeplearningai肪凛。圖中所示的詞匯表大小就是10000。一般規(guī)模的商業(yè)應用來說辽社,詞匯表大小為30000到50000詞伟墙。大型互聯(lián)網(wǎng)是百萬級別的詞匯表。

image.png
2爹袁、將句子里面的每個單詞轉(zhuǎn)換為one-hot vector远荠。one-hot vector從字面上來理解就是向量里面只有1個1,也就是找到這個詞在詞匯表里面的位置處填上1失息,然后其他的位置都是0譬淳。可以看出one-hot vector的模長為1盹兢。
one-hot vector表示向量的缺陷:
(1)這種表示把每個詞都孤立出來了邻梆,使得算法對相關詞的泛化能力弱。兩個不同人名的one-hot vector的內(nèi)積為0绎秒,這樣來表示就不能體現(xiàn)出詞匯在某些方面的相關性

(2)這樣得到的向量是稀疏的浦妄,而且維度非常的大。

那么現(xiàn)在提個問題:我們怎么來表示詞匯,能夠?qū)⒁恍┫嚓P詞匯之間的一些共通特征給表現(xiàn)出來呢剂娄?

2蠢涝、詞嵌入(Word Embeddings)

前面我們看到了one-hot vector表示一個詞,只有一個維度有意義阅懦。那么我們可以想想和二,能不能把一些相似詞匯的一些特征抽取出來,給詞不同的維度賦予一些意思呢耳胎?結(jié)果就出現(xiàn)了詞嵌入的方式來表示句子里面的詞惯吕。
(1)詞嵌入:顧名思義,就是將一些特征給嵌入到詞匯里面怕午,讓它能表現(xiàn)出更多的信息废登。
現(xiàn)在舉個例子:
1)性別特征:我們可以看出一些詞如Man, Woman, King, Queen是有關系的,那么我們就在gender這一欄給填上相關性的權重郁惜,然后詞如Apple, Orange這些就與gender堡距,沒有關系,那么就是賦予趨近于0的權重兆蕉。
2)年齡特征:可以看出King, Queen和age還是很想關的吏颖,但是Man, Woman, Apple, Orange與此就沒有多大關系了。
采用相同的策略恨樟,我們可以從很多特征(Food、size疚俱、cost劝术、alive等)來考察一個詞在這些特征上面是否有關系。在這里例子里面選取了300個特征呆奕,那么我們就可以將一個詞表示為300維的一個向量养晋,那么這些向量里面很多維度上都不是0。而且我們也可以看出向量之間再做內(nèi)積就能體現(xiàn)出詞匯的相似度了梁钾。然后另外一個重要的特性就做類比推理绳泉,但是這種推理的準確度在30%到75%區(qū)間范圍內(nèi)。

image.png

到這里了姆泻,你會想零酪,我們?nèi)绾蝸淼玫揭粋€詞嵌入的特征矩陣呢?
(2)學習詞嵌入
在介紹學習詞嵌入之前拇勃,把相關的符號在這里標注下:
其中10000表示詞匯表次數(shù)四苇,300表示嵌入向量里面的特征數(shù)。所以我們有個詞匯表和嵌入矩陣之后方咆,我們就能得到對應單詞的詞向量了月腋。
下面我們就開始對詞向量進行一個學習:
學習嵌入矩陣E的一個好方法就是2003年Bengio等人提出的神經(jīng)語言模型 ,關于語言模型的介紹可以參考我的前一篇博客。
這里我們以一句話為例榆骚,來說明使用語言模型來學習詞嵌入片拍。這句話:I want a glass of orange juice。
上下文(context):把預測詞前面的幾個詞作文上下文妓肢,這個例子中為a glass of orange
目標詞(target):把要預測的單詞作為目標詞捌省,這個例子中的目標詞就是juice
注意:這里是為了學習詞嵌入,不是為了構建一個語言模型职恳。
image.png

那么現(xiàn)在我們就有訓練集樣本了:(context(w),w)content(w):維度((n-1)m,1)所禀,n-1指的是窗口里面的單詞數(shù),也就是例子中的4放钦,m指的是詞向量的維度色徘,例子中為300。那么例子中顯示的是(1200,1)操禀。
w:要預測的下一個詞褂策,例子中為juice,然后它的維度是(D, 1)颓屑,D指的就是詞匯表的大小斤寂,也就是例子中所示的10000。
在softmax層揪惦,會計算10000個條件概率遍搞。然后可以通過反向傳播的方式,經(jīng)過梯度下降法器腋,得到我們想獲得的嵌入矩陣E溪猿。
與n-gram模型相比,好處在于:
1纫塌、可以進行詞語之間的相似度計算了诊县,而且還能夠做類比。
2措左、不需要再考慮平滑操作了依痊,因為p(w|context)在0到1之間。

二怎披、Word2Vec

看完了前面的神經(jīng)語言模型之后胸嘁,我們看轉(zhuǎn)入了Word2Vec的兩個重要的模型CBOW(Continues bags of words)和Skip-gram模型。這兩個模型的示意圖如下:
CBOW和Skip gram

這里可以明顯看出下面的的預測的方法:

Model 如何預測 使用語料的規(guī)模
CBOW 使用上下文去預測目標詞來訓練得到詞向量 小型語料庫比較適合
Skip-gram 使用目標詞去預測周圍詞來訓練得到詞向量 在大型的語料上面表現(xiàn)得比較好

CBOW是非常常見的钳枕,但是不是非常常用的缴渊,最常用的還是Skip gram。所以本文就是針對 Skip gram來進行說明了鱼炒。

1衔沼、Skip-Gram模型

它只是一種學習方法而已苔埋。舉個例子:
I want a glass of orange juice澳眷。
思路就是我們有了glass之后,想去預測周圍的want a 和 of orange。現(xiàn)在我們怎么去數(shù)學的方式去描述出來了牙甫。這里有一個window的size了题翻。
Skip-Gram的目標函數(shù)如下:
l(\theta) = arg \max_\theta \prod_{w\in Text} \prod_{C\in Context(w)} P(c|w;\theta)

取對數(shù)之后的形式就
L(\theta) = arg \max_\theta \sum_{w\in Text} \sum_{C\in Context(w)} logP(c|w;\theta) (w,c)在上下問出現(xiàn)扁远,說明它們的相似度很高官辽,然后我們就需要ogP(c|w;\theta)是越大越好的,那么后面就用到的softmax的方式來得到一個概率搓劫。

這里注意我們的參數(shù)theta是兩次詞向量的矩陣
\theta = [u, v]
其中u代表了單詞作為上下文的詞向量瞧哟,v代表了單詞作為中心詞的詞向量。這個在word2vec的源代碼中也是看得到的枪向。
通過softwmax處理之后勤揩,我們就能得到
P(c|w;\theta) = \frac {e^{u_{c}*v_{w}}}{\sum_{c^{\prime} \in corpus} e^{u_{c^{\prime}}*v_{w}}} 注意這里的上下文就是語料庫中的了。將改公式帶入到我們的目標函數(shù)中去秘蛔,就可以得到:
\begin{eqnarray} L(\theta) &=& arg \max_\theta \sum_{w\in Text} \sum_{C\in Context(w)} logP(c|w;\theta)\\ & =& arg \max_\theta \sum_{w\in Text} \sum_{C\in Context(w)} log \frac {e^{u_{c}*v_{w}}}{\sum_{c^{\prime} \in corpus} e^{u_{c^{\prime}}*v_{w}}} \\ &=& arg \max_\theta \sum_{w\in Text} \sum_{C\in Context(w)}[u_{c}*v_{w}-log\sum_{c^{\prime} \in corpus}e^{u_{c^{\prime}}*v_{w}}] \end{eqnarray} 到這里來了之后陨亡,我們就得到了Skip-Gram模型的目標函數(shù),但是這里有計算上的問題深员,就是我們這里上下文取的是詞庫负蠕,那么計算的時間復雜度很高。解決上面的問題倦畅,目前使用了兩種手段:一個是負采樣遮糖,另外一個是層次化的softmax。

2叠赐、Skip-Gram與負采樣

先說明一下負采樣之后的目標函數(shù)有些變化止吁,但是本質(zhì)上面還是一個道題。
這里就采用通俗易懂的方式來進行說明燎悍,假設我們的text如下
text = w_{1}w_{2}w_{3}w_{4}w_{5}

這里用到我們在邏輯回歸里面的思想
l(\theta) = arg \max_\theta \prod_{(c,w)\in D}P(D=1|c,w; \theta) \prod_{(c,w)\in \tilde{D}}P(D=0|c,w; \theta)

\begin{eqnarray} L(\theta) &=& arg \max_\theta[ \sum_{(c,w)\in D}P(D=1|c,w; \theta) +\sum_{(c,w)\in \tilde{D}}P(D=0|c,w; \theta)]\\ &=& arg \max_\theta[\sum_{(c,w)\in D} log\sigma(u_{c}\cdot v_{w}) +\sum_{(c,w)\in \tilde{D}}log\sigma(-u_{c}\cdot v_{w})] \end{eqnarray} 到目前為止的話,可能出現(xiàn)的問題就是正樣本的數(shù)量非常少盼理,然后負樣本的數(shù)量非常多谈山,這個就是樣本數(shù)量極度不均衡的狀態(tài),所以我們需要從負樣本里面抽選一部分出來宏怔,這樣的話奏路,我們計算的時候就更快。
下面就是對負采樣的一個說明:
I want a glass of orange juice
由上面的text臊诊,我們就知道了Vocab = {I, want, a, glass, of, orange, juice} 總共7個單詞鸽粉,然后按照窗口是1的情況,進行一個負采樣:

正樣本 負樣本
(glass, a) (glass, I), (glass, juice)
(glass, of) (glass, want), (glass, I)
(of, glass) (of, I), (of, juice)
(of, glass) (of, want), (of, glass)

這里就是一個負采樣的過程了抓艳,具體的負采樣的個數(shù)是一個超參數(shù)了触机,那么到了這里,我們就得到我們負采樣過程中的目標函數(shù):
L(\theta) = arg \max_\theta[\sum_{(c,w)\in D} log\sigma(u_{c}\cdot v_{w}) +\sum_{c^{\prime }\in N(w)}. log\sigma(-u_{c^{\prime}}\cdot v_{w})
下面我們對各個未知數(shù)求一個偏導:
\begin{eqnarray} \frac{\partial L(\theta)}{\partial u_{c}} &=& [1-\sigma(u_{c}\cdot v_{w})]\cdot v_{w}\\ \frac{\partial L(\theta)}{\partial u_{c^{\prime}}} &=& [\sigma(-u_{c^{\prime}}\cdot v_{w})-1]\cdot v_{w}\\ \frac{\partial L(\theta)}{\partial v_{w}} &=& [1-\sigma(u_{c}\cdot v_{w})]\cdot u_{c}+ \sum_{c^{\prime \in N(w)}}[\sigma(-u_{c^{\prime}}\cdot v_{w})-1]\cdot u_{c^{\prime}} \\ \end{eqnarray}
得到偏導之后,我們就能夠采用梯度下降法去更新我們的參數(shù):
u_{c} := u_{c} - \alpha \cdot \frac{\partial L(\theta)}{\partial u_{c}}

u_{c^{\prime}} := u_{c^{\prime}} - \alpha \cdot \frac{\partial L(\theta)}{\partial u_{c}^{\prime}}

v_{w} := v_{w} - \alpha \cdot \frac{\partial L(\theta)}{\partial v_{w}}

3儡首、負采樣算法流程
for each (w, c) in 正樣本集合:
    負采樣得到集合N(w):中心詞是w片任,負采樣。超參數(shù)為負樣本個數(shù)
    進行梯度計算
    更新參數(shù)

在for循環(huán)里面蔬胯,我們需要去進行負采樣的操作对供。這里負采樣的個數(shù)就是一個訓練時候的超參數(shù)了。一般選擇是5或者是10氛濒。另外為了進行加速的處理产场,我們源代碼里面是用到了哈夫曼樹的方式去進行一個提速的采樣。

三舞竿、詞向量的評估方式

訓練得到詞向量之后京景,我們可以采用三種方法去進行詞向量的好壞的評估:
1、可視化的方式評估:我們將我們學習到的100/200/300維的詞向量通過降維算法TSNE降到2為空間里面炬灭。然后通過可視化的方式看出詞向量的好壞醋粟。


T-SNE

2、計算詞向量的相似度或者相關性去評估重归。這種評估的方式就需要用到人工去標記相似度米愿。
3、通過類比來評估鼻吮。

analogy

四育苟、Word2Vec操作和改進

我們可以從https://code.google.com/archive/p/word2vec/source/default/source
下載下來word2vec的C++源碼。

make word2vec

通過make進行編譯得到了word2vec的二進制文件椎木。

./word2vec

運行一下违柏,我們就能夠看到里面提醒的一些參數(shù)了。

?  trunk  ./word2vec
WORD VECTOR estimation toolkit v 0.1c

Options:
Parameters for training:
    -train <file>
        Use text data from <file> to train the model
    -output <file>
        Use <file> to save the resulting word vectors / word clusters
    -size <int>
        Set size of word vectors; default is 100
    -window <int>
        Set max skip length between words; default is 5
    -sample <float>
        Set threshold for occurrence of words. Those that appear with higher frequency in the training data
        will be randomly down-sampled; default is 1e-3, useful range is (0, 1e-5)
    -hs <int>
        Use Hierarchical Softmax; default is 0 (not used)
    -negative <int>
        Number of negative examples; default is 5, common values are 3 - 10 (0 = not used)
    -threads <int>
        Use <int> threads (default 12)
    -iter <int>
        Run more training iterations (default 5)
    -min-count <int>
        This will discard words that appear less than <int> times; default is 5
    -alpha <float>
        Set the starting learning rate; default is 0.025 for skip-gram and 0.05 for CBOW
    -classes <int>
        Output word classes rather than word vectors; default number of classes is 0 (vectors are written)
    -debug <int>
        Set the debug mode (default = 2 = more info during training)
    -binary <int>
        Save the resulting vectors in binary moded; default is 0 (off)
    -save-vocab <file>
        The vocabulary will be saved to <file>
    -read-vocab <file>
        The vocabulary will be read from <file>, not constructed from the training data
    -cbow <int>
        Use the continuous bag of words model; default is 1 (use 0 for skip-gram model)

Examples:
./word2vec -train data.txt -output vec.txt -size 200 -window 5 -sample 1e-4 -negative 5 -hs 0 -binary 0 -cbow 1 -iter 3

word2vec的源碼有很多種香椎,這里可以去看看C++版本的word2vec漱竖。地址就是https://github.com/dav/word2vec
雖然word2vec思想非常的牛逼,但是也存在了很多的缺點和問題:
1畜伐、學習出來的詞向量是固定的馍惹。這就導致了在任何的語境里面它表達的意思都是固定的了。實際上我們希望得到的是在不同語境下面得到不同的詞向量玛界。所以后來就有了ELMo和BERT模型了万矾。
2、窗口的長度是有限的慎框。解決的方式就通過language model了良狈。
3、無法有效的學習低頻詞匯和未登陸詞笨枯。解決的方法就是subword embedding了薪丁。
4遇西、預測不具備uncertainty。因為我們的詞向量都是固定住了的窥突。但是不同語境下面的詞語的意義不同努溃。解決的方式就是采用高斯embedding了。
5阻问、可解釋性不夠梧税。這個就是深度學習的一個通病了。

參考資料:
1称近、Deeplearningai主頁
2第队、網(wǎng)易云課堂-Deeplearningai
3、Yoshua Bengio, etc, A Neural Probabilistic Language Model(2003)
4刨秆、https://github.com/dav/word2vec
5凳谦、

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市衡未,隨后出現(xiàn)的幾起案子尸执,更是在濱河造成了極大的恐慌,老刑警劉巖缓醋,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如失,死亡現(xiàn)場離奇詭異,居然都是意外死亡送粱,警方通過查閱死者的電腦和手機褪贵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抗俄,“玉大人脆丁,你說我怎么就攤上這事《ⅲ” “怎么了槽卫?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胰蝠。 經(jīng)常有香客問我晒夹,道長,這世上最難降的妖魔是什么姊氓? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮喷好,結(jié)果婚禮上翔横,老公的妹妹穿的比我還像新娘。我一直安慰自己梗搅,他們只是感情好禾唁,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布效览。 她就那樣靜靜地躺著,像睡著了一般荡短。 火紅的嫁衣襯著肌膚如雪丐枉。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天掘托,我揣著相機與錄音瘦锹,去河邊找鬼。 笑死闪盔,一個胖子當著我的面吹牛弯院,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播泪掀,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼听绳,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了异赫?” 一聲冷哼從身側(cè)響起椅挣,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎塔拳,沒想到半個月后鼠证,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡蝙斜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年名惩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孕荠。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡娩鹉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出稚伍,到底是詐尸還是另有隱情弯予,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布个曙,位于F島的核電站锈嫩,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏垦搬。R本人自食惡果不足惜呼寸,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猴贰。 院中可真熱鬧对雪,春花似錦、人聲如沸米绕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至迈套,卻和暖如春捐祠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背桑李。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工踱蛀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芙扎。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓星岗,卻偏偏與公主長得像,于是被迫代替她去往敵國和親戒洼。 傳聞我的和親對象是個殘疾皇子俏橘,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容