|
詞向量算法「建議收藏」-騰訊云開發(fā)者社區(qū)-騰訊云 (tencent.com) 大家好,又見面了,我是你們的朋友全棧君。 https://www.cnblogs.com/the-wolf-sky/articles/10192363.html https://blog.csdn.net/weixin_37947156/article/details/83146141 基于神經(jīng)網(wǎng)絡(luò)的表示一般稱為詞向量、詞嵌入(word embdding)或分布式表示。 神經(jīng)網(wǎng)絡(luò)的詞向量和其他分布式類似,都基于分布式表達方式,核心依然是上下文的表示以及上下文與目標詞之間的關(guān)系映射。主要通過神經(jīng)網(wǎng)絡(luò)對上下文,以及上下文和目標詞之間的關(guān)系進行建模,之所以神經(jīng)網(wǎng)絡(luò)可以進行建模,主要是由于神經(jīng)網(wǎng)絡(luò)的空間非常大,所以這種方法可以表達復(fù)雜的上下文關(guān)系。
分布式表示的基本細想是通過訓(xùn)練將每個詞映射成k維實數(shù)向量(k一般為模型中的超參數(shù)),然后通過詞之間的距離來判斷它們之間的語義相似度。而word2vec使用的就是這種分布式表示的詞向量表示方式。
2.1 NNLM模型 關(guān)于該模型的介紹可以參考:https://blog.csdn.net/lilong117194/article/details/82018008 這里需要注意的是整個網(wǎng)絡(luò)分為兩部分: 第一部分是利用詞特征矩陣C獲得詞的分布式表示(即詞嵌入)。 第二部分是將表示context的n個詞的詞嵌入拼接起來,通過一個隱藏層和一個輸出層,最后通過softmax輸出當(dāng)前的p(wt|context)(當(dāng)前上下文語義的概率分布,最大化要預(yù)測的那個詞的概率,就可以訓(xùn)練此模型)。 第一部分詞嵌入的獲取如下圖所示: ![]() 在這里插入圖片描述 這里可以看到最初的輸如其實是詞的one-hot表示,而這里的中間的w矩陣就是c矩陣。 其中第i行對應(yīng)的是one-hot表示中第i項為1的詞向量的詞嵌入。詞向量與矩陣相乘后就可以得到自己的詞嵌入了。由于C是神經(jīng)網(wǎng)絡(luò)的參數(shù),所以詞的詞嵌入會隨著模型的訓(xùn)練不斷得到優(yōu)化。 在網(wǎng)絡(luò)的第二部分中,表示context的n個詞嵌入通過隱藏層進行語義組合,最后經(jīng)過輸出層使用softmax輸出預(yù)測的詞向量,因為本模型是基于n-gram模型,所以只要最大化正確預(yù)測當(dāng)前詞即可。最后不但訓(xùn)練了一個用神經(jīng)網(wǎng)絡(luò)表示的語言模型,而且還獲得了詞語的詞嵌入(存在矩陣C中) 從第二部分的輸入到輸出層有一個直連邊,一般情況下該直連邊的權(quán)重矩陣可以設(shè)為0,在最后的實驗中,Bengio 發(fā)現(xiàn)直連邊雖然不能提升模型效果,但是可以少一半的迭代次數(shù)。同時他也猜想如果沒有直連邊,可能可以生成更好的詞向量。 nnlm模型的其他細節(jié)可以參考上面的連接。 2.2 C&W模型 首先要明確:nnlm模型的目標是構(gòu)建一個語言概率模型,而C&W模型則是以生成詞向量為目的模型。 在nnlm中最廢時間的是隱藏層到輸出層的權(quán)重計算。由于C&W模型沒有采用語言模型的方式求解詞語上下文的條件概率,而是直接對n元短語打分,這是一種更快速獲取詞向量的方式。 而其簡單來講就是:如果n元短語在語料庫中出現(xiàn)過,那么模型會給該短語打高分;如果是未出現(xiàn)在語料庫中的短語則會得到較低的評分。 優(yōu)化的目標函數(shù)是:∑(w,c)∈D∑w′∈Vmax(0,1?score(w,c)+score(w′,c))∑(w,c)∈D∑w′∈Vmax(0,1?score(w,c)+score(w′,c)) 其中(w,c)(w,c)為 語料庫中抽取的n元短語,為保證上下文詞數(shù)的一致性,n為奇數(shù)。 其中ww是目標詞,c是目標詞的上下文語境 其中w′w′是從詞典中隨機抽取的一個詞語。 C&W模型采用的是成對的詞語方式對目標函數(shù)進行優(yōu)化。這里(w,c)表示正樣本,(w’,c)表示負樣本,負樣本是將正樣本序列中的中間詞替換為其他詞得到的。一般而言,如果用一個隨機的詞語替代正確文本序列的中間詞,得到的新的文本序列基本上都是不符合語法習(xí)慣的錯誤序列,這種構(gòu)造負樣本的方法是合理的。同時由于負樣本僅僅修改了正樣本的一個詞得到的,故其基本的語境沒有改變,因此不會對分類效果造成太大的影響。 與nnlm模型的目標詞所在輸出層不同,C&W模型的輸入層就包含了目標詞,其輸出層也變?yōu)榱艘粋€節(jié)點,該節(jié)點輸出值的大小就代表n元短語的打分高低。相應(yīng)的,C&W模型的最后一層運算次數(shù)是|h|,遠低于nnlm的|v|x|h|次。 C&W模型設(shè)計了2個網(wǎng)絡(luò)來完成詞性標注 (POS)、短語識別(CHUNK)、命名實體識別(NER) 和語義角色標注 (SRL)這些nlp任務(wù)。其中一個模型叫window approach,另一個叫sentence approach。其中詞嵌入的預(yù)訓(xùn)練用的是window approach,只是把輸出層的神經(jīng)原個數(shù)改成了1個,window approach網(wǎng)絡(luò)結(jié)構(gòu)見下圖 ![]() 在這里插入圖片描述 其中,窗口大小為n,中心的那個詞為中心詞,上下文各(n-1)/2個詞。作者利用該模型以無監(jiān)督的方法預(yù)訓(xùn)練詞嵌入來提高在具體工作上的效果,最后的輸出層只有一個神經(jīng)元,表示該中心詞與上下文語義關(guān)聯(lián)程度的得分。得分高則說明該中心詞在當(dāng)前位置是符合上下文語義的,得分低則說明該中心詞在當(dāng)前位置不符合上下文語義。 2.3 CBOW模型 上面說多的nnlm模型以訓(xùn)練語言模型為目標,同時得到了詞表示。而word2vec包含了CBOW和Skip-gram兩個得到詞向量為目標的模型。 這里要注意的地方是:CBOW和Skip-gram模型當(dāng)中,目標詞wtwt是一個詞串聯(lián)的詞,也即是該詞是在一句話的中間某個詞,并擁有上下文。而nnlm的wtwt是最后一個詞,并作為要預(yù)測的詞。 ![]() 在這里插入圖片描述 由圖可知,該模型使用一段文本的的中間詞作為目標詞,同時cbow模型去掉了隱藏層,大大提高了預(yù)運算速度,也因此其輸入層就是語義上下文的表示。此外cbow模型,使用上下文各詞的詞向量的平均值替代nnlm模型各個拼接的詞向量。 整體流程: 首先明確輸入是周圍詞的詞向量,而輸出則是當(dāng)前詞的詞向量,也就是通過上下文來預(yù)測當(dāng)前的詞。 CBOW包含了輸入層、投影層、以及輸出層(沒有隱藏層)。其運算流程如下: 隨機生成一個所有單詞的詞向量矩陣,每一個行對應(yīng)一個單詞的向量 對于某一個單詞(中心詞),從矩陣中提取其周邊單詞的詞向量 求周邊單詞的的詞向量的均值向量 在該均值向量上使用logistic regression 進行訓(xùn)練,softmax作為激活函數(shù) 期望回歸得到的概率向量可以與真實的概率向量(即中心詞的one-hot編碼向量)相匹配 ![]() 在這里插入圖片描述 2.4 Skip-gram模型 Skip-gram模型的結(jié)構(gòu)如下: ![]() 在這里插入圖片描述 由圖可知, Skip-gram模型同樣沒有隱藏層,但與CBOW模型的輸入上下文詞的平均向量不同, Skip-gram模型是從目標詞w的上下文中選擇一個詞,將其詞向量組成上下文的表示。 Skip-gram模型的目標函數(shù): ![]() max(∑(w,c)∈D∑wj∈clogP(w|wj))max(∑(w,c)∈D∑wj∈clogP(w|wj)) 2.5 CBOW和Skip-gram模型的對比 其中CBOW是周圍的詞預(yù)測中間的詞,最大化對w(t)的預(yù)測。Skip-gram是中間的詞預(yù)測周圍的詞,最大化對w(t-2),w(t-1),w(t+1),w(t+2)的預(yù)測之和。由于沒有隱藏層,所以2個網(wǎng)絡(luò)都是線性模型。正因為如此,模型的訓(xùn)練時間比較短,只花了一天就訓(xùn)練了16億單詞的語料。且獲得的詞嵌入質(zhì)量很好,還具有“king”-“man”+“women”=“queen”的語義規(guī)律。 論文中使用了兩種訓(xùn)練方法,一種是哈夫曼樹結(jié)構(gòu)的Hierarchical Softmax,另一種是Negative Sampling,它們的使用都是為了縮短訓(xùn)練時間。由于這兩個技術(shù)這是加快訓(xùn)練的技術(shù),不是網(wǎng)絡(luò)結(jié)構(gòu)。 不過正是這2個技術(shù)的運用縮短了訓(xùn)練時間(另外一個縮短時間的原因是刪掉隱藏層),使其更快地生成了質(zhì)量好的詞嵌入,值得重視。 ![]() 在這里插入圖片描述 網(wǎng)絡(luò)對比: 對比上面介紹的模型我們發(fā)現(xiàn),后面的模型都是以NNLM為基礎(chǔ)進行修改的。其中主要修改有3個部分:輸入層,隱藏層,輸出層。其中輸入層是存儲詞嵌入的層,隱藏層是做語義重組的層,輸出層是根據(jù)目標構(gòu)造輸出語義的層。 以NNLM作為對比對象。后面幾個模型的修改情況如下: C&W:修改了輸入和輸出層 CBOW :去除了隱藏層,輸出層優(yōu)化 skip-gram:去除了隱藏層,修改了輸入層,輸出層優(yōu)化 根據(jù)上面的對比,總結(jié)一下: 對與每個模型來說,輸入是上下文,輸出是預(yù)測,這些模型的核心是用上下文做預(yù)測。 C&W只是為了具體任務(wù)來做詞嵌入的預(yù)訓(xùn)練,所以它把要預(yù)測的和上下文放在一起,以得分的形式進行判斷,最大化正例和反例的得分差。 CBOW沒有隱藏層,直接疊加構(gòu)造語義輸出,或許正是如此所以訓(xùn)練的詞嵌入具有線性語義特征。其當(dāng)前的預(yù)測是作為上下文語義的詞嵌入的線性疊加。 Skip-gram以一個單詞作為上下文,多次預(yù)測周圍的詞。它的成功是否表明預(yù)測是可逆的,即A可預(yù)測B,則B可預(yù)測A,而其根本原因是A與B具有相似語義。而這種相似的產(chǎn)生是因為模型沒有隱藏層,只有線性變換? ![]() 在這里插入圖片描述 3.ELMo–動態(tài)詞向量 ELMo官網(wǎng):https:///elmo 艾倫研究所開發(fā),并于6月初在NAACL 2018年發(fā)布ELMo(深度語境化的單詞表示)。 ELMO(Embeddings from Language Models) ,被稱為時下最好的通用詞和句子嵌入方法,來自于語言模型的詞向量表示,也是利用了深度上下文單詞表征,該模型的優(yōu)勢: (1)能夠處理單詞用法中的復(fù)雜特性(比如句法和語義) (2)這些用法在不同的語言上下文中如何變化(比如為詞的多義性建模) ELMo與word2vec最大的不同: Contextual: The representation for each word depends on the entire context in which it is used. (即詞向量不是一成不變的,而是根據(jù)上下文而隨時變化,這與word2vec或者glove具有很大的區(qū)別) 舉個例子:針對某一詞多義的詞匯w=“蘋果” 文本序列1=“我 買了 六斤 蘋果?!? 文本序列2=“我 買了一個 蘋果 7?!? 上面兩個文本序列中都出現(xiàn)了“蘋果”這個詞匯,但是在不同的句子中,它們我的含義顯示是不同的,一個屬于水果領(lǐng)域,一個屬于電子產(chǎn)品呢領(lǐng)域,如果針對“蘋果”這個詞匯同時訓(xùn)練兩個詞向量來分別刻畫不同領(lǐng)域的信息呢?答案就是使用ELMo。 ELMo是雙向語言模型biLM的多層表示的組合,基于大量文本,ELMo模型是從深層的雙向語言模型(deep bidirectional language model)中的內(nèi)部狀態(tài)(internal state)學(xué)習(xí)而來的,而這些詞向量很容易加入到QA、文本對齊、文本分類等模型中,后面會展示一下ELMo詞向量在各個任務(wù)上的表現(xiàn)。 ![]() 在這里插入圖片描述 它首先在大文本語料庫上預(yù)訓(xùn)練了一個深度雙向語言模型(biLM),然后把根據(jù)它的內(nèi)部狀態(tài)學(xué)到的函數(shù)作為詞向量。實驗表明,這些學(xué)到的詞表征可以輕易地加入到現(xiàn)有的模型中,并在回答問題、文本蘊含、情感分析等 6 個不同的有難度的 NLP 問題中大幅提高最佳表現(xiàn)。實驗表明顯露出預(yù)訓(xùn)練模型的深度內(nèi)部狀態(tài)這一做法非常重要,這使得后續(xù)的模型可以混合不同種類的半監(jiān)督信號。 3.1 ELMo的安裝與使用 AllenNLP是一個相對成熟的基于深度學(xué)習(xí)的NLP工具包,它構(gòu)建于 PyTorch之上,該工具包中集成了ELMo方法。 可以直接使用pip安裝: pip install allennlp 適用于python3.6以上的版本 或者,也可以直接clone源碼到本地[https://github.com/allenai/allennlp] ![]() 在這里插入圖片描述 使用ELMo獲得詞向量替換Glove的詞向量作為多項特定NLP模型的輸入,在ELMo的論文實驗中表明具有一定的效果提升: ![]() 在這里插入圖片描述 BERT的誕生過程: BERT的工作方式跟ELMo是類似的,但是ELMo存在一個問題,它的語言模型使用的是LSTM,而不是google在2017最新推出的Transformer(來自論文《Attention is all you need》)。LSTM這類序列模型最主要的問題有兩個,一是它單方向的,即使是BiLSTM雙向模型,也只是在loss處做一個簡單的相加,也就是說它是按順序做推理的,沒辦法考慮另一個方向的數(shù)據(jù);二是它是序列模型,要等前一步計算結(jié)束才可以計算下一步,并行計算的能力很差。 所以在ELMo之后,一個新模型GPT(來自論文《Improving Language Understanding by Generative Pre-Training》)推出了,它用Transformer來編碼。但是它的推理方式跟ELMo相似,用前面的詞去預(yù)測下一個詞,所以它是單方向,損失掉了下文的信息。 然后BERT誕生了,它采用了Transformer進行編碼,預(yù)測詞的時候雙向綜合的考慮上下文特征。這里作者做了一個改進,原來沒辦法綜合利用雙向的特征是因為目標是用前面的詞逐個的預(yù)測下一個詞,如果你能看到另一個方向,那就等于偷看了答案。BERT的作者說受到了完形填空的啟發(fā),遮蓋住文章中15%的詞,用剩下85%的詞預(yù)測這15%的詞,那就可以放心的利用雙向上下文的特征了。 ![]() 在這里插入圖片描述 Transformer: Transformer是論文《Attention is all you need》中的模型,它把attention機制從配角搬上了主角的位置,沒有采用CNN或者RNN的結(jié)構(gòu),完全使用attention進行編碼。Transformer應(yīng)該會取代CNN和RNN成為NLP主流的編碼方式,CNN提取的是局部特征,但是對于文本數(shù)據(jù),忽略了長距離的依賴,CNN在文本中的編碼能力弱于RNN,而RNN是序列模型,并行能力差,計算緩慢,而且只能考慮一個方向上的信息。Transformer可以綜合的考慮兩個方向的信息,而且有非常好的并行性質(zhì),簡單介紹一下Transformer的結(jié)構(gòu)。 https://jalammar./illustrated-transformer/ 這一篇博客上有非常詳細的介紹,詳細了解Transformer可以看一下這一個博客。 ![]() 在這里插入圖片描述 整個Transformer的結(jié)構(gòu)如上圖所示,它分為兩個部分,一邊是encoder,另一邊是decoder,一個encoder或decoder看作一個block,encoder和decoder又有多個block串行相連,圖中是2個,原文中使用了6個。 先看encoder,單獨看一個block,輸入一行句子,先經(jīng)過一個Self-Attention,Self-Attention首先是對每個Token的embedding通過3個不同的矩陣映射成3個向量,Query(Q)、Key(K)和Value(V)。 ![]() 在這里插入圖片描述 ![]() 在這里插入圖片描述 ![]() 在這里插入圖片描述 每個pos的位置用一個d維的向量表示,這個向量的偶數(shù)位置用sin,奇數(shù)位置用cos計算,得到-1到1之間的值,之所以用三角函數(shù)是利用了三角函數(shù)和差變換可以線性變換的特性,因為BERT中沒有采用這種計算方式,所以不作詳細的介紹。 然后經(jīng)過一個Feed Forward的神經(jīng)網(wǎng)絡(luò)再經(jīng)過Add&Normalize完成一個encoder,傳向下一個encoder。Decoder的結(jié)構(gòu)和運算機制與encoder基本一致,不同的是encoder頂層的K、V向量會傳到Decoder的每個Block的Encoder-Decoder Attention部件中。最后經(jīng)過一個線性的變換和Softmax分類器得到最后的結(jié)果。 BERT的實現(xiàn)方式: Mask Language Model 受到完形填空的啟發(fā),它不同于傳統(tǒng)的語言模型,它是蓋住整篇文章15%的詞,然后用其他的詞預(yù)測這15%的詞。被蓋住的詞用[mask]這樣的一個標記代替,但是由于下游任務(wù)中沒有[mask]這個符號,為了削弱這個符號的影響,15%被蓋住的詞中: 80%的詞就用[mask]符號蓋住 10%的詞保留原來真實的詞 10%的詞用隨機的一個詞替代 編碼方式: 采用Transformer為編碼方式,實驗結(jié)果最好的結(jié)構(gòu)是BERT:L=24,H=1024,A=16。L=24也就是Transformer中提到的Block數(shù),H=1024是隱藏層的維度,也就是Token經(jīng)過矩陣映射之后K、Q、V向量的維度,A=16是Attention的頭數(shù),疊加了16層相互獨立的Self-Attention。非常的google,money is all you need,如此復(fù)雜的結(jié)構(gòu),一般人是玩不了的,所幸的是google開源了pre-train的參數(shù),只要用pre-train的參數(shù)對下游任務(wù)進行fine-tuning就可以使用google的BERT。 BERT的Transformer結(jié)構(gòu)與Attention is all you need中有一個不同是對于位置信息的編碼,論文中的Transformer是采用cos和sin函數(shù)計算,而BERT用了更為簡單粗暴的方法,每一個位置賦予一個向量,例如句子的截斷長度固定為50,那么0-49這50個位置各賦予一個向量,將這個向量加到self-attention的embedding上。 獲取句間的關(guān)系: 目前為止只獲得了Token級別的特征,但是對于一些句間關(guān)系的推理,對話系統(tǒng)、問答系統(tǒng)需要捕捉一些句子的特征。BERT采用給定2個句子,判斷它們是否是連續(xù)的句子的方式捕捉句子級別的特征: ![]() 在這里插入圖片描述 具體的實現(xiàn)方式是兩個連續(xù)的句子,開始和結(jié)束打上符號,兩句之中打上分隔符,然后中一個二分類,反例的生成采用類似于word2vec的負采樣。 ![]() 在這里插入圖片描述 這是整體的編碼方式,Token Embedding是Transformer的embedding,加上segment embedding A和B,捕捉句子級別的特征,區(qū)分第一句和第二句,如果只有一個句子的情況就只有embedding A,加上每個位置賦予的Position embedding得到最終的embedding。 BERT的實驗結(jié)果: ![]() 在這里插入圖片描述 ![]() 在這里插入圖片描述 在 NLP 具體任務(wù)中應(yīng)用的效果來看:效果最差的是 CBOW;其次是 Skip-gram(GloVe 跟 Skip-gram 差不多);效果最好的是 FastText。其中,F(xiàn)astText 能很好地處理 OOV(Out of Vocabulary)問題,最小粒度介于word和character之間 問題,并能很好地對詞的變形進行建模,對詞變形非常豐富的德語、西班牙語等語言都非常有效; 從效率(訓(xùn)練時間)上來看:CBOW 的效率是最高的,其次是 GloVe;之后是 Skip-gram;而最低的是 FastText。 https://blog.csdn.net/sinat_26917383/article/details/83041424 發(fā)布者:全棧程序員棧長,轉(zhuǎn)載請注明出處:https:///131933.html原文鏈接:https:// |
|
|