史丹佛NLP課程 | 第11講 - NLP中的卷積神經網路

ShowMeAI 發表於 2022-05-14

ShowMeAI研究中心

作者:韓信子@ShowMeAI,路遙@ShowMeAI,奇異果@ShowMeAI
教程地址http://www.showmeai.tech/tutorials/36
本文地址http://www.showmeai.tech/article-detail/248
宣告:版權所有,轉載請聯絡平臺與作者並註明出處

收藏ShowMeAI檢視更多精彩內容


NLP中的卷積神經網路
ShowMeAI史丹佛CS224n《自然語言處理與深度學習(Natural Language Processing with Deep Learning)》課程的全部課件,做了中文翻譯和註釋,並製作成了GIF動圖!

NLP中的卷積神經網路
本講內容的深度總結教程可以在這裡 檢視。視訊和課件等資料的獲取方式見文末


引言

NLP中的卷積神經網路

授課計劃

授課計劃

  • Announcements
  • Intro to CNNs / 卷積神經網路介紹
  • Simple CNN for Sentence Classification: Yoon (2014) / 應用CNN做文字分類
  • CNN potpourri / CNN 細節
  • Deep CNN for Sentence Classification: Conneauet al. (2017) / 深度CNN用於文字分類
  • Quasi-recurrent Neural Networks / Q-RNN模型

歡迎來到課程的下半部分!

歡迎來到課程的下半部分!

  • 現在,我們正在為你準備成為 DL+NLP 研究人員/實踐者

  • 課程不會總是有所有的細節

    • 這取決於你在網上搜尋/閱讀來了解更多
    • 這是一個活躍的研究領域,有時候沒有明確的答案
    • Staff 很樂意與你討論,但你需要自己思考
  • 作業的設計是為了應付專案的真正困難

    • 每個任務都故意比上一個任務有更少的幫助材料
    • 在專案中,沒有提供 autograder 或合理性檢查
    • DL 除錯很困難,但是你需要學習如何進行除錯!

書籍推薦

書籍推薦

Natural Language Processing with PyTorch: Build Intelligent Language Applications Using Deep Learning

  • Delip Rao & Goku Mohandas

1.卷積神經網路介紹

(卷積神經網路相關內容也可以參考ShowMeAI的對吳恩達老師課程的總結文章 深度學習教程 | 卷積神經網路解讀

1.1 從RNN到CNN

從RNN到CNN

  • 迴圈神經網路不能捕獲沒有字首上下文的短語
  • 經常在最終向量中捕獲的資訊太多來自於最後的一些詞彙內容
  • 例如:softmax通常只在最後一步計算

從RNN到CNN

  • CNN / Convnet 的主要思路
    • 如果我們為每一個特定長度的詞子序列計算向量呢?
  • 例如:tentative deal reached to keep government open
  • 計算的向量為
    • tentative deal reached, deal reached to, reached to keep, to keep government, keep government open
  • 不管短語是否合乎語法
  • 在語言學上或認知上不太可信
  • 然後將它們分組 (很快)

1.2 CNN 卷積神經網路

CNN卷積神經網路

1.3 什麼是卷積

什麼是卷積?

  • 一維離散卷積一般為:\((f \ast g)[n]=\sum_{m=-M}^{M} f[n-m] g[m]\)
  • 卷積通常地用於從影像中提取特徵
    • 模型位置不變的識別
    • 可以參考史丹佛深度學習與計算機視覺課程cs231n (也可以在ShowMeAI查閱 cs231n 系列筆記學習)
  • 二維示例:
    • 黃色和紅色數字顯示過濾器 (=核心) 權重
    • 綠色顯示輸入
    • 粉色顯示輸出

1.4 文字的一維卷積

文字的一維卷積

  • 用於文字應用的 1 維卷積

1.5 帶填充的文字的一維卷積

帶填充的文字的一維卷積

  • 輸入長度為 \(L\) 的詞序列
    • 假設單詞維度為 4,即有 4 channels
    • 卷積後將會得到 1 channel
  • 多個channel,則最終得到多個 channel 的輸出,關注的文字潛在特徵也不同

1.6 conv1d,隨時間推移填充最大池化

conv1d,隨時間推移填充最大池化

  • 平均池化對 feature map 求平均

1.7 PyTorch實現

PyTorch實現

  • Pytorch中的實現:引數很好地對應前面講到的細節
batch_size= 16
word_embed_size= 4
seq_len= 7
input = torch.randn(batch_size, word_embed_size, seq_len)
conv1 = Conv1d(in_channels=word_embed_size, out_channels=3, kernel_size=3) # can add: padding=1 
hidden1 = conv1(input)
hidden2 = torch.max(hidden1, dim=2) # max pool

1.8 步長 (這裡為2)

CNN步長

  • stride 步長,減少計算量

1.9 區域性最大池化

其他概念:區域性最大池化,步長=2

  • 每兩行做 max pooling,被稱為步長為 2 的區域性最大池化

1.10 1維卷積的k-max pooling

conv1d, k-max pooling over time, k= 2

  • 記錄每一個 channel 的所有時間的 top k 的啟用值,並且按原有順序保留(上例中的-0.2 0.3)

1.11 空洞卷積:dilation為2

其他概念:dilation = 2

擴張卷積 / 空洞卷積

  • 上例中,對1 3 5行進行卷積,通過兩個 filter 得到兩個 channel 的啟用值
  • 可以在第一步的卷積中將卷積核從 3 改為 5,即可實現這樣的效果,既保證了矩陣很小,又保證了一次卷積中看到更大範圍的句子

補充講解 / Summary

  • CNN中,一次能看一個句子的多少內容是很重要的概念
  • 可以使用更大的 filter、擴張卷積或者增大卷積深度 (層數)

2.應用CNN做文字分類

2.1 用於句子分類的單層CNN

用於句子分類的單層CNN

  • 目標:句子分類
    • 主要是識別判斷句子的積極或消極情緒
    • 其他任務
      • 判斷句子主觀或客觀
      • 問題分類:問題是關於什麼實體的?關於人、地點、數字、……

用於句子分類的單層CNN

  • 一個卷積層和池化層的簡單使用
  • 詞向量:\(\mathbf{x}_{i} \in \mathbb{R}^{k}\)
  • 句子:\(\mathbf{x}_{1 : n}=\mathbf{x}_{1} \oplus x_{2} \oplus \cdots \oplus \mathbf{x}_{n}\) (向量連線)
  • 連線 \(\mathbf{X}_{i : i+j}\) 範圍內的句子 (對稱更常見)
  • 卷積核 \(\mathbf{w} \in \mathbb{R}^{h k}\) (作用範圍為 \(h\) 個單詞的視窗)
  • 注意,filter是向量,size 可以是2、3或4

2.2 單層CNN

單層CNN

  • 過濾器 \(w\) 應用於所有可能的視窗(連線向量)
  • 為CNN層計算特徵(一個通道)

\[c_{i}=f\left(\mathbf{w}^{T} \mathbf{x}_{i : i+h-1}+b\right) \]

  • 句子 \(\mathbf{x}_{1 : n}=\mathbf{x}_{1} \oplus \mathbf{x}_{2} \oplus \ldots \oplus \mathbf{x}_{n}\)

  • 所有可能的長度為 \(h\) 的視窗 \(\left\{\mathbf{x}_{1 : h}, \mathbf{x}_{2 : h+1}, \dots, \mathbf{x}_{n-h+1 : n}\right\}\)

  • 結果是一個 feature map \(\mathbf{c}=\left[c_{1}, c_{2}, \dots, c_{n-h+1}\right] \in \mathbb{R}^{n-h+1}\)

2.3 池化與通道數

池化與通道數

  • 池化:max-over-time pooling layer
  • 想法:捕獲最重要的啟用(maximum over time)
  • 從feature map中 \(\mathbf{c}=\left[c_{1}, c_{2}, \dots, c_{n-h+1}\right] \in \mathbb{R}^{n-h+1}\)
  • 池化得到單個數字 \(\hat{c}=\max \{\mathbf{c}\}\)
  • 使用多個過濾器權重 \(w\)
  • 不同視窗大小 \(h\) 是有用的
  • 由於最大池化 \(\hat{c}=\max \{\mathbf{c}\}\),和 \(c\) 的長度無關

\[\mathbf{c}=\left[c_{1}, c_{2}, \dots, c_{n-h+1}\right] \in \mathbb{R}^{n-h+1} \]

  • 所以我們可以有一些 filters 來觀察 unigrams、bigrams、tri-grams、4-grams等等

2.4 多通道輸入資料

多通道輸入資料

  • 使用預先訓練的單詞向量初始化 (word2vec 或 Glove)
  • 從兩個副本開始
  • 只對1個副本進行了反向傳播,其他保持靜態
  • 兩個通道集都在最大池化前新增到 \(c_i\)

2.5 Classification after one CNN layer

Classification after one CNN layer

  • 首先是一個卷積,然後是一個最大池化
  • 為了獲得最終的特徵向量 \(\mathbf{z}=\left[\hat{c}_{1}, \dots, \hat{c}_{m}\right]\)
    • 假設我們有 \(m\) 個卷積核 (濾波器filter) \(w\)
    • 使用100個大小分別為3、4、5的特徵圖
  • 最終是簡單的 softmax layer \(y=\operatorname{softmax}\left(W^{(S)} z+b\right)\)

補充講解

  • https://arxiv.org/pdf/1510.03820.pdf
  • 輸入長度為 7 的一句話,每個詞的維度是 5 ,即輸入矩陣是 \(7 \times 5\)
  • 使用不同的 filter_size : (2,3,4),並且每個 size 都是用兩個 filter,獲得兩個 channel 的 feature,即共計 6 個 filter
  • 對每個 filter 的 feature 進行 1-max pooling 後,拼接得到 6 維的向量,並使用 softmax 後再獲得二分類結果

2.6 Regularization 正則化

Regularization 正則化

  • 使用 Dropout:使用概率 \(p\) (超引數) 的伯努利隨機變數(只有0 1並且 \(p\) 是為 \(1\) 的概率)建立 mask 向量 \(r\)
  • 訓練過程中刪除特徵

\[y=\operatorname{softmax}\left(W^{(S)}(r \circ z)+b\right) \]

  • 解釋:防止互相適應(對特定特徵的過度擬合)
  • 在測試時不適用 Dropout,使用概率 \(p\) 縮放最終向量

\[\hat{W}^{(S)}=p W^{(S)} \]

  • 此外:限制每個類的權重向量的 L2 Norm (softmax 權重 \(W^{(S)}\) 的每一行) 不超過固定數 \(s\) (也是超引數)
  • 如果 \(\left\|W_{c}^{(S)}\right\|>s\) ,則重新縮放為 \(\left\|W_{c}^{(S)}\right\|=s\)
    • 不是很常見

3.CNN細節

3.1 CNN引數討論

All hyperparameters in Kim (2014)

  • 基於驗證集 (dev) 調整超引數
  • 啟用函式:Relu
  • 視窗過濾器尺寸\(h=3,4,5\)
  • 每個過濾器大小有 100 個特徵對映
  • Dropout\(p=0.5\)
    • Kim(2014年) 報告稱,從 Dropout 來看,準確率提高了 \(2 - 4 \%\)
  • softmax行的 L2 約束,\(s=3\)
  • SGD訓練的最小批量:\(50\)
  • 詞向量:用 word2vec 預訓練,\(k=300\)
  • 訓練過程中,不斷檢查驗證集的效能,並選擇最高精度的權重進行最終評估

3.2 實驗結果

實驗

  • 不同的引數設定下的實驗結果

3.3 對比CNN與RNN

Problem with comparison?

  • Dropout 提供了 \(2 - 4 \%\) 的精度改進
  • 但幾個比較系統沒有使用 Dropout,並可能從它獲得相同的收益
  • 仍然被視為一個簡單架構的顯著結果
  • 與我們在前幾節課中描述的視窗和 RNN 架構的不同之處:池化、許多過濾器和 Dropout
  • 這些想法中有的可以被用在 RNNs 中

3.4 模型對比

Model comparison: Our growing toolkit

  • 詞袋模型 / Bag of Vectors:對於簡單的分類問題,這是一個非常好的基線。特別是如果後面有幾個 ReLU 層 (See paper: Deep Averaging Networks)
  • 詞窗分類 / Window Model:對於不需要廣泛上下文的問題 (即適用於 local 問題),適合單字分類。例如 POS、NER
  • 卷積神經網路 / CNN:適合分類,較短的短語需要零填充,難以解釋,易於在 gpu 上並行化
  • 迴圈神經網路 / RNN:從左到右的認知更加具有可信度,不適合分類 (如果只使用最後一種狀態),比 CNNs 慢得多,適合序列標記和分類以及語言模型,結合注意力機制時非常棒

補充講解

  • RNN對序列標記和分類之類的事情有很好的效果,以及語言模型預測下一個單詞,並且結合注意力機制會取得很好的效果,但是對於某個句子的整體解釋,CNN做的是更好的

3.5 跳接結構應用

Gated units used vertically

  • 我們在 LSTMs 和 GRUs 中看到的 門/跳接 是一個普遍的概念,現在在很多地方都使用這個概念
  • 你還可以使用 **縱向** 的門
  • 實際上,關鍵的概念——用快捷連線對候選更新求和——是非常深的網路工作所需要的
  • Note:新增它們時,請將 \(x\) 填充成conv一樣的維度,再求和

3.6 批歸一化BatchNorm

Batch Normalization (BatchNorm)

  • 常用於 CNNs
  • 通過將啟用量縮放為零均值和單位方差,對一個 mini-batch 的卷積輸出進行變換
    • 這是統計學中熟悉的 Z-transform
    • 但在每組 mini-batch 都會更新,所以波動的影響不大
  • 使用 BatchNorm 使模型對引數初始化的敏感程度下降,因為輸出是自動重新標度的
    • 也會讓學習率的調優更簡單,模型的訓練會更加穩定
  • PyTorch:nn.BatchNorm1d

3.7 1x1卷積

1 x 1 Convolutions

  • 1x1的卷積有作用嗎是的
  • 1x1 卷積,即網路中的 Network-in-network (NiN) connections,是核心大小為1的卷積核心
  • 1x1 卷積提供了一個跨通道的全連線的線性層
  • 它可以用於從多個通道對映到更少的通道
  • 1x1 卷積新增了額外的神經網路層,附加的引數很少
    • 與全連線 (FC) 層不同——全連線(FC)層新增了大量的引數

3.8 CNN 應用:機器翻譯

CNN 應用:機器翻譯

  • 最早成功的神經機器翻譯之一
  • 使用CNN進行編碼,使用RNN進行解碼
  • Kalchbrennerand Blunsom(2013) Recurrent Continuous Translation Models

3.9 #論文解讀# Learning Character-level Representations for Part-of-Speech Tagging

#論文解讀# Learning Character-level Representations for Part-of-Speech Tagging

  • 對字元進行卷積以生成單詞嵌入
  • 固定視窗的詞嵌入被用於 POS 標籤

3.10 #論文解讀# Character-Aware Neural Language Models

#論文解讀# Character-Aware Neural Language Models

  • 基於字元的單詞嵌入
  • 利用卷積、highway network 和 LSTM

4.深度CNN用於文字分類

4.1 深度卷積網路用於文字分類

深度卷積網路用於文字分類

  • 起始點:序列模型 (LSTMs) 在 NLP 中占主導地位;還有CNNs、注意力等等,但是所有的模型基本上都不是很深入——不像計算機視覺中的深度模型
  • 當我們為 NLP 構建一個類似視覺的系統時會發生什麼
  • 從字元級開始工作

4.2 VD-CNN 結構

VD-CNN 結構

  • 整個系統和視覺神經網路模型中的 VGG 和 ResNet 結構有點像
  • 不太像一個典型的深度學習 NLP 系統
  • 結果是固定大小,因為文字被截斷或者填充成統一長度了
  • 每個階段都有區域性池化操作,特徵數量 double

4.3 VD-CNN的卷積模組

Convolutional block in VD-CNN

  • 每個卷積塊是兩個卷積層,每個卷積層後面是 BatchNorm 和一個 ReLU
  • 卷積大小為 3
  • pad 以保持 (或在區域性池化時減半) 維數

4.4 實驗結果

實驗結果

  • 使用大文字分類資料集
    • 比 NLP 中經常使用的小資料集大得多,如Yoon Kim(2014) 的論文

補充講解

  • 以上資料均為錯誤率,所以越低越好
  • 深度網路會取得更好的結果,殘差層取得很好的結果,但是深度再深時並未取得效果提升
  • 實驗表明使用 MaxPooling 比 KMaxPooling 和 使用 stride 的卷積 的兩種其他池化方法要更好
  • ConvNets 可以幫助我們建立很好的文字分類系統

實驗結果

4.5 RNNs比較慢

RNNs比較慢

  • RNNs 是深度 NLP 的一個非常標準的構建塊
  • 但它們的並行性很差,因此速度很慢
  • 想法:取 RNNs 和 CNNs 中最好且可並行的部分

5.Q-RNN模型

5.1 Quasi-Recurrent Neural Network

Quasi-Recurrent Neural Network

  • 努力把兩個模型家族的優點結合起來
  • 時間上並行的卷積,卷積計算候選,遺忘門和輸出門

\[\begin{aligned} \mathbf{z}_{t} &=\tanh \left(\mathbf{W}_{z}^{1} \mathbf{x}_{t-1}+\mathbf{W}_{z}^{2} \mathbf{x}_{t}\right) \\ \mathbf{f}_{t} &=\sigma\left(\mathbf{W}_{f}^{1} \mathbf{x}_{t-1}+\mathbf{W}_{f}^{2} \mathbf{x}_{t}\right) \\ \mathbf{o}_{t} &=\sigma\left(\mathbf{W}_{o}^{1} \mathbf{x}_{t-1}+\mathbf{W}_{o}^{2} \mathbf{x}_{t}\right) \end{aligned} \]

\[\begin{aligned} \mathbf{Z} &=\tanh \left(\mathbf{W}_{z} * \mathbf{X}\right) \\ \mathbf{F} &=\sigma\left(\mathbf{W}_{f} * \mathbf{X}\right) \\ \mathbf{O} &=\sigma\left(\mathbf{W}_{o} * \mathbf{X}\right) \end{aligned} \]

  • 跨通道並行性的逐元素的門控偽遞迴是在池化層中完成的

\[\mathbf{h}_{t}=\mathbf{f}_{t} \odot \mathbf{h}_{t-1}+\left(1-\mathbf{f}_{t}\right) \odot \mathbf{z}_{t} \]

5.2 Q-RNN 實驗:語言模型

Q-RNN 實驗:語言模型

5.3 Q-RNNs:情感分析

Q-RNNs:情感分析

  • 通常比 LSTMs 更好更快
  • 可解釋更好

5.4 QRNN 的限制

QRNN 的限制

  • 對於字元級的 LMs 並不像 LSTMs 那樣有效
    • 建模時遇到的更長的依賴關係問題
  • 通常需要更深入的網路來獲得與 LSTM 一樣好的效能
    • 當它們更深入時,速度仍然更快
    • 有效地使用深度作為真正遞迴的替代

5.5 RNN的缺點&Transformer提出的動機

RNN的缺點&Transformer提出的動機

  • 我們希望能夠並行加速,但 RNN 是序列的
  • 儘管 GRUs 和 LSTMs,RNNs 通過注意力機制可以捕捉到長時依賴,但隨著序列增長,需要計算的路徑也在增長
  • 如果注意力機制本身可以讓我們關注任何位置的資訊,可能我們不需要 RNN?

6.視訊教程

可以點選 B站 檢視視訊的【雙語字幕】版本

[video(video-klkA71cI-1652090215444)(type-bilibili)(url-https://player.bilibili.com/player.html?aid=376755412&page=11)(image-https://img-blog.csdnimg.cn/img_convert/7ee2eb31a0061266f88507f561dd96f4.png)(title-【雙語字幕+資料下載】史丹佛CS224n | 深度學習與自然語言處理(2019·全20講))]

7.參考資料

ShowMeAI系列教程推薦

NLP系列教程文章

史丹佛 CS224n 課程帶學詳解

ShowMeAI用知識加速每一次技術成長