原創(chuàng)作品电湘,轉(zhuǎn)載請注明出處
1.1 背景介紹
假設(shè)現(xiàn)在領(lǐng)導(dǎo)給你布置了一項任務(wù)梅屉,對產(chǎn)品的消費者評價進(jìn)行情感分類。聰明的你很自然的想到了nlp彪薛,那么具體要怎么做呢茂装。
要對評論進(jìn)行分類,首先我們需要先把評論用計算機(jī)可以理解的形式表達(dá)出來善延。最直接的方法先構(gòu)建評論中所有提及的詞匯少态,將其放入一個字典中。再對每句話中詞匯進(jìn)行計數(shù)易遣,然后用詞匯的數(shù)量來表示一句話彼妻。例如以下兩句話:
提及的詞匯有六個,
這時這兩句話的表達(dá)就出來了,如下圖所示
這種表示方法一般稱之為詞袋子侨歉,就是將所有詞都統(tǒng)一丟到袋子中再進(jìn)行計數(shù)屋摇,不考慮先后順序。此外相似的方法還有tfidf表達(dá)幽邓。這種方法不涉及對詞匯本身的表達(dá)炮温,只能用于表達(dá)句子。
那么我們要怎么表示詞匯呢牵舵?首先我們來思考一個問題柒啤,為什么要對詞匯進(jìn)行表達(dá)?這是因為畸颅,有了對詞匯的表達(dá)担巩,不同句子包含相同詞匯時,在含義上就被聯(lián)系在一起没炒,使用詞匯計數(shù)來表達(dá)是很難獲取這個信息的涛癌。
詞匯表達(dá)最簡單的方法就是one-hot編碼,就是使用一個詞表長度的向量來表示窥浪,詞匯在詞表中所處位置為1祖很,其他都為0,如下所示漾脂。
One-hot向量表示的缺點很明顯假颇,當(dāng)詞表越來越大的時候,表達(dá)每個詞匯的向量也就越來越長骨稿,而且這個矩陣是肉眼可見的稀疏笨鸡,這非常不利于深度學(xué)習(xí)模型的計算。因此坦冠,Duang Duang Duang形耗,下面有請我們的主角,embedding詞向量辙浑。
Embedding這個詞這幾年非常的火爆激涤,所謂萬物皆可embedding。那么embedding到底是什么含義呢判呕?在我看來倦踢,embedding就是對一個對象的分布式表達(dá)。這里的分布式表達(dá)可以理解成一個n維的向量侠草。這n維向量的含義是固定且不明確的辱挥,每個對象的表達(dá)相當(dāng)于是對象在這n維向量上的映射。
還是有點抽象边涕,看完下面我們?nèi)绾蔚玫絜mbedding詞向量晤碘,應(yīng)該會有新的理解褂微。
1.2 Embedding的傳統(tǒng)模型
最早的embedding向量是Bengio在2003的論文A Neural Probabilistic Language Model中提出。原論文的圖畫的不太好园爷,這里就不貼了宠蚂。模型有四層,輸入層是句子的中每個詞匯的索引腮介,隱層是將每個詞從embedding詞表中查出對應(yīng)詞匯的表達(dá)肥矢,再經(jīng)過的tanh激活層端衰,最后接一個softmax叠洗,預(yù)測對象是下個詞匯,可以看到這是一個非監(jiān)督語言模型旅东。其中的embedding詞表是可訓(xùn)練的灭抑,最終就可以得到每個詞匯的向量表達(dá)。
現(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.3 Embedding 較新模型(ELMO棒妨、GPT、BERT含长、XLNET簡介)(選讀)
word2vec不能解決一詞多義的問題券腔,因為這個模型是靜態(tài)的,詞向量被訓(xùn)練好之后就固定下來了茎芋。蘋果電腦和吃蘋果中的蘋果會有一樣的向量表達(dá)颅眶。而這顯然是不合理的。
ELMO嘗試解決這個問題田弥,這個模型使用了兩層bi-lstm涛酗,這里的雙向分別對上文和下文進(jìn)行編碼,任務(wù)和CBOW是一樣也是使用n個上下文去預(yù)測中間詞。在最終計算一個詞向量時商叹,會將最下面的單詞特征向量和上兩層bi-lstm中得到的上下特征進(jìn)行加和燕刻。在最終應(yīng)用模型的時候,會先計算在當(dāng)前輸入下詞向量的表達(dá)再放進(jìn)任務(wù)模型中剖笙。
ELMO這種在編碼時直接將詞上下文加進(jìn)向量表達(dá)的方式很好的解決了一詞多義的問題
GPT做了什么呢卵洗?這個模型采用了和ELMO類型的訓(xùn)練過程,只是將其中的bi-lstm改成了transformer弥咪,但是只使用了上文信息來預(yù)測單詞过蹂,沒有使用下文
BERT是怎么做的呢,BERT和GPT的主要區(qū)別在于使用雙向的語言模型聚至,同時考慮了上下文對文本的影響
最近又新出了一個 XLNET酷勺,效果較BERT又有了很大的提升,他是怎么做的呢
BERT在預(yù)訓(xùn)練中使用了mask機(jī)制扳躬,將15%的單詞替換成mask脆诉,在這些mask單詞中只有80%被替換成了【mask】,10%被隨機(jī)替換成另一個單詞贷币,10%的單詞不變
由于在正式的任務(wù)中不會有帶有mask的數(shù)據(jù)击胜,會對應(yīng)用效果造成一定的影響。XLNET主要的貢獻(xiàn)是解決了mask帶來的負(fù)面影響役纹。XLNET具體做法:在預(yù)訓(xùn)練階段引入 Permutation Language Model偶摔,在預(yù)測單詞A的時候,將其他幾個單詞的順序隨機(jī)打亂字管,這樣就可以利用上下文的信息啰挪。具體實現(xiàn)是通過attention的掩碼機(jī)制,將其他被放到目標(biāo)單詞下文中的單詞隱藏掉嘲叔,因此XLNET中沒有明顯的mask亡呵,回避掉了mask的負(fù)面影響,但其實使用 Attention實現(xiàn)了同樣的功能硫戈。
1.4 Embedding流派劃分
預(yù)訓(xùn)練語言表達(dá)主要有兩個流派锰什,一個是非監(jiān)督的基于特征的方法,之前提到的CBOW就是這樣的方法丁逝,模型的輸出是詞向量汁胆,可以直接放入下游模型中。 ELMO也是屬于這一流派的模型霜幼,但是沒有可以直接拿來用的詞向量嫩码。使用的時候,需要將待處理的文本罪既,預(yù)訓(xùn)練詞向量(如Word2vec)铸题,前人訓(xùn)練好的模型參數(shù)和結(jié)構(gòu)一起放入ELMO模型中得到新的文本向量表達(dá)铡恕,這個新的向量表達(dá)可以很好的區(qū)分同一個詞在不同語境中的不同含義。后續(xù)就可以將這個新的向量表達(dá)直接放入下游任務(wù)模型中去使用了丢间。
另一個流派是fine-tuning方法探熔,也就是微調(diào)。這個方法的代表模型是GPT和BERT烘挫,該類模型的優(yōu)點是可以在預(yù)訓(xùn)練階段訓(xùn)練盡可能復(fù)雜的模型诀艰,盡可能多的數(shù)據(jù),在微調(diào)階段只需要根據(jù)任務(wù)重新學(xué)習(xí)部分參數(shù)就可以達(dá)到比較高的準(zhǔn)確率饮六。這個方法是從圖像領(lǐng)域中借鑒過來的其垄。