NLP入門實戰(zhàn)——基于深度學(xué)習(xí)的文本分類2

之前有介紹基于機器學(xué)習(xí)的文本分類:http://m.itdecent.cn/p/2f1cb73fefb5

基于深度學(xué)習(xí)的文本分類:http://m.itdecent.cn/p/77a51a3fc298

本文介紹第二種基于深度學(xué)習(xí)的文本分類

一、文本表示法3

本節(jié)通過word2vec學(xué)習(xí)詞向量。word2vec模型背后的基本思想是對出現(xiàn)在上下文環(huán)境里的詞進行預(yù)測。對于每一條輸入文本,我們選取一個上下文窗口和一個中心詞,并基于這個中心詞去預(yù)測窗口里其他詞出現(xiàn)的概率。因此,word2vec模型可以方便地從新增語料中學(xué)習(xí)到新增詞的向量表達(dá),是一種高效的在線學(xué)習(xí)算法(online learning)。

word2vec的主要思路:通過單詞和上下文彼此預(yù)測,對應(yīng)的兩個算法分別為:

· Skip-grams (SG):預(yù)測上下文

· Continuous Bag of Words (CBOW):預(yù)測目標(biāo)單詞

另外提出兩種更加高效的訓(xùn)練方法:

· Hierarchical softmax

· Negative sampling

1. Skip-grams

Word2Vec模型中,主要有Skip-Gram和CBOW兩種模型,從直觀上理解,Skip-Gram是給定input word來預(yù)測上下文。而CBOW是給定上下文,來預(yù)測input word。

Word2Vec模型實際上分為了兩個部分,第一部分為建立模型,第二部分是通過模型獲取嵌入詞向量。

Word2Vec的整個建模過程實際上與自編碼器(auto-encoder)的思想很相似,即先基于訓(xùn)練數(shù)據(jù)構(gòu)建一個神經(jīng)網(wǎng)絡(luò),當(dāng)這個模型訓(xùn)練好以后,我們并不會用這個訓(xùn)練好的模型處理新的任務(wù),我們真正需要的是這個模型通過訓(xùn)練數(shù)據(jù)所學(xué)得的參數(shù),例如隱層的權(quán)重矩陣——后面我們將會看到這些權(quán)重在Word2Vec中實際上就是我們試圖去學(xué)習(xí)的“word vectors”。

Skip-grams過程

假如我們有一個句子“The dog barked at the mailman”。

首先我們選句子中間的一個詞作為我們的輸入詞,例如我們選取“dog”作為input word;

有了input word以后,我們再定義一個叫做skip_window的參數(shù),它代表著我們從當(dāng)前input word的一側(cè)(左邊或右邊)選取詞的數(shù)量。如果我們設(shè)置skip_window=2,那么我們最終獲得窗口中的詞(包括input word在內(nèi))就是['The', 'dog','barked', 'at']。skip_window=2代表著選取左input word左側(cè)2個詞和右側(cè)2個詞進入我們的窗口,所以整個窗口大小span=2x2=4。另一個參數(shù)叫num_skips,它代表著我們從整個窗口中選取多少個不同的詞作為我們的output word,當(dāng)skip_window=2,num_skips=2時,我們將會得到兩組 (input word, output word) 形式的訓(xùn)練數(shù)據(jù),即 ('dog', 'barked'),('dog', 'the')。

神經(jīng)網(wǎng)絡(luò)基于這些訓(xùn)練數(shù)據(jù)將會輸出一個概率分布,這個概率代表著我們的詞典中的每個詞作為input word的output word的可能性。這句話有點繞,我們來看個例子。第二步中我們在設(shè)置skip_window和num_skips=2的情況下獲得了兩組訓(xùn)練數(shù)據(jù)。假如我們先拿一組數(shù)據(jù) ('dog', 'barked') 來訓(xùn)練神經(jīng)網(wǎng)絡(luò),那么模型通過學(xué)習(xí)這個訓(xùn)練樣本,會告訴我們詞匯表中每個單詞當(dāng)'dog'作為input word時,其作為output word的可能性。

也就是說模型的輸出概率代表著到我們詞典中每個詞有多大可能性跟input word同時出現(xiàn)。例如:如果我們向神經(jīng)網(wǎng)絡(luò)模型中輸入一個單詞“Soviet“,那么最終模型的輸出概率中,像“Union”, ”Russia“這種相關(guān)詞的概率將遠(yuǎn)高于像”watermelon“,”kangaroo“非相關(guān)詞的概率。因為”Union“,”Russia“在文本中更大可能在”Soviet“的窗口中出現(xiàn)。

我們將通過給神經(jīng)網(wǎng)絡(luò)輸入文本中成對的單詞來訓(xùn)練它完成上面所說的概率計算。下面的圖中給出了一些我們訓(xùn)練樣本的例子。我們選定句子“The quick brown fox jumps over lazy dog”,設(shè)定我們的窗口大小為2(window_size=2),也就是說我們僅選輸入詞前后各兩個詞和輸入詞進行組合。下圖中,藍(lán)色代表input word,方框內(nèi)代表位于窗口內(nèi)的單詞。

我們的模型將會從每對單詞出現(xiàn)的次數(shù)中習(xí)得統(tǒng)計結(jié)果。例如,我們的神經(jīng)網(wǎng)絡(luò)可能會得到更多類似(“Soviet“,”Union“)這樣的訓(xùn)練樣本對,而對于(”Soviet“,”Sasquatch“)這樣的組合卻看到的很少。因此,當(dāng)我們的模型完成訓(xùn)練后,給定一個單詞”Soviet“作為輸入,輸出的結(jié)果中”Union“或者”Russia“要比”Sasquatch“被賦予更高的概率。

PS:input word和output word都會被我們進行one-hot編碼。仔細(xì)想一下,我們的輸入被one-hot編碼以后大多數(shù)維度上都是0(實際上僅有一個位置為1),所以這個向量相當(dāng)稀疏,那么會造成什么結(jié)果呢。如果我們將一個1 x 10000的向量和10000 x 300的矩陣相乘,它會消耗相當(dāng)大的計算資源,為了高效計算,它僅僅會選擇矩陣中對應(yīng)的向量中維度值為1的索引行:

Skip-grams訓(xùn)練

由上部分可知,Word2Vec模型是一個超級大的神經(jīng)網(wǎng)絡(luò)(權(quán)重矩陣規(guī)模非常大)。例如:我們擁有10000個單詞的詞匯表,我們?nèi)绻肭度?00維的詞向量,那么我們的輸入-隱層權(quán)重矩陣和隱層-輸出層的權(quán)重矩陣都會有 10000 x 300 = 300萬個權(quán)重,在如此龐大的神經(jīng)網(wǎng)絡(luò)中進行梯度下降是相當(dāng)慢的。更糟糕的是,你需要大量的訓(xùn)練數(shù)據(jù)來調(diào)整這些權(quán)重并且避免過擬合。百萬數(shù)量級的權(quán)重矩陣和億萬數(shù)量級的訓(xùn)練樣本意味著訓(xùn)練這個模型將會是個災(zāi)難

解決方案:

將常見的單詞組合(word pairs)或者詞組作為單個“words”來處理

對高頻次單詞進行抽樣來減少訓(xùn)練樣本的個數(shù)

對優(yōu)化目標(biāo)采用“negative sampling”方法,這樣每個訓(xùn)練樣本的訓(xùn)練只會更新一小部分的模型權(quán)重,從而降低計算負(fù)擔(dān)

Word pairs and "phases"

一些單詞組合(或者詞組)的含義和拆開以后具有完全不同的意義。比如“Boston Globe”是一種報刊的名字,而單獨的“Boston”和“Globe”這樣單個的單詞卻表達(dá)不出這樣的含義。因此,在文章中只要出現(xiàn)“Boston Globe”,我們就應(yīng)該把它作為一個單獨的詞來生成其詞向量,而不是將其拆開。同樣的例子還有“New York”,“United Stated”等。

在Google發(fā)布的模型中,它本身的訓(xùn)練樣本中有來自Google News數(shù)據(jù)集中的1000億的單詞,但是除了單個單詞以外,單詞組合(或詞組)又有3百萬之多。

對高頻詞抽樣

在上一部分中,對于原始文本為“The quick brown fox jumps over the laze dog”,如果使用大小為2的窗口,那么我們可以得到圖中展示的那些訓(xùn)練樣本。

但是對于“the”這種常用高頻單詞,這樣的處理方式會存在下面兩個問題:

當(dāng)我們得到成對的單詞訓(xùn)練樣本時,("fox", "the") 這樣的訓(xùn)練樣本并不會給我們提供關(guān)于“fox”更多的語義信息,因為“the”在每個單詞的上下文中幾乎都會出現(xiàn)

由于在文本中“the”這樣的常用詞出現(xiàn)概率很大,因此我們將會有大量的(”the“,…)這樣的訓(xùn)練樣本,而這些樣本數(shù)量遠(yuǎn)遠(yuǎn)超過了我們學(xué)習(xí)“the”這個詞向量所需的訓(xùn)練樣本數(shù)

Word2Vec通過“抽樣”模式來解決這種高頻詞問題。它的基本思想如下:對于我們在訓(xùn)練原始文本中遇到的每一個單詞,它們都有一定概率被我們從文本中刪掉,而這個被刪除的概率與單詞的頻率有關(guān)。

ωi 是一個單詞,Z(ωi) 是 ωi 這個單詞在所有語料中出現(xiàn)的頻次,例如:如果單詞“peanut”在10億規(guī)模大小的語料中出現(xiàn)了1000次,那么 Z(peanut) = 1000/1000000000 = 1e - 6。

P(ωi) 代表著保留某個單詞的概率:

2. Negative sampling

訓(xùn)練一個神經(jīng)網(wǎng)絡(luò)意味著要輸入訓(xùn)練樣本并且不斷調(diào)整神經(jīng)元的權(quán)重,從而不斷提高對目標(biāo)的準(zhǔn)確預(yù)測。每當(dāng)神經(jīng)網(wǎng)絡(luò)經(jīng)過一個訓(xùn)練樣本的訓(xùn)練,它的權(quán)重就會進行一次調(diào)整。

所以,詞典的大小決定了我們的Skip-Gram神經(jīng)網(wǎng)絡(luò)將會擁有大規(guī)模的權(quán)重矩陣,所有的這些權(quán)重需要通過數(shù)以億計的訓(xùn)練樣本來進行調(diào)整,這是非常消耗計算資源的,并且實際中訓(xùn)練起來會非常慢。

負(fù)采樣(negative sampling)解決了這個問題,它是用來提高訓(xùn)練速度并且改善所得到詞向量的質(zhì)量的一種方法。不同于原本每個訓(xùn)練樣本更新所有的權(quán)重,負(fù)采樣每次讓一個訓(xùn)練樣本僅僅更新一小部分的權(quán)重,這樣就會降低梯度下降過程中的計算量。

當(dāng)我們用訓(xùn)練樣本 ( input word: "fox",output word: "quick") 來訓(xùn)練我們的神經(jīng)網(wǎng)絡(luò)時,“ fox”和“quick”都是經(jīng)過one-hot編碼的。如果我們的詞典大小為10000時,在輸出層,我們期望對應(yīng)“quick”單詞的那個神經(jīng)元結(jié)點輸出1,其余9999個都應(yīng)該輸出0。在這里,這9999個我們期望輸出為0的神經(jīng)元結(jié)點所對應(yīng)的單詞我們稱為“negative” word。

當(dāng)使用負(fù)采樣時,我們將隨機選擇一小部分的negative words(比如選5個negative words)來更新對應(yīng)的權(quán)重。我們也會對我們的“positive” word進行權(quán)重更新(在我們上面的例子中,這個單詞指的是”quick“)。

PS: 在論文中,作者指出指出對于小規(guī)模數(shù)據(jù)集,選擇5-20個negative words會比較好,對于大規(guī)模數(shù)據(jù)集可以僅選擇2-5個negative words。

我們使用“一元模型分布(unigram distribution)”來選擇“negative words”。個單詞被選作negative sample的概率跟它出現(xiàn)的頻次有關(guān),出現(xiàn)頻次越高的單詞越容易被選作negative words。

每個單詞被選為“negative words”的概率計算公式:

其中 f(ωi)代表著單詞出現(xiàn)的頻次,而公式中開3/4的根號完全是基于經(jīng)驗的。

在代碼負(fù)采樣的代碼實現(xiàn)中,unigram table有一個包含了一億個元素的數(shù)組,這個數(shù)組是由詞匯表中每個單詞的索引號填充的,并且這個數(shù)組中有重復(fù),也就是說有些單詞會出現(xiàn)多次。那么每個單詞的索引在這個數(shù)組中出現(xiàn)的次數(shù)該如何決定呢,有公式,也就是說計算出的負(fù)采樣概率*1億=單詞在表中出現(xiàn)的次數(shù)。

有了這張表以后,每次去我們進行負(fù)采樣時,只需要在0-1億范圍內(nèi)生成一個隨機數(shù),然后選擇表中索引號為這個隨機數(shù)的那個單詞作為我們的negative word即可。一個單詞的負(fù)采樣概率越大,那么它在這個表中出現(xiàn)的次數(shù)就越多,它被選中的概率就越大。

3. Hierarchical Softmax

3.1 霍夫曼樹

輸入:權(quán)值為(w1,w2,…wn)的n個節(jié)點

輸出:對應(yīng)的霍夫曼樹

將(w1,w2,…wn)看做是有n棵樹的森林,每個樹僅有一個節(jié)點

在森林中選擇根節(jié)點權(quán)值最小的兩棵樹進行合并,得到一個新的樹,這兩顆樹分布作為新樹的左右子樹。新樹的根節(jié)點權(quán)重為左右子樹的根節(jié)點權(quán)重之和

將之前的根節(jié)點權(quán)值最小的兩棵樹從森林刪除,并把新樹加入森林

重復(fù)步驟 2 和 3 直到森林里只有一棵樹為止

下面我們用一個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節(jié)點,節(jié)點的權(quán)值分布是(16,4,8,6,20,3)。

首先是最小的b和f合并,得到的新樹根節(jié)點權(quán)重是7.此時森林里5棵樹,根節(jié)點權(quán)重分別是16,8,6,20,7。此時根節(jié)點權(quán)重最小的6,7合并,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

那么霍夫曼樹有什么好處呢?一般得到霍夫曼樹后我們會對葉子節(jié)點進行霍夫曼編碼,由于權(quán)重高的葉子節(jié)點越靠近根節(jié)點,而權(quán)重低的葉子節(jié)點會遠(yuǎn)離根節(jié)點,這樣我們的高權(quán)重節(jié)點編碼值較短,而低權(quán)重值編碼值較長。這保證的樹的帶權(quán)路徑最短,也符合我們的信息論,即我們希望越常用的詞擁有更短的編碼。如何編碼呢?一般對于一個霍夫曼樹的節(jié)點(根節(jié)點除外),可以約定左子樹編碼為0,右子樹編碼為1。如上圖,則可以得到c的編碼是00。

在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權(quán)重不小于右子樹的權(quán)重。

更多原理可參考:霍夫曼樹原理

3.2Hierarchical Softmax過程

為了避免要計算所有詞的softmax概率,word2vec采樣了霍夫曼樹來代替從隱藏層到輸出softmax層的映射。

霍夫曼樹的建立:

根據(jù)標(biāo)簽(label)和頻率建立霍夫曼樹(label出現(xiàn)的頻率越高,Huffman樹的路徑越短)

Huffman樹中每一葉子結(jié)點代表一個label

注意:此時的theta是一個待定系數(shù),它是由推導(dǎo)最大似然之后求解得到迭代式子。

使用gensim訓(xùn)練word2vec

參考:

CS224n筆記2 詞的向量表示:word2vec

斯坦福大學(xué)深度學(xué)習(xí)與自然語言處理第二講:詞向量

(Stanford CS224d) Deep Learning and NLP課程筆記(三):GloVe與模型的評估

http://www.cnblogs.com/pinard/p/7249903.html

https://blog.csdn.net/yinkun6514/article/details/79218736

https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html

TextCNN

TextCNN利用CNN(卷積神經(jīng)網(wǎng)絡(luò))進行文本特征抽取,不同大小的卷積核分別抽取n-gram特征,卷積計算出的特征圖經(jīng)過MaxPooling保留最大的特征值,然后將拼接成一個向量作為文本的表示。

這里我們基于TextCNN原始論文的設(shè)定,分別采用了100個大小為2,3,4的卷積核,最后得到的文本向量大小為100*3=300維。

TextRNN

TextRNN利用RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))進行文本特征抽取,由于文本本身是一種序列,而LSTM天然適合建模序列數(shù)據(jù)。TextRNN將句子中每個詞的詞向量依次輸入到雙向雙層LSTM,分別將兩個方向最后一個有效位置的隱藏層拼接成一個向量作為文本的表示。

使用HAN用于文本分類

Hierarchical Attention Network for Document Classification(HAN)基于層級注意力,在單詞和句子級別分別編碼并基于注意力獲得文檔的表示,然后經(jīng)過Softmax進行分類。其中word encoder的作用是獲得句子的表示,可以替換為上節(jié)提到的TextCNN和TextRNN,也可以替換為下節(jié)中的BERT。

參考:

https://mp.weixin.qq.com/s/I-yeHQopTFdNk67Ir_iWiA

https://github.com/hecongqing/2018-daguan-competition

?著作權(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)容