可能看到標題的你,會覺得說,咦?CNN 也能用在 NLP 上面?他不是拿來處理影像的嗎?是的,他可以處理影像,但他也能夠用在自然語言處理的理解上面。我們可以把 CNN 的 kernel 自行調整長與寬,在影像中常見的 3 * 3、5 * 5 ,我們如果調整成 2 * embedding_dimension、3 * embedding_dimension ,這時得你應該比較有感覺了吧!是不是與 Bi-Gram、Tri-Gram 有點像呢?
不如就用以這張圖來解釋吧!假設我們現在也想做 Sentiment Analysis,如同上一篇文章:Sentiment Analysis Using RNN with Tensorflow Keras。
現在我們手上有一篇文章,裡面有七個文字,每個文字都用長度為五的 Embedding 來表示。那麼通常來講,我們在設計 kernel 的時候,我們通常會希望第一個維度不要只是 1 ,這樣代表他只是去看這串文字序列當中,有沒有某個特定詞的特徵出現,這樣並無法抓取上下文的資訊,所以通常我們的設計會是大於一的數字,讓這個 kernel 觀察好幾個字的片段。此外,我們也會希望他的第二個維度要與 Embedding 的維度一致,如果不一樣的話,可能會變成你在抓去特徵的時候,沒有看完整個資訊,這樣抓出來的特徵並沒有意義。
假設我們現在設計三種 kernel_size,分別是 (4*5, 3*5, 2*5),且每個不同大小的 kernal 都使用兩個 filter 來抓取特徵。因此,你會得到兩個 4*1, 5*1, 6*1 的 feature maps。為了方便做特徵提取,我們這時全部都取出他的最大值 MaxPooling,把結果 concat 起來,將會得到一個 6*1 的向量。最後再將它傳入 Dense Output Layer,即可幫我們判斷這則文章是屬於 Positive 還是 Negative。
如何實作呢?以下將一步一步執行提供參考。一樣一開始先 import packages。
(1) Data Preprocessing 把向量處理成相同的長度
(2) Model Architecture 構建 CNN 網路模型,注意其 kernal 大小的設計
(3) Max Pooling 將 feature map 的結果做最大池化,得到一個特徵代表
(4) Concat & Ouput 將剛才的特徵全部串起來並傳入全連接層判斷
(5) Model Training 開始訓練模型
當然,我們也可以把剛剛步驟(2)~(5) 重新用另一種方式表達,雖然細節有些許不同,參數訓練量較少,但也能有差不多的訓練成果。
以上如果有看不懂的段落,可以隨時參考 Tensorflow 官方的 Document,其實從 Document 搭配實例,可以增加理解與記憶,共勉之。
Github for your reference:
This article will be updated at any time! Thanks for your reading. If you like the content, please click the “clap” button. You can also press the follow button to track new articles at any time. Feel free to contact me via LinkedIn or email.