NLP中的ConvNet

​ NLP/AI是近几年来飞速发展的领域,很多的模型和算法只能在论文、讲义和博客中找到,而不会出现在任何的教科书中。凡是课程中提到的论文,大家都能够阅读一遍。对于重要的论文(我会特别标明或者在课上强调,例如BERT, transformer等),建议认真阅读,搞清楚模型的细节。其余的论文,建议至少能够阅读,了解论文的创新点和中心思想。

如何读论文?

对于如何读论文,每个人有自己不同的方法。我的建议是:

  • 最快读论文的方法:上各大中文网站(知乎,CSDN,微信公众号等)寻找该论文的中文解读,大部分有名的论文都会有很多的解读文章。

  • 读论文时候的重点章节:大部分NLP的论文的主要两个章节是,Model, Experiments。基本上看完这两个章节就了解了论文的核心思想。另外我也会特别关注论文使用的数据,因为这些数据我们可能可以拿来用在自己的项目上。

  • 如果想要更加深入地学习该论文的内容,可以上网去寻找与该论文相关的资料,包括作者的个人主页,他/她发布的论文slides,论文代码等等。顺便说一下,如果你想要复现论文的结果,但是在网上找不到代码,不要急于自己实现,可以写邮件给论文的第一作者与通讯作者(最后一位),礼貌地询问对方是否可以将源码和数据提供给你,理论上论文作者有义务公开自己的代码和数据。如果没有代码可以公开,要不然可能是论文太新,还没有公开代码,要不然可能是论文中某些部分的实现有困难,不那么容易复现。

  • 另外如果你想要更深入地学习这个论文相关的领域,可以读一下Related Work中提到的一些文章。

NLP中的 ConvNet 精选论文

MNIST

convolutional kernel: local feature detector

图像:

  • 平移不变性

  • pixel features

Hinton

  • Capsule Network

  • ConvNet的缺陷:

  • 没有处理旋转不变性

  • 图片大小发生改变

文本

  • ngram

  • ngram 之间的联系 n-n-gram

曾经有一段时间由于Yann Lecun加入Facebook AI Research担任Director的关系,FB投入了很多的精力研发把ConvNet用在Text问题上。ConvNet主打的一个强项就是速度比RNN快,Encoder可以并行。后来可能是由于Google的Transformer开始统治这个领域,导致大家慢慢在ConvNet上的关注度越来越小。

transformer (BERT) 就是 filter size 为 1 的 convolutional neural network 。

不过这一系列以ConvNet为核心的NLP模型依然非常值得学习。ConvNet的一个长处在于它可以很自然地得到 ngram 的表示。由于NLP最近的进展日新月异,可能几天或者几个月之后又有一系列基于ConvNet的模型重登SOTA,谁知道呢。

对于不了解什么是Convolutional Neural Network的同学,建议阅读斯坦福cs231的课程资料 http://cs231n.github.io/convolutional-networks/ 网上的中文翻译很多,例如:https://zhuanlan.zhihu.com/p/22038289?refer=intelligentunit

Yoon Kim Convolutional Neural Networks for Sentence Classification

https://aclweb.org/anthology/D14-1181

这篇文章首次提出了在text上使用convolutional network,并且取得了不错的效果。后续很多把ConvNet用在NLP任务上都是基于这篇论文的模型改进。

模型架构图

img

embedding层

img

convolution层

img

img

Max over time pooling

img

输出层

一个affine transformation加上dropout

img

模型的效果

可以媲美当时的众多传统模型。从今天的眼光来看这个模型的思路还是挺简单的,不过当时大家开始探索把CNN用到text问题上的时候,这一系列模型架构的想法还是很新颖的。

img

我们的代码实现

用ConvNet做文本分类的部分代码。有些部分可能的实现可能和模型有一定出入,不过我的模型实现效果也很不错,仅供参考。

https://github.com/ZeweiChu/PyTorch-Course/blob/master/notebooks/4.sentiment_with_mask.ipynb

感兴趣的同学可以参考更多Yoon Kim的工作

http://www.people.fas.harvard.edu/~yoonkim/

Yoon Kim的导师Alex Rush

http://nlp.seas.harvard.edu/rush.html

他们的一项工作OpenNMT-py

https://github.com/OpenNMT/OpenNMT-py

Alex Rush的一些优秀学生

Sam Wiseman https://swiseman.github.io/ 他做了很多VAE的工作

Zhang et. al., Character-level Convolutional Networks for Text Classification

https://papers.nips.cc/paper/5782-character-level-convolutional-networks-for-text-classification.pdf

这篇文章在char层面上使用ConvNet,当时在分类任务上取得了SOTA的效果。后来人们经常把这套方法用来做单词表示的学习,例如ELMo就是用CharCNN来encode单词的。

关键Modules

Convolutional Module

img

k是kernel size。

max pooling

img

模型架构图

img

在ELMo上的character embedding

img

模型代码

https://github.com/srviest/char-cnn-text-classification-pytorch/blob/master/model.py

Gehring et. al., Convolutional Sequence to Sequence Learning

https://arxiv.org/pdf/1705.03122.pdf

参考博客资料

https://ycts.github.io/weeklypapers/convSeq2seq/

用ConvNet做Seq2Seq模型,其实这篇文章中有很多Transformer的影子,并且模型效果也很好。可能由于同时期的Transformer光芒过于耀眼,掩盖了这一篇同样非常重量级的文章。

我的建议是,这篇文章可以简要阅读,了解ConvNet可以怎么样被运用到Text Modeling问题上。由于现在学术界和工业界的主流是各种Transformer模型的变种,且Transformer的模型相对更简洁易懂,所以建议同学们在后面花更多的时间在Transformer上。最近很多NLP的面试都会问到一些与Transformer和BERT相关的问题,可能很多人不太了解这篇Conv Seq2Seq的论文。

Positional Embedddings

img

对每个单词分别做word embedding w_i和positional embedding p_i,然后单词的embedding的w_i + p_i。p_i是模型的参数,在训练中会被更新。

如果没有positional embedding,CNN是无法知晓单词的位置信息的。因为不同于LSTM,如果没有postional embedding,在CNN encoder中的单词位置其实没有区别。

Convolutional Block Structure

Encoder和Decoder第l层的输入

img

每一层都包含一个一维Convolution,以及一个non-linearity单元,其中conv block/layer的kernel宽度为k,其output包含k个输入元素的信息。参数为

img

输出为

img

然后使用一个Gated Linear Units作为non-linearity。

img

encoder和decoder都有好多层,每一层都加上了residual connection。

img

我们在encoder每一层的左右两边都添加padding,这样可以保证每一层经过convolution之后输出的长度和原来一样。decoder和encoder稍有不同,因为我们必须保证我们在decoder一个位置的单词的时候没有看到这个位置后面的单词。所以我们的做法是,在decoder每一层左右两边都加上k-1个padding,做完conv之后把右边的k个单位移除。

最后的一个标准套路是把hidden state做个affine transformation,然后Softmax变成单词表上的一个概率分布。

img

Multi-step Attention

Decoder的每一层都有单独的Attention。

img

g_i是当前单词的embedding,

img

然后我们用这个新造的 d_i^l 对 encoder 的每个位置做attention。

img

然后非常常规的,用attention score对encoder hidden states做加权平均。唯一不同的是,这里还直接加上了输入的embedding。

img

作者说他们发现直接加上这个词向量的embedding还是很有用的。

模型架构图

img

Normalization策略

为了保持模型训练的稳定性,我们希望模型中间的向量的variance不要太大。

  • 输出+residual之后乘以\sqrt{5},这样可以让这些vector每个维度的variance减半。其实很多时候这些确保模型稳定度的细节挺关键的,大家可能也知道transformer中也增加了一些减少variance的方法。如果不是调模型专家就会忽视这些细节,然后模型就训练不好了。

img

还有更多的模型参数初始化细节,感兴趣的同学可以自己去认真阅读paper。

实验结果

img

在翻译任务上超越了GNMT (Google Neural Machine Translation),其实这个比较能说明问题,因为当时的GNMT是State of the Art。

img

然后他们还展示了ConvS2S的速度比GNMT更快。

总结来说,ConvS2S其实是一篇很有价值的文章,Decoder的设计比较精致, 不知道这篇文章对后来的Transformer产生了多少的影响,当然他们可以说是同时期的作品。

代码

主要代码在Fairseq的下面这个文件中

https://github.com/ZeweiChu/fairseq/blob/master/fairseq/models/fconv.py

Fairseq是一个值得关注一波的工具包,由Facebook开发,主要开发者有

关于文本分类的更多参考资料

基于深度学习的文本分类

https://zhuanlan.zhihu.com/p/34212945

文章目录
  1. 1. 如何读论文?
  • NLP中的 ConvNet 精选论文
    1. Yoon Kim Convolutional Neural Networks for Sentence Classification
      1. 1. 模型架构图
      2. 2. embedding层
      3. 3. convolution层
      4. 4. Max over time pooling
      5. 5. 输出层
      6. 6. 模型的效果
      7. 7. 我们的代码实现
    2. Zhang et. al., Character-level Convolutional Networks for Text Classification
      1. 1. 关键Modules
      2. 2. 模型架构图
      1. 1. 模型代码
    3. Gehring et. al., Convolutional Sequence to Sequence Learning
      1. 1. Positional Embedddings
      2. 2. Convolutional Block Structure
      3. 3. Multi-step Attention
      4. 4. 模型架构图
      5. 5. Normalization策略
      6. 6. 实验结果
      7. 7. 代码
  • 关于文本分类的更多参考资料
  • |