基于神经网络的文本特征提取——从词汇特征表示到文本向量
在實際系統(tǒng)我們會接觸到許許多多的文本類型數(shù)據(jù)。如何將這部分?jǐn)?shù)據(jù)用于作為機(jī)器學(xué)習(xí)模型的輸入呢?一個常用的方法是將文本轉(zhuǎn)化為一個能很好的表示它的向量,這里將稱該向量稱作為文本向量。本文將以盡可能少的數(shù)學(xué)公式介紹目前業(yè)界比較流行的基于神經(jīng)網(wǎng)絡(luò)進(jìn)行文本特征提取,得到文本向量的方案。
1. 背景知識
這部分內(nèi)容將介紹線性回歸、梯度下降、神經(jīng)網(wǎng)絡(luò)、反向傳播。對于有基礎(chǔ)的同學(xué)這部分可以跳過,對于之前沒有接觸過相關(guān)知識點的同學(xué),我會用盡可能少的公式去介紹。希望能講明白 ==
1.1 線性回歸模型
其實線性回歸模型很簡單,它類似于我們中學(xué)學(xué)的多元一次方程的形式,如:
1.2 梯度下降
哪我們?nèi)绾握业阶罴训膮?shù)W和b呢?業(yè)界最流行的方法就是使用梯度下降。?
梯度下降法的形象化說明:?
在這個碗形圖中,橫軸表示參數(shù)W和b,在實踐中,可以是更高的維度。?
如圖那個小紅點,采用隨機(jī)初始化的方法初始化的參數(shù)W和b:
我們的目標(biāo)是將它下落到碗形圖的最底部,即min(J(w,b)):
那紅點會怎么下落呢?回想下中學(xué)學(xué)的物理就很形象了,我們先只看ww軸。沒錯,沿著斜率方向下降,紅點會快的接近碗底。
當(dāng)然,如何一直沿著最初的斜率方向走是不能到達(dá)碗底的,而應(yīng)該一小步一小步的走,每走一步調(diào)整方向為當(dāng)前的斜率方向:
對于b軸也類似,那么紅點就會如下圖一步一步的下降:
于是每一步我們更新參數(shù)為:
其中?α?為每一步的步長。?
這樣不斷的迭代,不斷的下降,參數(shù)W和b的取值就不斷的被優(yōu)化了。
1.3 神經(jīng)網(wǎng)絡(luò)
我們先來介紹單個神經(jīng)元的模型結(jié)構(gòu),如下圖:?
1.3.1 激活函數(shù)
唯一不同的是神經(jīng)元里面還可以存在激活函數(shù),如果神經(jīng)元沒激活函數(shù),那么就和上文講的線性回歸模型基本上一模一樣。常見的激活函數(shù)有:?
- sigmoid函數(shù)
-Tanh函數(shù)?
-ReLU函數(shù)?
為什么需要有這么多激活函數(shù)呢?激活函數(shù)是為了讓神經(jīng)網(wǎng)絡(luò)具有非線性的擬合能力。其實激活函數(shù)的選擇也還在不斷演進(jìn),是學(xué)術(shù)界熱門研究方向,我們也可以自己創(chuàng)造激活函數(shù)。激活函數(shù)適用也不同,如ReLU函數(shù)能有效的預(yù)防梯度消失問題,而sigmoid函數(shù)能講回歸問題轉(zhuǎn)化為二分類問題。
?
1.3.2 神經(jīng)網(wǎng)絡(luò)介紹
理解了基礎(chǔ)的神經(jīng)元模型,神經(jīng)網(wǎng)絡(luò)就很好理解了。神經(jīng)元就像一塊樂高積木,而神經(jīng)網(wǎng)絡(luò)就是搭的積木。?
如上圖,x那一列,我們稱為輸入層,輸出y^那列稱為輸出層,中間那列稱為隱藏層。隱藏層可以有多個,而且每個隱藏層有多少個神經(jīng)元也都是可以自主調(diào)整的。經(jīng)典的神經(jīng)網(wǎng)絡(luò)中,當(dāng)前層的神經(jīng)元會后后一層的各個神經(jīng)元進(jìn)行連接,這也稱為全連接。
1.3.2.1 前向傳播
上圖是形象化的神經(jīng)網(wǎng)絡(luò)模型結(jié)構(gòu)圖,那實際上模型的特征輸入到預(yù)測輸出,在數(shù)學(xué)上、在內(nèi)存里是怎么實現(xiàn)的呢?這里我們來介紹下從輸入層到第一個隱藏層的向前傳播的過程。?
首先,輸入的特征向量(數(shù)組):?
它會與權(quán)重矩陣(二維數(shù)組)相乘
加上偏置向量(數(shù)組):
最后送入激活函數(shù),如tanh函數(shù):
1.3.2.2 反向傳播
神經(jīng)網(wǎng)絡(luò)這么多參數(shù)該如何優(yōu)化呢?其實和上文說的一樣,我們還是使用梯度下降的方法。最后一層的權(quán)重調(diào)整我們可以與梯度下降的方法求出。最后第二層我們可以基于最后一層的權(quán)重調(diào)整,利用鏈?zhǔn)角髮?dǎo)的方式求出。就這樣從后往前的調(diào)整,這就是所謂的反向傳播。
2. 詞匯特征表示
完成我們的背景知識回顧學(xué)習(xí)之后,就進(jìn)入我們正式要講解的內(nèi)容了。
2.1 語言模型
這里我們先介紹一個概念——語言模型。簡單來講,語言模型就是一個想讓機(jī)器學(xué)會說話的模型。它會基于給定的上文,預(yù)測出最有可能的下文。比如說,“I want a glass of orange __ ”,輸入前文,模型將預(yù)測出空格可能的單詞為“juice”。
2.2 詞嵌入
現(xiàn)在我們有一個詞典,如:【a,apple,…,zoo,】,其中代表未知單詞。假設(shè)我們的詞典里里面一個有10000個單詞,那如何用生成某個詞匯特征表示呢?一個很容易想到的方法就是one-hot:用一個10000維的向量來表示一個詞語。?
但是這種方法有兩個致命缺點:?
- 第一,向量實在是太長了,而且詞匯量增加,向量維度也要跟著增加。?
- 第二,該向量部分表示出詞匯之間的關(guān)系。如我們給出“I want a glass of orange juice”作為訓(xùn)練數(shù)據(jù),模型是學(xué)不到“I want a glass of apple _”該填什么的。因為orange的特征表示和apple的特征表示之間沒有任何的關(guān)系。
為了解決上述缺點,我們可以手工的做詞嵌入:?
Topic| Man | Woman|King|Queen|Apple|Orange?
|:-|:-|:-|:-|:-|:-|:-?
Gender |-1| 1 |-0.95|0.97|0.00|0.01?
Royal | 0.01 | 0.02 |0.93|0.95|-0.01|0.00?
Age | 0.03 | 0.02|0.7|0.69|0.03|-0.02?
Food | 0.09 | 0.01|0.02|0.01|0.95|0.97?
…|…|…|…|…|…|…?
我們選取幾個Topic,每行是各個單詞關(guān)于該Topic的相關(guān)系數(shù)。這樣一來,我們可以看到向量的維度大小得到了控制,而且詞與詞有明顯的關(guān)系。我們還能驚喜的發(fā)現(xiàn)King的向量減去Man的向量,再加上Woman的向量,就約等于Queen的向量!
?
3 word2vector
詞嵌入固然好,但手工的為10000個詞語關(guān)于各個Topic打相關(guān)系數(shù) ,這需要耗費巨大的人力,而且要求非常深厚的語言詞匯知識。?
Google大神們提出了目前非常流行的訓(xùn)練詞向量的算法——word2vector[1]word2vector[1]。我們先來看看word2vector強大的的效果吧:?
上表是783M的單詞,訓(xùn)練出的300維度的詞向量,得到的對應(yīng)關(guān)系。比如,使用vParis?vFrance+vItalyvParis?vFrance+vItaly得到的向量v1v1,在字典里查詢與它最相似的是向量vRomevRome(可以用cos相似度進(jìn)行度量)。
3.1 基于神經(jīng)網(wǎng)絡(luò)語言模型的詞向量生成
?
再講word2vector之前,我們先來講講另外一種模型——基于神經(jīng)網(wǎng)絡(luò)語言模型[2]。其實Google大佬在論文【1】中也實驗了用該模型生成詞向量,word2vector算法也就是在這個基礎(chǔ)上進(jìn)行的變形、優(yōu)化。模型結(jié)構(gòu)如下:?
- 第一層:上圖中綠色的小方塊就是我們每個單詞的onehot后的向量,比如說我們想語言模型要預(yù)測“I want a glass of apple _”問題,我們固定4個單詞的窗口,那么就有4個綠色小方塊的特征輸入,即分別為“a”,“glass”,“of”,“ apple”對應(yīng)的one-hot向量。?
- 第二層:各個one-hot向量(10000維)會乘以10000?300大小的共享矩陣CC。其實這里的CC就是我們前文的詞嵌入矩陣的轉(zhuǎn)置。每列類別代表一個Topic,只是里我們并不知道其具體含義。而每一行就是對應(yīng)單詞的詞向量。?
- 第三層:乘完的向量(300維)會將其連接起來(4?300=1200維),并代入tanh函數(shù)得到值作為該層的輸出。?
- 第四層:第四層有10000個神經(jīng)元,第三層到第四層使用的是全連接,而且神經(jīng)元非常多,需要很大的計算資源。?
- Softmax:我們最后輸出的是一個向量V(10000維),Vi表示V中的第i個元素,那么這個元素的Softmax值就是?
也就是說,是該元素的指數(shù),與所有元素指數(shù)和的比值。這樣一來,向量S的各個元素就表示預(yù)測為對應(yīng)位置單詞的概率。真實值yy這里將是單詞,如“juice”,所對應(yīng)的one-hot向量。
這么一來,我們就可以使用反向傳播與梯度下降優(yōu)化調(diào)整網(wǎng)絡(luò)中的參數(shù),同時也就調(diào)整生成了共享矩陣C,即我們的詞向量矩陣。
3.2 word2vector
其實理解了基于神經(jīng)網(wǎng)絡(luò)語言模型的詞向量生成模型,word2vector模型就非常好理解了。word2vector有兩種形式——CBOW 和 Skip-gram。
3.2.1 CBOW模型
不同于神經(jīng)網(wǎng)絡(luò)語言模型去上文的單詞作為輸入,CBOW模型獲得中間詞兩邊的的上下文,然后用周圍的詞去預(yù)測中間的詞。?
與神經(jīng)網(wǎng)絡(luò)語言模型還有點不同的是:經(jīng)過詞嵌入后,CBOW模型不是將向量合并,而是將向量按位素數(shù)相加。
3.2.2 Skip-gram模型
Skip-gram模型正好和CBOW模型相反,輸入為中間的詞,使用預(yù)測兩邊的的上下文的單詞。
3.2.3 加速Softmax
從上文我們可以看到,最后的輸出層有10000個節(jié)點,顯然這部分需要消耗非常大的計算資源。這里介紹兩種加速的方法:?
- hierarchical softmax:softmax不再使用one-hot編碼,而是利用哈夫曼編碼,這可以使得復(fù)雜度降低到log2V,其中V為字典長度。?
- 負(fù)采樣:負(fù)采樣是將模型變成只用一個輸出節(jié)點的2分類任務(wù)模型。我們將單詞與其一個附近的單詞向量連接,如[Vorange,Vjuice],作為特征輸入,Label為1。再將該單詞與其不它附近的單詞向量連接,如[Vorange,Vman],Label為0。我們使用這樣構(gòu)造出數(shù)據(jù)集進(jìn)行詞向量的訓(xùn)練。
4 文本向量
現(xiàn)在我們有了詞向量,那對于一個文本,如何用一個向量來表示它呢?
4.1 fastText模型
Facebook的大牛們基于word2vector詞向量設(shè)計了fastText文本分類模型[3][3]。其實它的結(jié)構(gòu)也很簡單,就是將各個詞向量相加,作為其文本的向量表示:?
除此之外, fastText還添加了N-gram特征,這里就不再介紹,感興趣的同學(xué)可見【3】
4.2 文本分布表示
fastText是目前非常流行的文本分類的模型,但是直接將各個詞向量相加存在一個很大的缺點,就是消除了詞序的特征。如“mother loves dad”和“dad loves mother”,在這種文本特征生成方案下,它們的文本向量就一模一樣了。?
Google的大牛們基于word2vector模型也設(shè)計出了文本向量生成的方案。該方案的核心思想就是:將文檔看做一個特殊的單詞。該方案有兩種形式——分布記憶模型和分布詞包模型[4]。
4.2.1 分布記憶模型
分布記憶模型將文檔id看做一個特殊的單詞,設(shè)窗口大小為3,那么輸入的特征為文檔id和該文本的三個單詞(按順序),Label則是下一個單詞。不斷迭代,直到窗口移動到文末。所有文檔訓(xùn)練結(jié)束后,文檔id所對應(yīng)的詞向量就是該文檔的文本向量。該方案保留了詞語間的詞序信息:?
4.2.2 分布詞包模型
分布詞包模型也將文檔id看做一個特殊的單詞,不同的是,它套用了Skip-gram的結(jié)構(gòu)。該方案不保留了詞語間的詞序信息:?
4.3 深度學(xué)習(xí)模型
最近深度學(xué)習(xí)非常熱門,輸入詞向量特征,基于深度學(xué)習(xí)模型也可以進(jìn)行文本的特征學(xué)習(xí):?
- CNN:卷積神經(jīng)網(wǎng)絡(luò)模型可以抽取部分單詞作為輸入特征,類似于n-grams的思想?[5]:
?
4.4 簡單詞嵌入模型
無論是文本分布表示還是上深度學(xué)習(xí)模型,對于在線實時預(yù)測的機(jī)器學(xué)習(xí)系統(tǒng)都有較大的性能挑戰(zhàn)。今年最新提出的簡單詞嵌入模型(SWEM)關(guān)注到了這個問題,論文提出了更加簡單輕量的文本向量生成方案[7][7]:?
- SWEM-aver:就是平均池化,對詞向量的按元素求均值。這種方法相當(dāng)于考慮了每個詞的信息。?
- SWEM-max:最大池化,對詞向量每一維取最大值。這種方法相當(dāng)于考慮最顯著特征信息,其他無關(guān)或者不重要的信息被忽略。?
- SWEM-concat:考慮到上面兩種池化方法信息是互補的,這種變體是對上面兩種池化方法得到的結(jié)果進(jìn)行拼接。?
- SWEM-hier:上面的方法并沒有考慮詞序和空間信息,提出的層次池化先使用大小為 n 局部窗口進(jìn)行平均池化,然后再使用全局最大池化。該方法其實類似我們常用的 n-grams 特征。
論文將SWEM方案生成文本向量,輸入到神經(jīng)網(wǎng)絡(luò)分類器:隱藏層[100, 300, 500, 1000]與一個softmax輸出層。論文將它和其他模型在不同數(shù)據(jù)集上進(jìn)行了文本分類預(yù)測正確率的對比:
可見,SWEM-concat 和 SWEM-hier 表現(xiàn)非常的優(yōu)秀,甚至超過了復(fù)雜的深度學(xué)習(xí)模型。
參考文獻(xiàn)
【1】Mikolov, T., Chen, K., Corrado, G., & Dean, J. (2013). Efficient estimation of word representations in vector space. Computer Science.?
【2】Bengio, Yoshua, et al. A neural probabilistic language model.. Innovations in Machine Learning. Springer Berlin Heidelberg, 2006:137-186.?
【3】Joulin A, Grave E, Bojanowski P, et al. Bag of Tricks for Efficient Text Classification[J]. 2016:427-431.?
【4】Le Q, Mikolov T. Distributed representations of sentences and documents[C] International Conference on International Conference on Machine Learning. JMLR.org, 2014:II-1188.?
【5】Kim Y. Convolutional Neural Networks for Sentence Classification[J]. Eprint Arxiv, 2014.?
【6】Vinyals O, Le Q. A Neural Conversational Model[J]. Computer Science, 2015.?
【7】Shen D, Wang G, Wang W, et al. Baseline Needs More Love: On Simple Word-Embedding-Based Models and Associated Pooling Mechanisms[J]. 2018.
?
總結(jié)
以上是生活随笔為你收集整理的基于神经网络的文本特征提取——从词汇特征表示到文本向量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小程序实现无限瀑布流
- 下一篇: 如何实现一个符合泊松分布的即时消息发生器