1. 程式人生 > >Text-CNN 文字分類

Text-CNN 文字分類

1.簡介

TextCNN 是利用卷積神經網路對文字進行分類的演算法,由 Yoon Kim 在 “Convolutional Neural Networks for Sentence Classification” 一文 (見參考[1]) 中提出. 是2014年的演算法.

網路結構
圖1-1 參考[1] 中的論文配圖


圖1-2 網路盜圖

合理性:
深度學習模型在計算機視覺與語音識別方面取得了卓越的成就. 在 NLP 也是可以的.
卷積具有區域性特徵提取的功能, 所以可用 CNN 來提取句子中類似 n-gram 的關鍵資訊.

2.引數與超引數

  • sequence_length
    Q: 對於CNN, 輸入與輸出都是固定的,可每個句子長短不一, 怎麼處理?
    A: 需要做定長處理, 比如定為n, 超過的截斷, 不足的補0. 注意補充的0對後面的結果沒有影響,因為後面的max-pooling只會輸出最大值,補零的項會被過濾掉.
  • num_classes
    多分類, 分為幾類.
  • vocabulary_size
    語料庫的詞典大小, 記為|D|.
  • embedding_size
    將詞向量的維度, 由原始的 |D| 降維到 embedding_size.
  • filter_size_arr
    多個不同size的filter.

3.Embedding Layer

通過一個隱藏層, 將 one-hot 編碼的詞 投影 到一個低維空間中.
本質上是特徵提取器,在指定維度中編碼語義特徵. 這樣, 語義相近的詞, 它們的歐氏距離或餘弦距離也比較近.

4.Convolution Layer

為不同尺寸的 filter 都建立一個卷積層. 所以會有多個 feature map.
影象是畫素點組成的二維資料, 有時還會有RGB三個通道, 所以它們的卷積核至少是二維的.
從某種程度上講, word is to text as pixel is to image, 所以這個卷積核的 size 與 stride 會有些不一樣.

  • xi
    xiRk, 一個長度為n的句子中, 第 i 個詞語的詞向量, 維度為k.
  • xi:j
    xi:j=xixi+1...xj
    表示在長度為n的句子中, 第 [i,j] 個詞語的詞向量的拼接.
  • h
    卷積核所圍視窗中單詞的個數, 卷積核的尺寸其實就是 hk.
  • w
    wRhk, 卷積核的權重矩陣.
  • ci
    ci=f(wxi:i+h1+b), 卷積核在單詞i位置上的輸出. bRK, 是 bias. f 是雙曲正切之類的啟用函式.
  • c=[c1,c2,...,cnh+1]
    filter在句中單詞上進行所有可能的滑動, 得到的 featuremap.

5.Max-Pooling Layer

max-pooling只會輸出最大值, 對輸入中的補0 做過濾.

6.SoftMax 分類 Layer

最後接一層全連線的 softmax 層,輸出每個類別的概率。

7.小的變種

在 word representation 處理上會有一些變種.

  • CNN-rand
    設計好 embedding_size 這個 Hyperparameter 後, 對不同單詞的向量作隨機初始化, 後續BP的時候作調整.
  • static
    拿 pre-trained vectors from word2vec, FastText or GloVe 直接用, 訓練過程中不再調整詞向量. 這也算是遷移學習的一種思想.
  • non-static
    pre-trained vectors + fine tuning , 即拿word2vec訓練好的詞向量初始化, 訓練過程中再對它們微調.
  • multiple channel
    類比於影象中的RGB通道, 這裡也可以用 static 與 non-static 搭兩個通道來搞.

一些結果表明,max-pooling 總是優於 average-pooling ,理想的 filter sizes 是重要的,但具體任務具體考量,而用不用正則化似乎在NLP任務中並沒有很大的不同。

8. Text CNN 的tf實現

參見[4], [6]. 挺詳細的。


圖 8-1 Text CNN 網路中的卷積與池化 結構

需要注意的細節有。
tf.nn.embedding_lookup() creates the actual embedding operation. The result of the embedding operation is a 3-dimensional tensor of shape [None, sequence_length, embedding_size].

TensorFlow’s convolutional conv2d operation expects a 4-dimensional tensor with dimensions corresponding to batch, width, height and channel. The result of our embedding doesn’t contain the channel dimension, so we add it manually, leaving us with a layer of shape [None, sequence_length, embedding_size, 1].

9. 與 LeNet 作比較


figure LeNet-5 網路結構

# LeNet5
conv1_weights = tf.get_variable(
                    "weight", 
                    [CONV1_SIZE, CONV1_SIZE, NUM_CHANNELS, CONV1_DEEP],
                    initializer=tf.truncated_normal_initializer(stddev=0.1))
tf.nn.conv2d(
            input_tensor, 
            conv1_weights, 
            strides=[1, 1, 1, 1],
            padding='SAME')

tf.nn.max_pool(
                relu1, 
                ksize = [1,POOL1_SIZE,POOL1_SIZE,1],
                strides=[1,POOL1_SIZE,POOL1_SIZE,1],
                padding="SAME")
#TextCNN
conv1_weights = tf.get_variable(
                    "weight", 
                    [FILTER_SIZE, EMBEDDING_SIZE, 1, NUM_FILTERS],
                    initializer=tf.truncated_normal_initializer(stddev=0.1))
tf.nn.conv2d(
            self.embedded_chars_expanded,
            conv1_weights,
            strides=[1, 1, 1, 1],
            padding="VALID")

tf.nn.max_pool(
                h,
                ksize=[1, SEQUENCE_LENGTH - FILTER_SIZE + 1, 1, 1],
                strides=[1, 1, 1, 1],
                padding='VALID')

先來比較卷積
LeNet 的 filter 是正方形的, 且每一層都只用了同一種尺寸的卷積核. Text-CNN中, filter 是矩形, 矩形的長度有好幾種, 一般取 (2,3,4), 而矩形的寬度是定長的, 同 word 的 embedding_size 相同. 每種尺寸都配有 NUM_FILTERS 個數目, 類比於LeNet中的output_depth,所以得到的feature_map是長條狀, 寬度為1.
因為是卷積, 所以stride每個維度都是1.

再說池化層.
池化處理, 也叫下采樣. 這裡依舊可以對比 LeNet 網路.
LeNet 的 kernel 是正方形, 一般也是2*2等, 所以會把卷積後的feature_map尺寸縮小一半.
Text-CNN 的 kernel 依舊是長方形, 將整個feature_map 對映到一個點上. 一步到位, 只有一個池化層.

全連線層
都是多分類, 這一步的處理比較類似. 將池化後的矩陣 reshape為二維, 用 tf.nn.sparse_softmax_cross_entropy_with_logits() 計算損失.

10. TextCNN 論文中的網路結構

windows size 分別取 (3,4,5), 每個尺寸都會有100個filter.

3.1 Hyperparameters and Training
For all datasets we use: rectified linear units, filter
windows (h) of 3, 4, 5 with 100 feature maps each,
dropout rate (p) of 0.5, l2 constraint (s) of 3, and
mini-batch size of 50. These values were chosen
via a grid search on the SST-2 dev set.

參考