欧美精品123_精品露脸国产偷人在视频_日韩美女免费线视频_成人av三级

詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

本文的標題是《詞向量詳解:從word2vec、glove、ELMo到BERT》來源于:由作者:陳楚楚采編而成,主要講述了目前,詞向量(又叫詞嵌入)已經成為NLP領域各種任務的必備一步,而且隨著bert


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

目前,詞向量(又叫詞嵌入)已經成為NLP領域各種任務的必備一步,而且隨著bert elmo,gpt等預訓練模型的發展,詞向量演變為知識表示方法,但其本質思想不變。學習各種詞向量訓練原理可以很好地掌握NLP各種方法。生成詞向量的方法有很多種,本文重點介紹word2vec,glove和bert。

各種詞向量的特點:

  • One-hot:維度災難 and 語義鴻溝
  • 矩陣分解(LSA):利用全局語料特征,但SVD求解計算復雜度大
  • 基于NNLM/RNNLM的詞向量:詞向量為副產物,存在效率不高等問題
  • word2vec、fastText:優化效率高,但是基于局部語料
  • glove:基于全局預料,結合了LSA和word2vec的優點
  • elmo、GPT、bert:動態特征

從one-hot到word2vec到elmo,可以看到技術的演進總是在現有基礎上解決之前的問題,同時引出新的問題。這里總結一下比較經典的語言模型:word2vec、glove、ELMo、BERT。

word2vec

word2vec來源于2013年的論文《Efficient Estimation of Word Representation in Vector Space》,它的核心思想是利用神經網絡對詞的上下文訓練得到詞的向量化表示,訓練方法:CBOW(通過附近詞預測中心詞)、Skip-gram(通過中心詞預測附近的詞):


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

CBOW與Skip-gram基本結構

  • CBOW :


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

NOTE:花括號內{}為解釋內容.

1.輸入層:上下文單詞的onehot. {假設單詞向量空間dim為V,上下文單詞個數為C}

2.所有onehot分別乘以共享的輸入權重矩陣W. {V*N矩陣,N為自己設定的數,初始化權重矩陣W}

3.所得的向量 {因為是onehot所以為向量} 相加求平均作為隱層向量, size為1*N.

4.乘以輸出權重矩陣W’ {N*V}

5.得到向量 {1*V} 激活函數處理得到V-dim概率分布 {PS: 因為是onehot嘛,其中的每一維斗代表著一個單詞},概率最大的index所指示的單詞為預測出的中間詞(target word)

6.與true label的onehot做比較,誤差越小越好

所以,需要定義loss function(一般為交叉熵代價函數),采用梯度下降算法更新W和W’。訓練完畢后,輸入層的每個單詞與矩陣W相乘得到的向量的就是我們想要的詞向量(word embedding),這個矩陣(所有單詞的word embedding)也叫做look up table(其實聰明的你已經看出來了,其實這個look up table就是矩陣W自身),也就是說,任何一個單詞的onehot乘以這個矩陣都將得到自己的詞向量。有了look up table就可以免去訓練過程直接查表得到單詞的詞向量了。

  • Skip-gram :

跟CBOW的原理相似,它的輸入是目標詞,先是將目標詞映射為一個隱藏層向量,根據這個向量預測目標詞上下文兩個詞,因為詞匯表大和樣本不均衡,同樣也會采用多層softmax或負采樣優化。

  • 分層softmax

一般神經網絡語言模型在預測的時候,輸出的是預測目標詞的概率,也就是說我每一次預測都要基于全部的數據集進行計算,這無疑會帶來很大的時間開銷。不同于其他神經網絡,word2vec提出兩種加快訓練速度的方式,一種是Hierarchical softmax,另一種是Negative Sampling。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

原始神經網絡模型的輸入輸出框架


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

word2vec hierarchical softmax結構

和傳統的神經網絡輸出不同的是,word2vec的hierarchical softmax結構是把輸出層改成了一顆哈夫曼樹,其中圖中白色的葉子節點表示詞匯表中所有的|V|個詞,黑色節點表示非葉子節點,每一個葉子節點也就是每一個單詞,都對應唯一的一條從root節點出發的路徑。我們的目的是使得w=wO這條路徑的概率最大,即: P(w=wO|wI)最大,假設最后輸出的條件概率是W2最大,那么我只需要去更新從根結點到w2這一個葉子結點的路徑上面節點的向量即可,而不需要更新所有的詞的出現概率,這樣大大的縮小了模型訓練更新的時間。

我們應該如何得到某個葉子結點的概率呢?


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

假設我們要計算W2葉子節點的概率,我們需要從根節點到葉子結點計算概率的乘積。我們知道,本模型替代的只是原始模型的softmax層,因此,某個非葉子節點的值即隱藏層到輸出層的結果仍然是uj,我們對這個結果進行sigmoid之后,得到節點往左子樹走的概率p,1-p則為往右子樹走的概率。關于這棵樹的訓練方式比較復雜,但也是通過梯度下降等方法,這里不詳述,感興趣的可以閱讀論文word2vec Parameter Learning Explained。

~~~

(2)、Negative Sampling 負采樣

傳統神經網絡在訓練過程中的每一步,都需要計算詞庫中其他詞在當前的上下文環境下出現的概率值,這導致計算量十分巨大。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

然而,對于word2vec中的特征學習,可以不需要一個完整的概率模型。CBOW和Skip-Gram模型在輸出端使用的是一個二分類器(即Logistic Regression),來區分目標詞和詞庫中其他的 k個詞(也就是把目標詞作為一類,其他詞作為另一類)。下面是一個CBOW模型的圖示,對于Skip-Gram模型輸入輸出是倒置的。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

此時,最大化的目標函數如下:


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

其中,Qθ(D=1|w,h)為二元邏輯回歸的概率,具體為在數據集 D中、輸入的embedding vector θ、上下文為 h的情況下詞語 w 出現的概率;公式后半部分為 k 個從 [噪聲數據集] 中隨機選擇 kk個對立的詞語出現概率(log形式)的期望值。可以看出,目標函數的意義是顯然的,即盡可能的 [分配(assign)] 高概率給真實的目標詞,而低概率給其他 k 個 [噪聲詞],這種技術稱為負采樣(Negative Sampling)。

這種想法來源于噪聲對比評估方法(NEC),大致思想是:假設X=(x1,x2,?,xTd)是從真實的數據(或語料庫)中抽取樣本,但是樣本服從什么樣的分布我們不知道,那么先假設其中的每個xi服從一個未知的概率密度函數pd。這樣我們需要一個相對可參考的分布反過來去估計概率密度函數pd,這個可參考的分布或稱之為噪音分布應該是我們知道的,比如高斯分布,均勻分布等。假設這個噪音分布的概率密度函數pn,從中抽取樣本數據為Y=(y1,y2,?,yTn)Y=(y1,y2,?,yTn),而這個數據稱之為噪聲樣本,我們的目的就是通過學習一個分類器把這兩類樣本區別開來,并能從模型中學到數據的屬性,噪音對比估計的思想就是“通過比較而學習”。

具體來說,word2vec里面的負采樣:將輸出層的V個樣本分為正例(Positive Sample)也就是目標詞對應的項,以及剩余V?1個負例(Negative Samples)。舉個例子有個樣本phone

number,這樣wI=phone,wO=number, 正例就是number這個詞,負例就是不太可能與phone共同出現的詞。負采樣的思想是每次訓練只隨機取一小部分的負例使他們的概率最小,以及對應的正例概率最大。隨機采樣需要假定一個概率分布,word2vec中直接使用詞頻作為詞的分布,不同的是頻數上乘上0.75,相比于直接使用頻次作為權重,取0.75冪的好處可以減弱不同頻次差異過大帶來的影響,使得小頻次的單詞被采樣的概率變大。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

采樣權重

負采樣定義的損失函數如下:


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

損失函數,一部分是正樣本(期望輸出的詞),另一部分是負采樣隨機抽取出來的負樣本**,V’wo是輸出向量

如果大家理解的還不是很深的話,接下來將通過谷歌發布的tensorflow官方word2vec代碼解析加深理解。代碼鏈接:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/word2vec/word2vec_basic.py,之后我會對代碼進行詳細剖析,歡迎跟蹤~謝謝

glove

word2vec只考慮到了詞的局部信息,沒有考慮到詞與局部窗口外詞的聯系,glove利用共現矩陣,同時考慮了局部信息和整體的信息。Count-based模型,如GloVe,本質上是對共現矩陣進行降維。首先,構建一個詞匯的共現矩陣,每一行是一個word,每一列是context。共現矩陣就是計算每個word在每個context出現的頻率。由于context是多種詞匯的組合,其維度非常大,我們希望像network embedding一樣,在context的維度上降維,學習word的低維表示。這一過程可以視為共現矩陣的重構問題,即reconstruction loss。(這里再插一句,降維或者重構的本質是什么?我們選擇留下某個維度和丟掉某個維度的標準是什么?Find the lower-dimensional representations which can explain most of the variance in the high-dimensional data,這其實也是PCA的原理)。

來自論文《Glove: Global vectors for word representation》。Glove損失函數的確定


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

ELMO

之前介紹詞向量均是靜態的詞向量,無法解決一次多義等問題。下面介紹三種elmo、GPT、bert詞向量,它們都是基于語言模型的動態詞向量。下面從幾個方面對這三者進行對比:


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

ELMO是“Embedding from Language Models”簡稱。在此之前word embedding本質是個靜態方式,靜態的意思就是說單詞訓練好之后就固定了,在以后使用時,單詞不會跟著上下文場景變化而變化。如Jobs is the CEO of apple,he finally eat an apple.用word2vec “apple”的表示是一樣的向量,動態模型可以解決此問題。

ELMO的本質思想是:事先用一個語言模型去學習單詞的word embedding, 當在使用時,單詞已經具備了特定的上下文,這時候可以根據上下文的語義去調整單詞的word embedding, 這樣經過調整的word embedding更能表達這個上下文中具體的含義,也就解決了一詞多義問題,故ELMO本質就是根據當前上下文對Word Embedding進行動態調整的過程。

Elmo采用典型的兩階段過程:第一階段使用預訓練語言模型進行訓練,第二階段當做具體的下游任務時,從預訓練的網絡中提取對應的詞的Word Embedding作為特征補充到下游任務中。

第一階段,預訓練:采用雙層雙向LSTM對上下文進行編碼,上下文使用靜態的word embedding, 對每層LSTM,將上文向量與下文向量進行拼接作為當前向量,利用大量的預料訓練這個網絡。對于一個新的句子,可以有三種表示,最底層的word embedding, 第一層的雙向LSTM層的輸出,這一層能學習到更多句法特征,第二層的雙向LSTM的輸出,這一層能學習到更多詞義特征。經過elmo訓練,不僅能夠得到word embedding, 又能學習到一個雙層雙向的神經網絡。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

第二階段,下游任務使用:將一個新的句子作為elmo預訓練網絡的輸入,這樣該句子在elmo網絡中能獲得三個embedding, 可以將三個embedding加權作為word embedding, 并將此作為下游任務的輸入,這被稱為“Feature-based Pre-Training”。

GPT

GPT是Generative Pre-Traxining的簡稱。與ELMO相似,采用兩階段的模式:利用語言模型進行預訓練,通過fine-tuning模式應用到下游任務。

利用語言模型進行預訓練:與elmo不同的是,GPT使用transformer進行提取特征,并且是單向的transformer,只是根據上文來預測某個詞,Transformer模型主要是利用自注意力(self-attention)機制的模型。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

fine-tuning: 與ELMo當成特征的做法不同,OpenAI GPT不需要再重新對任務構建新的模型結構,而是直接在transformer這個語言模型上的最后一層接上softmax作為任務輸出層,然后再對這整個模型進行微調。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

由于不同NLP任務的輸入有所不同,在transformer模型的輸入上針對不同NLP任務也有所不同。具體如下圖,對于分類任務直接講文本輸入即可;對于文本蘊涵任務,需要將前提和假設用一個Delim分割向量拼接后進行輸入;對于文本相似度任務,在兩個方向上都使用Delim拼接后,進行輸入;對于像問答多選擇的任務,就是將每個**和上下文進行拼接進行輸入。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

BERTx

BERT是“Bidirectional Encoder Representations from Transformers”的簡稱。

同GPT采用兩階段模式:利用雙向transformer語言模型進行預訓練,通過fine-tuning模式解決下游任務。

BERT創新: Masked語言模型和Next Sentence Prediction。

BERT(Bidirectional Encoder Representations from Transformers)詳解(參考鏈接:https://plm**ile.github.io/2018/12/15/52-bert/

http://fancyerii.github.io/2019/03/09/bert-theory/#elmo):

1.總體框架:利用半監督學習一個雙向語言模型,然后在下游任務中,經過該語言模型后,接其他任務。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

2. BERT輸入表示(如圖):

句子開頭有一個特殊的Token [CLS]句子結束有一個特殊的Token [SEP]如果是兩個句子同時輸入,則只有開頭有[CLS],后面那個句子沒有[CLS],只有[SEP]每個token有三個embedding,詞的Embedding;位置的Embedding和Segment的Embedding詞embedding不用多說,位置embedding是將位置用低維稠密向量表示,segment的embedding是為了將多個句子區分,第一個句子可能用0表示,第二個用1,只有一個句子的時候可能只用0第一個token很有用,可不能小瞧,因為它本身沒有任何意義,在進行self-attention時,會獲取下文所有信息(編碼整個句子的語義),不像其他單詞,在self-attention時獲取最多的信息是來自于自己。注意這里的分詞會把”playing”分成”play”和”##ing”兩個Token,這種把詞分成更細粒度的Word Piece的方法是一種解決未登錄詞的常見辦法


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

3. BERT預訓練(至關重要的兩點):

  1. Mask language model:遮掩語言模型Next Sentence Prediction:預測下一個句子(關系)

4. Mask language model(遮掩語言模型):在預訓練的時候,隨機mask掉15%的單詞,讓語言模型去預測這個單詞,如圖(圖中512是padding,規定了句子的長度):


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

這樣的話有兩個缺點:

  • 大量mask標記,造成預訓練和finetune時候的差距,因為finetune沒有mask,finetune的時候用的是自己的數據集收斂很慢,但是效果好(比單向語言模型慢)

關于第一條的解決方案:

  • 80%的概率替換成[MASK],比如my dog is hairy → my dog is [MASK]10%的概率替換成隨機的一個詞,比如my dog is hairy → my dog is apple10%的概率替換成它本身,比如my dog is hairy → my dog is hairy這樣的好處在于:BERT并不知道[MASK]替換的是哪一個詞,而且任何一個詞都有可能是被替換掉的,比如它看到的apple可能是被替換的詞。這樣強迫模型在編碼當前時刻的時候不能太依賴于當前的詞,而要考慮它的上下文,甚至更加上下文進行”糾錯”。比如上面的例子模型在編碼apple是根據上下文my dog is應該把apple(部分)編碼成hairy的語義而不是apple的語義。

5. Next Sentence Prediction(預測下一個句子):對于像QA、NLI等需要理解多個句子之間關系的下游任務,只靠語言模型是不夠的。還需要提前學習到句子之間的關系。是一個二分類任務。輸入是A和B兩個句子,標記是IsNext或NotNext,用來判斷B是否是A后面的句子。這樣,就能從大規模預料中學習到一些句間關系。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

  • 對于這個任務,BERT會以50%的概率抽取有關聯的句子(注意這里的句子實際只是聯系的Token序列,不是語言學意義上的句子),另外以50%的概率隨機抽取兩個無關的句子,然后讓BERT模型來判斷這兩個句子是否相關。

6. 下游特定任務:

  • 單句子分類(CLS+句子):

輸入是一個序列,所有的Token都是屬于同一個Segment(Id=0),我們用第一個特殊Token [CLS]的最后一層輸出接上softmax進行分類,用分類的數據來進行Fine-Tuning。利用CLS進行分類。

  • 多句子分類(CLS+句子A+SEP+句子B):

對于相似度計算等輸入為兩個序列的任務,過程如圖左上所示。兩個序列的Token對應不同的Segment(Id=0/1)。我們也是用第一個特殊Token [CLS]的最后一層輸出接上softmax進行分類,然后用分類數據進行Fine-Tuning。利用CLS分類。

  • NER(CLS+句子):序列標注,比如命名實體識別,輸入是一個句子(Token序列),除了[CLS]和[SEP]的每個時刻都會有輸出的Tag,然后用輸出的Tag來進行Fine-Tuning利用句子單詞做標記。QA:CLS+問題+SEP+文章。比較麻煩,比如比如SQuAD v1.1數據集,輸入是一個問題和一段很長的包含**的文字(Paragraph),輸出在這段文字里找到問題的**。

比如輸入的問題是:

Where do water droplets collide with ice crystals to form precipitation?

包含**的文字是:

… Precipitation forms as **aller droplets coalesce via collision with other raindrops or ice crystals within a cloud. …

**是:

”within a cloud”

我們首先把問題和Paragraph表示成一個長的序列,中間用[SEP]分開,問題對應一個Segment(id=0),包含**的文字對于另一個Segment(id=1)。這里有一個假設,那就是**是Paragraph里的一段連續的文字(Span)。BERT把尋找**的問題轉化成尋找這個Span的開始下標和結束下標的問題。

對于Paragraph的第i個Token,BERT的最后一層把它編碼成Ti,然后我們用一個向量S(這是模型的參數,需要根據訓練數據調整)和它相乘(內積)計算它是開始位置的得分,因為Paragraph的每一個Token(當然WordPiece的中間,比如##ing是不可能是開始的)都有可能是開始可能,我們用softmax把它變成概率,然后選擇概率最大的作為**的開始:


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

類似的有一個向量T,用于計算**結束的位置。


詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)

總結

word2vec: nlp中最早的預訓練模型,缺點是無法解決一詞多義問題.

ELMO:

優點: 根據上下文動態調整word embedding,因為可以解決一詞多義問題;

缺點:1、使用LSTM特征抽取方式而不是transformer,2、使用向量拼接方式融合上下文特征融合能力較弱,偽雙向。

GPT:.

優點:使用transformer提取特征

缺點:使用單項的語言模型,即單向transformer.

BERT: 優點:使用雙向語言模型,即使用雙向transformer;使用預測目標詞和下一句這中多任務學習方式進行訓練。

缺點:對文本字數512限制,不利于文本生成。

參考:

https://zhuanlan.zhihu.com/p/35074402

https://www.zhihu.com/question/44832436/answer/266068967

https://zhuanlan.zhihu.com/p/53425736

https://www.cnblogs.com/robert-dlut/p/9824346.html

詞向量詳解:從word2vec、glove、ELMo到BERT(向量的起源和發展詳解)
本文原作者為陳楚楚,轉載請注明:出處!如該文有不妥之處,請聯系站長刪除,謝謝合作~

原創文章,作者:陳楚楚,如若轉載,請注明出處:http://www.uuuxu.com/20220512316510.html

主站蜘蛛池模板: 舒兰市| 潮安县| 青海省| 临猗县| 宜良县| 荥阳市| 蒙阴县| 南平市| 石屏县| 博客| 宜阳县| 潮安县| 庄河市| 乡宁县| 河西区| 沅江市| 泽普县| 梨树县| 凉山| 云安县| 昆明市| 锡林浩特市| 尼木县| 麦盖提县| 佛学| 瓦房店市| 黑水县| 延长县| 河北区| 来宾市| 华池县| 鹿邑县| 丹江口市| 衢州市| 敖汉旗| 海伦市| 柞水县| 绥中县| 藁城市| 陇南市| 顺义区|