文章目录
- From RNNs to Convolutional Neural Nets
- CNNS
-
- What is a convolution anyway?
- convolution for text
- Single Layer CNN for Sentence Classification
- Model comparison: Our growing toolkit
- Very Deep Convolutional Networks for Text Classification
- RNNs are Slow …
- 总结
推荐一本书
From RNNs to Convolutional Neural Nets
-
循环神经网络不能捕获没有前缀上下文的短语
-
总是捕获了太多最后一个词的信息在最终词向量中
-
例如,softmax总是在最后一步计算
-
RNN的主要思想:
- 对每个固定长度的可能的词序列计算一个向量
- 例如“tentative deal reached to keep government open”
为以下词序列计算向量
tentative deal reached, deal reached to, reached to keep, to keep government, keep government open
- 不管短语是否合乎语法
- 在语言或认知上不太合理
- 然后再分组(稍后)
CNNS
What is a convolution anyway?
- 一维卷积:假设f和g是两个一维向量,其中f是主向量,g是filter,f和g直接的卷积,在n处的值表示为 ( f ∗ g ) [ n ] (f*g)[n] (f∗g)[n],值等于 ∑ m = − M M f [ n − m ] g [ m ] \sum_{m=-M}^{M}f[n-m]g[m] ∑m=−MMf[n−m]g[m]
- 卷积常用于提取图片的特征
- 二维卷积:如下图所示
convolution for text
- 普通卷积,使用3×3的filter,相当于提取tri-gram的特征
- with padding:前后增加padding,可以保持经过卷积后维度不变
- 3 channel:使用3个filter,分别提取不同的特征
- pooling:使用池化可以缩小维度
- max,最大池化
- ave:平均池化
In 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)
hidden1 = conv1(input)
hidden2 = torch.max(hidden1, dim=2)
其他概念
- stride = 2,步长,filter每次移动的距离
- Less useful: local max pool, stride = 2
每两行做 max pooling,被称为步长为2的局部最大池化
- 记录每一个channel的所有时间的 top k的激活值,并且按原有顺序保留(如下图中的-0.2 0.3)
- 扩张卷积
- 上例中,对1 3 5行进行卷积,通过两个filter得到两个channel的激活值
- 可以在第一步的卷积中将卷积核从3改为5,即可实现这样的效果,既保证了矩阵很小,又保证了一次卷积中看到更大范围的句子
Single Layer CNN for Sentence Classification
- Yoon Kim (2014): Convolutional Neural Networks for Sentence Classification. EMNLP 2014. https://arxiv.org/pdf/1408.5882.pdf Code: https://arxiv.org/pdf/1408.5882.pdf[Theano!, etc.]
- A variant of convolutional NNs of Collobert, Weston et al. (2011)
- 目标:句子分类
- 主要是句子的积极或消极情感
- 其他类似的任务:判断句子的主观或客观、问题分类:关于人,地点,数字,…
- 单层卷积和池化的简单应用
- 词向量: x i ∈ R k x_i \in R^k xi∈Rk
- 句子: x 1 : n = x 1 ⨁ x 1 ⨁ ⋅ ⋅ ⋅ ⨁ x n x_{1:n} = x_1 \bigoplus x_1 \bigoplus ··· \bigoplus x_n x1:n=x1⨁x1⨁⋅⋅⋅⨁xn(词向量拼接而成)
- 连接 x i : i + j x_{i:i+j} xi:i+j范围内的词 (对称更常见)
- 卷积核是一个向量: w ∈ R h k w \in R^{hk} w∈Rhk
- 卷积核的大小可以是2,3,4(指上式中的h)
- 卷积核 w w w被用到所有可能的windows(即拼接而成的词向量)
- 根据下式计算一个window的一个特征(one channel) c i = f ( w T x i : i + h − 1 + b ) c_i = f(w^Tx_{i:i+h-1} +b) ci=f(wTxi:i+h−1+b)
- 长度为h的所有可能window: x 1 : h , x 2 : h + 1 , ⋅ ⋅ ⋅ , x n − h + 1 : n {x_{1:h}, x_{2:h+1}, ···, x_{n-h+1:n}} x1:h,x2:h+1,⋅⋅⋅,xn−h+1:n
- 一个feature map(即用一个卷积核卷积得到的结果)的结果为: c = [ c 1 , c 2 , ⋅ ⋅ ⋅ , c n − h + 1 ] ∈ R n − h + 1 c = [c_1, c_2, ···, c_{n-h+1}] \in R^{n-h+1} c=[c1,c2,⋅⋅⋅,cn−h+1]∈Rn−h+1,需要对原句子进行padding,如下图在句子末尾进行了padding
Pooling and channels
- 池化: 最大池化就是选择最大的值作为结果
- 想法:捕获最重要的激活
- 如对上述获得的feature map进行pool就会得到一个向量: ( ^ c ) = m a x { c } \hat (c) = max\{\boldsymbol c\} (^c)=max{c}
- 使用多个filter 权重w(即多个channels),每个filter会获得一个feature map
- 可以有不同的window大小h,因为最大池化 ( ^ c ) = m a x { c } \hat (c) = max\{\boldsymbol c\} (^c)=max{c}与c的长度无关
- 所以可以设置多个filters来提取unigrams,bigrams,tri-grams,4-grams的特征
Multi-channel input idea
- 使用预先训练的单词向量初始化(word2vec或Glove)
- 从两个副本开始
- 只有一个副本进行了反向传播,保持其他“静态”
- 两个通道集都在最大池化前添加到 c i c_i ci
Classification after one CNN layer
- 首先经过一层卷积,然后使用一次最大池化
- 来获得最终的特征向量: z = [ ( ^ c 1 ) , ⋅ ⋅ ⋅ , ( ^ c m ) ] z=[\hat (c_1), ···, \hat (c_m) ] z=[(^c1),⋅⋅⋅,(^cm)](假设有m个filters w)
- 对size为3,4,5都使用100个feature maps
- 最后使用一个softmax层:$ y= softmax(W^{(S)z + b)$
- 输入为7个词的一句话,词向量d = 5,大小为2,3,4的卷积核分别有2个。经卷积得到6个feature map,长度分别为4,4,5,5,6,6
- 对得到的6个feature map使用最大池化拼接后得到长度为6个向量,最后经过一个softmax完成二分类
Regularization
- 使用 Dropout : 使用概率 p (超参数)的伯努利随机变量(只有0 1并且p是为1的概率)创建mask向量 r
- 在训练的时候删除一些特征: y = s o f t m a x ( W ( S ) ( r ∘ z ) + b ) y = softmax(W^{(S)}(r \circ z) +b) y=softmax(W(S)(r∘z)+b)
- 解释:防止互相适应(对特定特征的过度拟合)(Srivastava, Hinton, et al. 2014),即在训练时随机删除一些特征,防止对某些特征产生过拟合,让得到的模型能更加泛化
- 在测试时,不用dropout,使用概率p缩放最终向量: W ^ ( S ) = p W ( S ) \hat W^{(S)} = pW^{(S)} W^(S)=pW(S)
- 此外:限制每个类的权重向量的L2 Norm(softmax 权重$W^{(S)}的每一行)不超过固定数 s(也是超参数)
- 如果 ∣ ∣ W c ( S ) ∣ ∣ > s ||W_c^{(S)}||>s ∣∣Wc(S)∣∣>s,那么将其限制为 ∣ ∣ W c ( S ) ∣ ∣ > s ||W_c^{(S)}||>s ∣∣Wc(S)∣∣>s
All hyperparametersin Kim (2014)
Experiments
Problem with comparison?
- Dropout提供了2%-4%的准确度提升
- 但几个比较系统没有使用Dropout,并可能从它获得相同的收益
- 仍然被视为一个简单架构的显著结果
- 与我们之前课程中window和RNN架构不同的是:pooling,many filters,dropout
- 这其中的有些想法也可以用到RNNs中
Model comparison: Our growing toolkit
- Bag of Vectors:对于简单的分类问题来说,非常好的基线。尤其是后面跟着几层ReLu!(见论文:Deep Averaging Networks)
- Window Model:对于不需要广泛上下文的问题(即适用于local问题),适合单字分类。例如POS, NER
- CNNs:适合分类,短短语需要零填充,难以解释,易于在gpu上并行化。高效多功能
- Recurrent Neural Networks:从认知上讲似乎合理(从左到右阅读),不适合分类(如果只是使用最后一个状态),比CNNs慢得多,适合序列标记和分类,对语言模型很好,使用注意机制可能会令人惊奇
Gated units used vertically
- 我们在LSTMs和GRUs中看到的 gating/skipping是一个通用的概念,现在在很多地方都使用
- 也可以使用垂直的的门
- 实际上,关键的概念——用快捷连接对候选更新求和——是非常深的网络工作所需要的
Batch Normalization (BatchNorm)
[Ioffeand Szegedy. 2015. Batch normalization: Accelerating deep network training by reducing internal covariate shift. arXiv:1502.03167.]
- 经常在CNNs中使用
- 通过将激活量缩放为零均值和单位方差,对一个mini-batch的卷积输出进行变换
- 这是统计学中熟悉的 Z-transform
- 但在每组mini-batch都会更新,所以波动的影响不大
- 使用BatchNorm使模型对参数初始化的敏感程度下降,因为输出是自动重新标度的
- 也会让学习率的调优更简单
- 模型的训练会更加稳定
- 知乎有一个解释BN的回答:https://www.zhihu.com/question/38102762
简单来说,BN的作用是客服深度神经网络难以训练的问题
- Pytorch:nn.BatchNorm1d
1 x 1 Convolutions
[Lin, Chen, and Yan. 2013. Network in network. arXiv:1312.4400.]
- 这个概念有意义吗?是的
- 1x1卷积,即网络中的 Network-in-network (NiN) connections,是内核大小为1的卷积内核
- 1x1卷积为您提供了一个跨通道的全连接的线性层
- 它可以用于从多个通道映射到更少的通道
- 1x 1卷积添加了额外的神经网络层,附加的参数很少,
- 与全连接(FC)层不同,全连接(FC)层添加了大量的参数
- 有一篇文章说明1×1卷积,挺不错的:https://zhuanlan.zhihu.com/p/40050371
CNN application: Translation
- 最早成功的神经机器翻译之一
- 使用CNN进行编码,使用RNN进行解码
- Kalchbrennerand Blunsom(2013) “Recurrent Continuous Translation Models” 论文地址:https://www.aclweb.org/anthology/D13-1176.pdf
Learning Character-level Representations for Part-of-Speech Tagging
Dos Santos and Zadrozny(2014)
- 对字符进行卷积以生成单词嵌入
- 固定窗口的词嵌入被用于POS标签
Character-Aware Neural Language Models
(Kim, Jernite, Sontag, and Rush 2015)
- 基于字符的单词嵌入
- 利用卷积、highway network和LSTM
Very Deep Convolutional Networks for Text Classification
- Conneau, Schwenk, Lecun, Barrault. EACL 2017.
- 出发点:序列模型(LSTMs)在NLP中占主导地位;还有CNNs、Attention等,但所有的模型基本上都不是很深,不像视觉中的深模型
- 当我们为NLP构建一个类似视觉的系统时会发生什么
- 从字符级开始工作
Convolutional block in VD-CNN
- 每个卷积块是两个卷积层,每个卷积层后面是BatchNorm和一个ReLU
- 卷积大小为3
- pad 以保持(或在局部池化时减半)维数
Experiments
使用大规模文本分类数据集,比NLP中经常使用的小数据集大得多
如在Yoon Kim (2014) 论文
- 实验表明使用 MaxPooling 比 KMaxPooling 和 使用stride的卷积 的两种其他池化方法要更好
- ConvNets可以帮助我们建立很好的文本分类系统
- 较深的网络比浅网络结果要好,但更深时效果没有太大提升
RNNs are Slow …
- RNNs是深度NLP模型中一个标准的构建块
- 但他们并行性很差,所以很慢
- 想法:取RNN和CNN中最好的可并行部分
- Quasi-Recurrent Neural Networks by James Bradbury, Stephen Merity, CaimingXiong& Richard Socher. ICLR 2017
Quasi-Recurrent Neural Network
- 尝试结合两个模型的优点
- 时间上并行的卷积,卷积计算候选,遗忘门和输出门(使用CNN来提取大部分特征)
- 为了利用上下文信息,QRNN将CNN中的pooling layer用dynamic average pooling来替换:(使用RNN提取序列整体特征)
h t = f t ⨀ h t − 1 + ( 1 − f t ) ⨀ z t h_t = f_t \bigodot h_{t-1} + (1-f_t) \bigodot z_t ht=ft⨀ht−1+(1−ft)⨀zt
Q-RNN Experiments: Language Modeling
James Bradbury,Stephen Merity,CaimingXiong,Richard Socher (ICLR 2017)
Q-RNNs for Sentiment Analysis
- 通常比LSTMs更好更快
- 更具解释性,例如下图
- 评论从117开始“not exactly a bad story”到158“I recommend this movie to everyone, even if you’ve never played the game”是积极的,从上图可视化可以看到,117-158,的隐藏层变量更浅
QRNN limitations
- 对于字符级的LMs并不像LSTMs那样有效
- 通常需要更深入的网络来获得与LSTM一样好的性能
- 当它们更深入时,速度仍然更快
- 有效地使用深度作为真正递归的替代
Problems with RNNs & Motivation for Transformers
- 我们希望并行化,但rnn本质上是顺序的
- 尽管有GRUs和LSTM,RNN仍需从注意机制中获得处理长距离依赖关系的能力——状态间的路径长度随着序列的增长而增长
- 但是如果注意力让我们接触到任何状态…也许我们不需要RNN?
总结
- 介绍了CNN如何计算
- 介绍了CNN如何用于处理文本中,一些概念
- 1×1卷积:可用来不改变width和length的情况下改变channel
- 池化:最大池化,平均池化,局部最大池化(local max pool),k-max pooling。最大池化与feature map的长度无关,故使用不同size的filter来提取不同gram的特征,然后经最大池化后拼接在一起
- padding
- channels:即filter的个数 = 得到的feature map的个数
- Batch Normalization
- 步长(stride)
- dilation
- dropout:训练时随机去掉某些特征,防止过拟合的一种方法
- 我们目前的工具箱有:Bag of Vectors,Window Model,CNN,Recurrent Neural Networks。各自有不同的优点
- Gated units:关键的想法:使用shortcut来将候选的更新加起来
与Batch Normalization一样都可以使深度神经网络易于训练
- 使用CNN可以做文本分类,机器翻译(2013使用CNN+RNN)
- QRNN:结合CNN和RNN各自的优点
- Transformers的motivation:RNN无法并行,且需要长距离依赖时还是需要使用注意力机制来获得。因此,若能使用注意力机制连接任意状态,那么能否不使用RNN?