最近要分享一次Word Embedding,雖然對這個東西早就知道,但是一直沒有一個詳細的梳理,趁着這次機會好好梳理一下這方面的東西。在網上看到正好有人寫了相關的文章,就拿來學習了一番,再加上一些作者不屑于寫的知識。
- word Embedding技術背景
- word2vec
- word Embedding現今的發展
- 進化從未停止
一,word Embedding技術背景
萬物皆可Embedding
Word Embedding可以用低維向量對物體進行編碼還能保留其本身屬性,另一個方面它也可以把高維稀疏的向量映射到低維向量中。 如果我們将詞嵌入到同一個空間下之後,就可以對相關的詞進行操作了。理論上資料準确所有的詞都能做Embedding,準不準就看模型和方法了。
神經網絡語言模型(NNLM)
提到Word Embedding就要說一下NNLM,語言模型,該模型的作用就是給與一段話通過模型能夠判斷這句話是通順一句話的機率。核心函數P的思想是根據句子裡面前面的一系列前導單詞預測後面出現哪個單詞機率的大小。

語言模型
NNLM的架構是:
NNLM
這個架構的任務就是訓練處一個準确率高的語言模型,訓練完成之後,輸入一句話,模型會輸出這句話通順的程度,越通順分數越高。模型在訓練時:
1,單詞one-hot編碼W
2,W乘以Q得到向量C(w)
3,單詞C(w)拼接,接隐層,用softmax預測後面應該接哪個單詞(後面再接一個矩陣将資料次元映射到詞表長度);
4,使用梯度下降優化更新參數,使損失函數到達極值點
C(w)就是單詞的Embedding值。矩陣Q有V行,V為詞典大小,每一行代表對應單詞的Word Embedding,m表示每個單詞的含義。Q是需要學習的網絡參數,也是我們最終要得到的word embedding。
NNLM最終的效果怎麼樣?不知道,沒人關注,此後人們将目光就放在其副産品矩陣Q。是以說word embedding其實是NNLM無心插柳的一個副産品。
二,Word2Vec
Word Embedding是方法論,Word2vec是工具。它是2018年之前生産word Embedding名器。
word2vec原理: word2vec的目标是将詞轉化成具有語義資訊的向量表達方式。
word2vec的訓練方式有兩種CBOW和skip-gram;
CBOW是用兩邊的詞來預估中間的詞,而skip-gram是用中間的詞來預估兩邊的詞。以CBOW為例來講解:
産品名:word2vec
生産日期:2013
廠家:谷歌
用途:産生詞向量
word2vec是一個僅有3層的淺層神經網絡,它的輸入和輸出層次元都是N,隐層次元為h。最終學到的詞向量實際上是該網絡的
輸入層-隐層的權重(次元為N*h,其中N是詞彙表大小 ,h是詞向量次元)。
輸入:固定長度的滑動視窗擷取[V1,V2,..,Vc-1,Vc+1…Vw],輸出層:Vc的機率
word2vec根據訓練方法分成兩種:CBOW、Skip-gram。
CBOW:用上下文去預測單詞
Skip-Gram:用單詞預測上下文
兩種方法效果沒有明顯的差别,此次講一下CBOW的推導過程。
CBOW的推導
假設條件:
次元:輸入、輸出 v;Embedding矩陣We:[v*h];output矩陣Wo:[h*v]
資料語料中隻有兩句話:I love bei jing. I love zhong guo.
那麼v就是6,h可以設定的固定的值也可以訓練得到。
那麼如下圖所示:
([1,v]*[v,h]=[1,h])
([1,h])
Z`=??∗?=Wo∗Z ([1,h]*[h,v]=[1,v])
交叉熵作損失函數:
(右側括号裡面表示資料表次元的變化)
首先對于輸入資料線作one-hot,如左側所示,one-hot之後資料的次元變成(1*v);
1,輸入資料乘以Embedding矩陣Q,得到Zi
2,将Z的資料求均值;因為Zi都是向量是以求完均值之後還是一個(1,h)的向量
3,将Z與矩陣Wo相乘得到輸出層的輸入資料,向量的次元從(1,h)變成詞次元的向量(1,v)
4,在輸出層對Z`做softmax資料。softmax的函數如上所示,其實就是做了一個非線性變化以及歸一化。
5,得到輸出資料之後就看預測的結果對不對了,此時最小化交叉熵損失函數就是幹這個事的,公式還是見上圖,y表示标記值,是一個次元為v的one-hot的向量,a表示預測結果是一個次元為v的向量。因為是y是one-hot的是以從公式可以看出輸出結果是y對應非0位置的處-log(ai)。結果越小越準确。
因為最後輸出層是需要softmax的,這樣每次都是對全量的資料做softmax計算,計算量是很大的,是以,會對其進行優化。
1,層softmax
通過哈夫曼的結構來優化。
2,負采樣
負采樣:每次隻更新正樣本和若幹負樣本
負樣本的選擇是根據詞語在表中出現的機率來決定的,出現的頻次越高被選擇的頻率越高。選擇的公式如下:
wi表示詞頻。
3,對高頻詞進行采樣
Word2Vec通過“抽樣”模式來解決這種高頻詞問題。它的基本思想如下:對于我們在訓練原始文本中遇到的每一個單詞,它們都有一定機率被我們從文本中删掉,而這個被删除的機率與單詞的頻率有關。
參考:https://www.cnblogs.com/cymx66688/p/11185824.html
word2vec存在的問題:
多義詞的存在
如’bank’常用的含義有銀行和河岸,在word2vec中是分不開的。在一個參數空間中同一個單詞隻有一個編碼,在訓練之後是不會改變的。Word2vec得到的Word Embedding是靜态的
三,word Embedding現今的發展
ELMO
ELMO“Embedding from Language Models”的簡稱,由論文“Deep contextualized word representation”提出的。
ELMO是對Word Embedding靜态的一種優化,其核心思想是:先用語言模型學好單詞的Word Embedding,在實際使用的時候由于單詞已經具備上下文了,此時可以根據上下文單詞的語義去調整單詞的Word Embedding表示,經過調整後的單詞會更具有上下文的具體含義,可以解決多義詞問題,比如上文中出現’money‘那麼’bank‘表示的銀行的意思會更貼切。
ELMO本身是根據目前上下文對Word Embedding動态調整的思路。網絡結構主要是一個雙向RNN,語言模型作為訓練任務。
ELMO采用典型的兩階段過程,第一個階段利用語言模型進行預訓練,第二個階段用從預訓練網絡中提取對應單詞的網絡各層的word Embedding作為新特征補充到下遊任務中。
預訓練階段:
其預訓練網絡結構采用雙層雙向LSTM,其語言模型的訓練任務是根據單詞W的上線正确預測單詞W,W之前的單詞稱為Context-before,W之後的單詞稱為Context-after。如圖所示,
左端是前向雙層LSTM,輸入是從左到右w的上文,右側是反向雙層LSTM,輸入是從右到左逆序句子。在訓練好模型之後對于一個新句子Snew每個單詞有三個Embedding,底層是單詞的,中間的句法資訊多一些,上面對應語義資訊多一些。
在實際應用的時候,三個Embedding都會用到:
以QA問題為例,先将句子X作為預訓練好的ELMO網絡的輸入,這樣句子X中每個單詞在ELMO網絡中都能獲得三個對應的Embedding,之後給予這三個Embedding中每個Embedding一個權重a,這個權重可以學習得來,根據各自權重累加求和,将三個Embedding整合成一個。然後将整合後的這個Embedding作為X句在這個任務的那個網絡結構中對應單詞的輸入,供下遊使用。對于回答句子Y也是這麼處理的。這種ELMO提供給下遊每個單詞的特征形式,這類方法稱為"Feature-based Pre-Training"。
不僅學會了單詞的Embedding,還學會一個雙層雙向LSTM機構。在使用過程中word Embedding會根據上下文的資訊改變其值是以,其可以區分多義詞。
如上下文中出現’money’那麼bank表示‘銀行’的意思會更多。
創新和不足
創新:1,提出兩階段過程;第一階段利用語言模型預訓練;第二階段做下遊任務的時候與語言模型互動
2,Word embedding時加入文本本身的特征,是的Embedding的時候會考慮上下文
不足:使用RNN作為特征提取器,而沒有使用特征抽取能力更強的Transformer
GPT1.0
GPT的簡稱是“Generative Pre-Train”的簡稱,即生成式預訓練。GPT也是采用兩階段預訓練,第一個階段利用語言模型進行預訓練,第二個階段通過Fine-turning的模型解決下遊任務。
GPT與ELMO的目标都是語言模型,不同的是,首先特征抽取采用Transform;其次語言模型采用單向,其單向是指其訓練的時候隻使用了Context-before資訊,沒有使用單詞W的下文資訊。
在下遊任務是要使用GPT的時候因為要進行Fine-Tuning是以任務的結構類型需要改造成與預訓練階段相似的架構。如何改造呢?
我不了解。
GPT的效果還是挺好的,重新整理了不少NLP任務的成績。缺點嘛就是語言模型是單向的,沒有用下問的資料多少會有些資訊損失啊。
BERT----超新星
bert論文:BERT:Pre-training of Deep Bidirectional Transformer for Language Understanding
Bert采用與GPT完全相同的兩階段模型,首先是語言模型訓練,并使用Transformer作為特征提取器;其次是使用Fine-Tuning模型解決下遊任務。和GPT最主要的不同在于預訓練階段采用了類似ELMO的雙向語言模型,還有語言模型的資料規模要比GPT要大。
從上圖中可以看到其雙向的過程,以最底層為例,’E‘不僅與後向的’Trm‘有聯系還有前向的’Trm‘也有聯系。
第二階段,Fine-Tuning階段的做法跟GPT一樣,也面臨下遊任務網絡結構改造的問題,在改造任務方面Bert與GPT有些不同。
那麼如何改造呢?這個我是真知道。
在改造之前先說一下NLP的問題被分詞四大類:序列标注、分類、句子關系判斷、生成式任務。
a,序列标注:如中文分詞、詞性标注、命名實體識别、語義角色标注,其特點是句子中每個單詞要求模型根據上下文給出一個分類類别。
b,分類任務:如文本分類、情感計算等,其特點是不管文章多長,總體給出一個分類類别即可;
c,句子關系判斷:QA,語義改寫、自然語言推理等任務都是這個模式,其特點是給的兩個句子,模型判斷出兩個句子是否具備某種語義關系。
d,生成式任務:比如機器翻譯、文本摘要、寫詩造句,看圖說話等,其特點是輸入文本内容之後,需要自動生成另外一段文字。
對于不用類型NLP的任務改造如下所示:
如上圖所示:(a)表示句子關系類任務;(b)表示單句分類任務;(c)表示閱讀了解任務;(d)表示序列标注任務
以(a)句子關系類任務為例,架構主題是成BERT的結構,對于輸入資料加上一個起始和終結符号,句子之間加個分隔符即可。
對于輸出來說,把第一個起始符号對應的Transformer最後一層位置上面串接一個softmax分類層即可。
隻有改造之後資料才能Fine-Tuning啊。
效果:在11個各種類型的NLP任務中達到目前最好的效果,某些任務性能有極大的提升
歸納一下Bert的進展:一,采用兩階段模型,第一階段是雙向語言訓練模型,第二階段是采用具體任務Fine-Tuning或者做特征集合;二,是特征抽取要采用Transformer。集衆家之所長。
四:進化從未停止
長江後浪推前浪
2019年6月XLNet 在 20 項任務上全面超越了 BERT,創造了 NLP 預訓練模型新記錄
2019年7月30日Facebook 釋出 RoBERTa 一些任務已超越XLNet
參考文章:
知乎張俊林的這篇文章細緻入微的講解,文章兼具可讀性、嚴謹性、細緻性,非常難得的佳品,牆裂推薦:
https://zhuanlan.zhihu.com/p/49271699
word2vec的文章:
https://zhuanlan.zhihu.com/p/59396559