本篇博客主要記錄一下對語言模型界赔、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)是百萬級別的詞匯表。
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)。
到這里了姆泻,你會想零酪,我們?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
注意:這里是為了學習詞嵌入,不是為了構建一個語言模型职恳。
那么現(xiàn)在我們就有訓練集樣本了: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模型。這兩個模型的示意圖如下:這里可以明顯看出下面的的預測的方法:
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ù)如下:
取對數(shù)之后的形式就
(w,c)在上下問出現(xiàn)扁远,說明它們的相似度很高官辽,然后我們就需要ogP(c|w;\theta)是越大越好的,那么后面就用到的softmax的方式來得到一個概率搓劫。
這里注意我們的參數(shù)theta是兩次詞向量的矩陣
其中u代表了單詞作為上下文的詞向量瞧哟,v代表了單詞作為中心詞的詞向量。這個在word2vec的源代碼中也是看得到的枪向。
通過softwmax處理之后勤揩,我們就能得到
注意這里的上下文就是語料庫中的了。將改公式帶入到我們的目標函數(shù)中去秘蛔,就可以得到:
到這里來了之后陨亡,我們就得到了Skip-Gram模型的目標函數(shù),但是這里有計算上的問題深员,就是我們這里上下文取的是詞庫负蠕,那么計算的時間復雜度很高。解決上面的問題倦畅,目前使用了兩種手段:一個是負采樣遮糖,另外一個是層次化的softmax。
2叠赐、Skip-Gram與負采樣
先說明一下負采樣之后的目標函數(shù)有些變化止吁,但是本質(zhì)上面還是一個道題。
這里就采用通俗易懂的方式來進行說明燎悍,假設我們的text如下
這里用到我們在邏輯回歸里面的思想
到目前為止的話,可能出現(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ù):
下面我們對各個未知數(shù)求一個偏導:
得到偏導之后,我們就能夠采用梯度下降法去更新我們的參數(shù):
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為空間里面炬灭。然后通過可視化的方式看出詞向量的好壞醋粟。
2、計算詞向量的相似度或者相關性去評估重归。這種評估的方式就需要用到人工去標記相似度米愿。
3、通過類比來評估鼻吮。
四育苟、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凳谦、