作者:韓信子@ShowMeAI,路遙@ShowMeAI,奇異果@ShowMeAI
教程地址:http://www.showmeai.tech/tutorials/36
本文地址:http://www.showmeai.tech/article-detail/248
宣告:版權所有,轉載請聯絡平臺與作者並註明出處
收藏ShowMeAI檢視更多精彩內容
ShowMeAI為史丹佛CS224n《自然語言處理與深度學習(Natural Language Processing with Deep Learning)》課程的全部課件,做了中文翻譯和註釋,並製作成了GIF動圖!
本講內容的深度總結教程可以在這裡 檢視。視訊和課件等資料的獲取方式見文末。
引言
授課計劃
- 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
- 迴圈神經網路不能捕獲沒有字首上下文的短語
- 經常在最終向量中捕獲的資訊太多來自於最後的一些詞彙內容
- 例如:softmax通常只在最後一步計算
- 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 卷積神經網路
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,隨時間推移填充最大池化
- 平均池化對 feature map 求平均
1.7 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)
- stride 步長,減少計算量
1.9 區域性最大池化
- 每兩行做 max pooling,被稱為步長為 2 的區域性最大池化
1.10 1維卷積的k-max pooling
- 記錄每一個 channel 的所有時間的 top k 的啟用值,並且按原有順序保留(上例中的-0.2 0.3)
1.11 空洞卷積:dilation為2
擴張卷積 / 空洞卷積
- 上例中,對1 3 5行進行卷積,通過兩個 filter 得到兩個 channel 的啟用值
- 可以在第一步的卷積中將卷積核從 3 改為 5,即可實現這樣的效果,既保證了矩陣很小,又保證了一次卷積中看到更大範圍的句子
補充講解 / Summary
- CNN中,一次能看一個句子的多少內容是很重要的概念
- 可以使用更大的 filter、擴張卷積或者增大卷積深度 (層數)
2.應用CNN做文字分類
2.1 用於句子分類的單層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
- 過濾器 \(w\) 應用於所有可能的視窗(連線向量)
- 為CNN層計算特徵(一個通道)
-
句子 \(\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\) 的長度無關
- 所以我們可以有一些 filters 來觀察 unigrams、bigrams、tri-grams、4-grams等等
2.4 多通道輸入資料
- 使用預先訓練的單詞向量初始化 (word2vec 或 Glove)
- 從兩個副本開始
- 只對1個副本進行了反向傳播,其他保持
靜態
- 兩個通道集都在最大池化前新增到 \(c_i\)
2.5 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 正則化
- 使用 Dropout:使用概率 \(p\) (超引數) 的伯努利隨機變數(只有0 1並且 \(p\) 是為 \(1\) 的概率)建立 mask 向量 \(r\)
- 訓練過程中刪除特徵
- 解釋:防止互相適應(對特定特徵的過度擬合)
- 在測試時不適用 Dropout,使用概率 \(p\) 縮放最終向量
- 此外:限制每個類的權重向量的 L2 Norm (softmax 權重 \(W^{(S)}\) 的每一行) 不超過固定數 \(s\) (也是超引數)
- 如果 \(\left\|W_{c}^{(S)}\right\|>s\) ,則重新縮放為 \(\left\|W_{c}^{(S)}\right\|=s\)
- 不是很常見
3.CNN細節
3.1 CNN引數討論
- 基於驗證集 (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
- Dropout 提供了 \(2 - 4 \%\) 的精度改進
- 但幾個比較系統沒有使用 Dropout,並可能從它獲得相同的收益
- 仍然被視為一個簡單架構的顯著結果
- 與我們在前幾節課中描述的視窗和 RNN 架構的不同之處:池化、許多過濾器和 Dropout
- 這些想法中有的可以被用在 RNNs 中
3.4 模型對比
- 詞袋模型 / Bag of Vectors:對於簡單的分類問題,這是一個非常好的基線。特別是如果後面有幾個 ReLU 層 (See paper: Deep Averaging Networks)
- 詞窗分類 / Window Model:對於不需要廣泛上下文的問題 (即適用於 local 問題),適合單字分類。例如 POS、NER
- 卷積神經網路 / CNN:適合分類,較短的短語需要零填充,難以解釋,易於在 gpu 上並行化
- 迴圈神經網路 / RNN:從左到右的認知更加具有可信度,不適合分類 (如果只使用最後一種狀態),比 CNNs 慢得多,適合序列標記和分類以及語言模型,結合注意力機制時非常棒
補充講解
- RNN對序列標記和分類之類的事情有很好的效果,以及語言模型預測下一個單詞,並且結合注意力機制會取得很好的效果,但是對於某個句子的整體解釋,CNN做的是更好的
3.5 跳接結構應用
- 我們在 LSTMs 和 GRUs 中看到的 門/跳接 是一個普遍的概念,現在在很多地方都使用這個概念
- 你還可以使用
**縱向**
的門 - 實際上,關鍵的概念——用快捷連線對候選更新求和——是非常深的網路工作所需要的
- Note:新增它們時,請將 \(x\) 填充成conv一樣的維度,再求和
3.6 批歸一化BatchNorm
- 常用於 CNNs
- 通過將啟用量縮放為零均值和單位方差,對一個 mini-batch 的卷積輸出進行變換
- 這是統計學中熟悉的 Z-transform
- 但在每組 mini-batch 都會更新,所以波動的影響不大
- 使用 BatchNorm 使模型對引數初始化的敏感程度下降,因為輸出是自動重新標度的
- 也會讓學習率的調優更簡單,模型的訓練會更加穩定
- PyTorch:
nn.BatchNorm1d
3.7 1x1卷積
- 1x1的卷積有作用嗎?是的。
- 1x1 卷積,即網路中的 Network-in-network (NiN) connections,是核心大小為1的卷積核心
- 1x1 卷積提供了一個跨通道的全連線的線性層
- 它可以用於從多個通道對映到更少的通道
- 1x1 卷積新增了額外的神經網路層,附加的引數很少
- 與全連線 (FC) 層不同——全連線(FC)層新增了大量的引數
3.8 CNN 應用:機器翻譯
- 最早成功的神經機器翻譯之一
- 使用CNN進行編碼,使用RNN進行解碼
- Kalchbrennerand Blunsom(2013)
Recurrent Continuous Translation Models
3.9 #論文解讀# Learning Character-level Representations for Part-of-Speech Tagging
- 對字元進行卷積以生成單詞嵌入
- 固定視窗的詞嵌入被用於 POS 標籤
3.10 #論文解讀# Character-Aware Neural Language Models
- 基於字元的單詞嵌入
- 利用卷積、highway network 和 LSTM
4.深度CNN用於文字分類
4.1 深度卷積網路用於文字分類
- 起始點:序列模型 (LSTMs) 在 NLP 中占主導地位;還有CNNs、注意力等等,但是所有的模型基本上都不是很深入——不像計算機視覺中的深度模型
- 當我們為 NLP 構建一個類似視覺的系統時會發生什麼
- 從字元級開始工作
4.2 VD-CNN 結構
- 整個系統和視覺神經網路模型中的 VGG 和 ResNet 結構有點像
- 不太像一個典型的深度學習 NLP 系統
- 結果是固定大小,因為文字被截斷或者填充成統一長度了
- 每個階段都有區域性池化操作,特徵數量 double
4.3 VD-CNN的卷積模組
- 每個卷積塊是兩個卷積層,每個卷積層後面是 BatchNorm 和一個 ReLU
- 卷積大小為 3
- pad 以保持 (或在區域性池化時減半) 維數
4.4 實驗結果
- 使用大文字分類資料集
- 比 NLP 中經常使用的小資料集大得多,如Yoon Kim(2014) 的論文
補充講解
- 以上資料均為錯誤率,所以越低越好
- 深度網路會取得更好的結果,殘差層取得很好的結果,但是深度再深時並未取得效果提升
- 實驗表明使用 MaxPooling 比 KMaxPooling 和 使用 stride 的卷積 的兩種其他池化方法要更好
- ConvNets 可以幫助我們建立很好的文字分類系統
4.5 RNNs比較慢
- RNNs 是深度 NLP 的一個非常標準的構建塊
- 但它們的並行性很差,因此速度很慢
- 想法:取 RNNs 和 CNNs 中最好且可並行的部分
5.Q-RNN模型
5.1 Quasi-Recurrent Neural Network
- 努力把兩個模型家族的優點結合起來
- 時間上並行的卷積,卷積計算候選,遺忘門和輸出門
- 跨通道並行性的逐元素的門控偽遞迴是在池化層中完成的
5.2 Q-RNN 實驗:語言模型
5.3 Q-RNNs:情感分析
- 通常比 LSTMs 更好更快
- 可解釋更好
5.4 QRNN 的限制
- 對於字元級的 LMs 並不像 LSTMs 那樣有效
- 建模時遇到的更長的依賴關係問題
- 通常需要更深入的網路來獲得與 LSTM 一樣好的效能
- 當它們更深入時,速度仍然更快
- 有效地使用深度作為真正遞迴的替代
5.5 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.參考資料
- 本講帶學的線上閱翻頁本
- 《史丹佛CS224n深度學習與自然語言處理》課程學習指南
- 《史丹佛CS224n深度學習與自然語言處理》課程大作業解析
- 【雙語字幕視訊】史丹佛CS224n | 深度學習與自然語言處理(2019·全20講)
- Stanford官網 | CS224n: Natural Language Processing with Deep Learning
ShowMeAI系列教程推薦
- 大廠技術實現 | 推薦與廣告計算解決方案
- 大廠技術實現 | 計算機視覺解決方案
- 大廠技術實現 | 自然語言處理行業解決方案
- 圖解Python程式設計:從入門到精通系列教程
- 圖解資料分析:從入門到精通系列教程
- 圖解AI數學基礎:從入門到精通系列教程
- 圖解大資料技術:從入門到精通系列教程
- 圖解機器學習演算法:從入門到精通系列教程
- 機器學習實戰:手把手教你玩轉機器學習系列
- 深度學習教程 | 吳恩達專項課程 · 全套筆記解讀
- 自然語言處理教程 | 史丹佛CS224n課程 · 課程帶學與全套筆記解讀
NLP系列教程文章
- NLP教程(1)- 詞向量、SVD分解與Word2vec
- NLP教程(2)- GloVe及詞向量的訓練與評估
- NLP教程(3)- 神經網路與反向傳播
- NLP教程(4)- 句法分析與依存解析
- NLP教程(5)- 語言模型、RNN、GRU與LSTM
- NLP教程(6)- 神經機器翻譯、seq2seq與注意力機制
- NLP教程(7)- 問答系統
- NLP教程(8)- NLP中的卷積神經網路
- NLP教程(9)- 句法分析與樹形遞迴神經網路
史丹佛 CS224n 課程帶學詳解
- 史丹佛NLP課程 | 第1講 - NLP介紹與詞向量初步
- 史丹佛NLP課程 | 第2講 - 詞向量進階
- 史丹佛NLP課程 | 第3講 - 神經網路知識回顧
- 史丹佛NLP課程 | 第4講 - 神經網路反向傳播與計算圖
- 史丹佛NLP課程 | 第5講 - 句法分析與依存解析
- 史丹佛NLP課程 | 第6講 - 迴圈神經網路與語言模型
- 史丹佛NLP課程 | 第7講 - 梯度消失問題與RNN變種
- 史丹佛NLP課程 | 第8講 - 機器翻譯、seq2seq與注意力機制
- 史丹佛NLP課程 | 第9講 - cs224n課程大專案實用技巧與經驗
- 史丹佛NLP課程 | 第10講 - NLP中的問答系統
- 史丹佛NLP課程 | 第11講 - NLP中的卷積神經網路
- 史丹佛NLP課程 | 第12講 - 子詞模型
- 史丹佛NLP課程 | 第13講 - 基於上下文的表徵與NLP預訓練模型
- 史丹佛NLP課程 | 第14講 - Transformers自注意力與生成模型
- 史丹佛NLP課程 | 第15講 - NLP文字生成任務
- 史丹佛NLP課程 | 第16講 - 指代消解問題與神經網路方法
- 史丹佛NLP課程 | 第17講 - 多工學習(以問答系統為例)
- 史丹佛NLP課程 | 第18講 - 句法分析與樹形遞迴神經網路
- 史丹佛NLP課程 | 第19講 - AI安全偏見與公平
- 史丹佛NLP課程 | 第20講 - NLP與深度學習的未來