embedding詞向量介紹

原創(chuàng)作品,轉(zhuǎn)載請注明出處

1.1 背景介紹

假設(shè)現(xiàn)在領(lǐng)導(dǎo)給你布置了一項任務(wù),對產(chǎn)品的消費者評價進行情感分類。聰明的你很自然的想到了nlp,那么具體要怎么做呢。

要對評論進行分類,首先我們需要先把評論用計算機可以理解的形式表達出來。最直接的方法先構(gòu)建評論中所有提及的詞匯,將其放入一個字典中。再對每句話中詞匯進行計數(shù),然后用詞匯的數(shù)量來表示一句話。例如以下兩句話:



提及的詞匯有六個,

這時這兩句話的表達就出來了,如下圖所示

這種表示方法一般稱之為詞袋子,就是將所有詞都統(tǒng)一丟到袋子中再進行計數(shù),不考慮先后順序。此外相似的方法還有tfidf表達。這種方法不涉及對詞匯本身的表達,只能用于表達句子。

那么我們要怎么表示詞匯呢?首先我們來思考一個問題,為什么要對詞匯進行表達?這是因為,有了對詞匯的表達,不同句子包含相同詞匯時,在含義上就被聯(lián)系在一起,使用詞匯計數(shù)來表達是很難獲取這個信息的。

詞匯表達最簡單的方法就是one-hot編碼,就是使用一個詞表長度的向量來表示,詞匯在詞表中所處位置為1,其他都為0,如下所示。

One-hot向量表示的缺點很明顯,當(dāng)詞表越來越大的時候,表達每個詞匯的向量也就越來越長,而且這個矩陣是肉眼可見的稀疏,這非常不利于深度學(xué)習(xí)模型的計算。因此,Duang Duang Duang,下面有請我們的主角,embedding詞向量。

Embedding這個詞這幾年非常的火爆,所謂萬物皆可embedding。那么embedding到底是什么含義呢?在我看來,embedding就是對一個對象的分布式表達。這里的分布式表達可以理解成一個n維的向量。這n維向量的含義是固定且不明確的,每個對象的表達相當(dāng)于是對象在這n維向量上的映射。

還是有點抽象,看完下面我們?nèi)绾蔚玫絜mbedding詞向量,應(yīng)該會有新的理解。

1.2 Embedding的傳統(tǒng)模型

最早的embedding向量是Bengio在2003的論文A Neural Probabilistic Language Model中提出。原論文的圖畫的不太好,這里就不貼了。模型有四層,輸入層是句子的中每個詞匯的索引,隱層是將每個詞從embedding詞表中查出對應(yīng)詞匯的表達,再經(jīng)過的tanh激活層,最后接一個softmax,預(yù)測對象是下個詞匯,可以看到這是一個非監(jiān)督語言模型。其中的embedding詞表是可訓(xùn)練的,最終就可以得到每個詞匯的向量表達。

現(xiàn)在回過頭來看這篇論文可以說是很超前了,但在當(dāng)時神經(jīng)網(wǎng)絡(luò)完全沒什么人氣,這篇論文也就被埋沒了。下面就到了2013年。

2013年Mikolov提出了word2vec,wordvec的模型結(jié)構(gòu)和NNLM很接近。區(qū)別在于word2vec的輸入是onehot編碼的,將onehot(長度為詞表長度N)輸入乘以參數(shù)W(參數(shù)W其實就是每個詞的詞向量,是可訓(xùn)練的),這個過程和NNLM模型的查表的功能是一致的。將得到的矩陣通過softmax得到最終預(yù)測的結(jié)果。Wordvec有兩種結(jié)構(gòu)(見圖1),一個是利用上下文來預(yù)測中間的詞匯,稱之為CBOW,另一個是利用中間的詞匯來預(yù)測上下文的詞匯,稱為Skip-gram。

圖1 wordvec中兩種模型結(jié)構(gòu)

1.3 Embedding 較新模型(ELMO、GPT、BERT、XLNET簡介)(選讀)

word2vec不能解決一詞多義的問題,因為這個模型是靜態(tài)的,詞向量被訓(xùn)練好之后就固定下來了。蘋果電腦和吃蘋果中的蘋果會有一樣的向量表達。而這顯然是不合理的。

ELMO嘗試解決這個問題,這個模型使用了兩層bi-lstm,這里的雙向分別對上文和下文進行編碼,任務(wù)和CBOW是一樣也是使用n個上下文去預(yù)測中間詞。在最終計算一個詞向量時,會將最下面的單詞特征向量和上兩層bi-lstm中得到的上下特征進行加和。在最終應(yīng)用模型的時候,會先計算在當(dāng)前輸入下詞向量的表達再放進任務(wù)模型中。
ELMO這種在編碼時直接將詞上下文加進向量表達的方式很好的解決了一詞多義的問題

GPT做了什么呢?這個模型采用了和ELMO類型的訓(xùn)練過程,只是將其中的bi-lstm改成了transformer,但是只使用了上文信息來預(yù)測單詞,沒有使用下文

BERT是怎么做的呢,BERT和GPT的主要區(qū)別在于使用雙向的語言模型,同時考慮了上下文對文本的影響

最近又新出了一個 XLNET,效果較BERT又有了很大的提升,他是怎么做的呢

BERT在預(yù)訓(xùn)練中使用了mask機制,將15%的單詞替換成mask,在這些mask單詞中只有80%被替換成了【mask】,10%被隨機替換成另一個單詞,10%的單詞不變

由于在正式的任務(wù)中不會有帶有mask的數(shù)據(jù),會對應(yīng)用效果造成一定的影響。XLNET主要的貢獻是解決了mask帶來的負面影響。XLNET具體做法:在預(yù)訓(xùn)練階段引入 Permutation Language Model,在預(yù)測單詞A的時候,將其他幾個單詞的順序隨機打亂,這樣就可以利用上下文的信息。具體實現(xiàn)是通過attention的掩碼機制,將其他被放到目標單詞下文中的單詞隱藏掉,因此XLNET中沒有明顯的mask,回避掉了mask的負面影響,但其實使用 Attention實現(xiàn)了同樣的功能。

1.4 Embedding流派劃分

預(yù)訓(xùn)練語言表達主要有兩個流派,一個是非監(jiān)督的基于特征的方法,之前提到的CBOW就是這樣的方法,模型的輸出是詞向量,可以直接放入下游模型中。 ELMO也是屬于這一流派的模型,但是沒有可以直接拿來用的詞向量。使用的時候,需要將待處理的文本,預(yù)訓(xùn)練詞向量(如Word2vec),前人訓(xùn)練好的模型參數(shù)和結(jié)構(gòu)一起放入ELMO模型中得到新的文本向量表達,這個新的向量表達可以很好的區(qū)分同一個詞在不同語境中的不同含義。后續(xù)就可以將這個新的向量表達直接放入下游任務(wù)模型中去使用了。

另一個流派是fine-tuning方法,也就是微調(diào)。這個方法的代表模型是GPT和BERT,該類模型的優(yōu)點是可以在預(yù)訓(xùn)練階段訓(xùn)練盡可能復(fù)雜的模型,盡可能多的數(shù)據(jù),在微調(diào)階段只需要根據(jù)任務(wù)重新學(xué)習(xí)部分參數(shù)就可以達到比較高的準確率。這個方法是從圖像領(lǐng)域中借鑒過來的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容