1. 程式人生 > >Week1.3 Simple deep learning for text classification

Week1.3 Simple deep learning for text classification

Neural networks for words(and characters)

在本節中我們將學習如何將神經網路用於文字分類,還將學習卷積神經網路相關的原理.

回顧–Bag of words way

在前面課程中,我們學習瞭如何將一段文本當作一系列words或是tokens來處理。並且介紹了BOW的方法來處理這些tokens。 首先,我們有每個單詞對應的vector,這就是這些tokens的對應特徵向量。 這裡的特徵向量,我們使用的是one-hot representation表示。 這是一種直觀的表示方法。這個向量的維度是整個詞表的大小,其中的值只有一個為1,其餘值都為0. 例如:

very = [0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0...........]
good = [0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,.........]

在BOW方法中,我們可以將一句話中的這些單詞對應的特徵向量相加,得到一個稀疏的矩陣,這就是這句話的一個對應的向量化結果。再搭配上前面學到的Hash表分配技術。就可以很好地描述出這句話的某些特徵。

Neural way

在神經網路方法中,我們更喜歡使用密集型的向量來表示每一個token,這些向量中可能包含300個甚至更多的實數,來作為這一個token的特徵向量。

這裡的特徵向量,我們使用了word embedding的方法,對 one-hot方法表示的vector進行了一些改進: 1.將vector的每個元素由整型改為浮點型,變為實數範圍的表示; 2.將原來較為稀疏的、維度較大的向量進行壓縮,使其“嵌入”到更小的維度。 這就是word embedding的含義。

然後我們可以對這些向量進行訓練。將在後兩週學習有關Word2vec的更多資訊。 需要知道的是,Word2vec embedding有一個非常好的屬性: 有著相近意思的單詞往往趨向於含有共線的向量,這會使這些詞指向大致相同的方向,並且從空間上看,它們可能分佈於一塊鄰近的區域。

建立好這些向量後,我們可以進一步地對這個文字進行分析,以期望獲得整個文字的特徵描述。接下來有兩種方法: 1.如同Bow中使用的方法,我們將這些word2vec進行簡單的相加,就可以得到一個可以執行的很好的文字分類器了。 2.引入神經網路的方法進行分析,見下小節。

A better way: 1D convolutions

現在,我們有了每個特定單詞(word)的word embedding向量表示,但是我們期望得到更多pairs的特徵向量。比如2-gram的向量,要如何獲得呢?

事實上,我們可以將每個word對應的向量拿過來寫在一起,構成一個矩陣。這裡我們設每個向量的長度為m,一共有n個向量,那麼形成的是一個 n * m 的矩陣。但我們的目的不是這個矩陣,如果我們想要提取2-gram的關鍵資訊,我們可以想象一個滑動視窗,這個滑動視窗是 2 * m大小的,它從n = 1開始滑動,一直向下。對於每個視窗中的資料,我們可以引入相同大小(2 * m)的卷積分類器(convolutional filter)進行分析。對每兩個相鄰的word,我們就有了關於這兩個word形成的2-grams的一個向量。我們可以引入不同的卷積核進行分析,用於獲得更好的結果。

這樣的卷積為什麼比BOW方法好呢?正是因為上面黑色字型中提到的word2vec embedding的優秀屬性。意思相近的words有著相似的餘弦距離(cosine distance),而餘弦距離和向量間的點積(內積)相似。而它們的結果正是我們所使用的卷積方法所產生的結果。

還有,當我們使用卷積方法時,我們可以發現一段text更加深層的含義。比如我們有"cat sitting"和“dog resting",我們通過卷積分類器,可以發現這兩段text都表現了同一大類意思:“animal sitting”。通過這種方法,我們就不需要像之前那樣構造許多的非常長而稀疏的向量來表示每個2-gram了,我們只需要觀察每兩個word embedding的卷積結果,就能夠發掘出其中更加深刻的含義。

同樣的,這個卷積方法可以很好得擴充套件到3-grams,4-grams…n-grams的情況。同時我們也需要更多的卷積分類器以獲得更好的結果。這個方法被稱作一維卷積(1D convolution)的原因是,我們做卷積的視窗只在一個維度方向上滑動,比如上下滑動。在影象處理中,我們可能在兩個方向上來移動視窗。

Final Models

Yoon Kim給出的模型

輸入層

圖中最左邊的部分即為輸入層,總的來說輸入層就是句子對應的矩陣。一般不會使用 ont-hot 向量來表示單詞,而是使用 k 維的分散式詞向量。那麼對於一個長度為 n 的句子,則構成一個 n × k 的矩陣。

所以,可以設 xi 為句子的第 i 個單詞,它為 k 維向量。那麼一個句子為 x1:n=x1x2...xnx1:n=x1x2...xn x1:n=x1⨁x2⨁...⨁xnx1:n=x1⨁x2⨁...⨁xn 其中表示串聯的意思。

另外,根據對詞向量的作用可以分為兩種模式:靜態和非靜態。靜態模式的意思就是我直接使用第三方釋出的詞向量或者自己訓練的詞向量來初始化矩陣,並且在每次訓練的過程中不對反向誤差傳播產生作用,不改變詞向量,整個訓練過程詞向量都是固定不變的。而非靜態模式則不同,同樣是使用詞向量來初始化矩陣後,在此後的每次訓練過程中,根據反向誤差傳播會對詞向量進行微調,整個訓練過程詞向量都會更新。

卷積層

圖中第二部分為卷積層,卷積層的作用就是用於提取句子的特徵。主要是通過一個 h × k 的卷積核 w 在輸入層從上到下進行滑動進行卷積操作,通過該卷積操作得到一個 feature map。feature map 的列為1,行為 (n-h+1)。即 c=(c1,c2,...cnh+1) c=(c1,c2,...cn−h+1) 其中ci=f(wxi:i+h1+b) ci=f(w⋅xi:i+h−1+b)

上圖中輸入層上紅色框就是卷積操作的卷積核,可以看到它是 2 × k 維的,運算後變為 feature map 的一個元素。除此之外,還可以將 h 定為3,此時卷積核變為 3 × k 維,如圖中黃色框框部分。相同維度的可以有若干個引數不同的卷積核,所以最終在每種維度下都可以得到若干個 feature map。

卷積操作的意義是什麼?可以看到它其實是根據 h 大小不同提取不同長度相鄰單詞的特徵,這個其實可以跟 n-gram 語言模型對應起來。

池化層

圖中第三部分為池化層,池化層的作用是對特徵做進一步提取,將最重要的特徵提取出來。這裡使用的是 max-over-time pooling 操作,即取出 feature map 中的最大值作為最重要的特徵,即cˆ=max{c}c^=max{c}。所以最終對於每個 feature map 池化後都得到一個一維向量,取最大值作為特徵也解決了不同句子長短的問題,儘管短的句子會用 0 進行填充,但通過取最大值消除了該問題。

前面的通過卷積層的多個不同卷積核操作得到若干 feature map,而再經過池化層處理後得到若干個一維向量。

全連線層

圖中最後部分為全連線層,全連線層通過使用 softmax 分類器得到各個分類的概率。前面的池化層的輸出以全連線的形式連到 softmax 層,softmax 層定義好分類。

做好這些工作後,我們就可以在這個卷積神經網路上新增我們想要訓練的工作,它有著比基於BOW的傳統ML方法更好的結果。

Summary

1.我們可以使用word2vec向量來將text中的每個token進行預先的訓練; 2.使用1D convolutions可以獲得更好的更復雜的特徵 3.可以將上述的模型運用於字元級別(characters),也將獲得很好的結果,甚至在某些資料集上,在字元級別上處理得到的結果甚至比在word級別上得到的結果要好。 4.CNN方法在大資料集上表現得比傳統方法好。