TextCNN

  1. CNN最先应用到图像领域,而在文本上,由于文本没有类似图像的通道(channel)一说,比如彩色图像通常未R,G,B三通道。文本中的channel作者定义为原始输入向量的形式,即词向量的形式,比如可以是随机打乱初始化然后随网络训练(random),预训练后固定(static),预训练后随网络一起训练(non-static)等。也可以是得到词向量的形式,比如word2vect或Glove。作者于是提出了Multichannel的词向量形式,即上图最左边的原始输入为两层,static和non-static,一个是随网络一起训练的,一个是微调的,这样做的原因是,pre-train的词向量有两点不足,一是oov问题,一是有些词在具体任务上需分别对待,比如pre-train的词向量中good和bad的词向量非常相近,但这在文本分类比如情感分析上是不可取的。基于以上两点,把static和non-static两种词向量训练形式结合可能会取得比较好的效果(虽然实验结果不好,但作者认为这种思想是对的,具体如何实验还需以后研究)。
  2. 卷积层分别采用了3,4,5的filter windows(相邻几个单词做为卷积核的宽度),卷积核的长度都为词向量的维数,每种filter windows采用了100个feature map(feature map可以看作卷积核,他是一种映射,也可以说是提取某种特征的映射,一个feature map共享一套权重)。每个卷积核对两个channel都进行卷积。
  3. 具体的实现步骤参见下图:
    TextCNN对于上图的解释:
    这里的原始输入channel数为1,即单通道,为7*5的词向量矩阵。共有2,3,4三种filter windows,每种filter windows的卷积核有2个,即每种filter windows的feature maps为2个。原文中所说channel数为2,每个filter windows有100个feature maps,而上图所示应该是做了简化。
    图中没有使用padding,因此宽度为4的卷积核在长度为7的句子上滑动得到4个特征值。然后进行max-pooling,最后把所有max-pooling后的scalar拼接形成长度为6的句子特征向量,进行softmax分类。
  • 原理
    为什么卷积在文本分类上可以取得比较好的效果呢?
    我们知道图像处理中卷积的作用是在整幅图像中计算各个局部区域与卷积核的相似度,一般前几层的卷积核是可以很方便地做可视化的,可视化的结果是前几层的卷积核是在原始输入图像中寻找一些简单的线条。NLP中的卷积核没法做可视化,那么是不是就不能理解他在做什么了呢,其实可以通过模型的结构来来推断他的作用。因为TextCNN中卷积过后直接就是全局max pooling,即提取最重要的特征,那么它只能是在卷积的过程中计算与某些关键词的相似度,然后通过max pooling层来得出模型关注那些关键词是否在整个输入文本中出现,以及最相似的关键词与卷积核的相似度最大有多大。我们假设中文输出为字向量,理想情况下一个卷积核代表一个关键词,如下图所示:
    TextCNN比如说一个2分类分析任务中,如果把整个模型当成一个黑箱,那么去检测他的输出结果,会发现这个模型对于输入文本中是否含有“喜欢”,“热爱”这样的词特别敏感,那么他是怎么做到的呢?整个模型中能够做到遍历整个句子去计算关键词相似度的只有卷积的部分,因为后面直接是对整个句子长度的max pooling。但是因为模型面对的是字向量,并不是字,所以他一个卷积核可能是只学了半个关键词词向量,这就可以看出把卷积设置成不同步长,每个步长还需要不同的卷积核的意义所在。其他的卷积核学了另外半个关键词词向量,最后在分类器的地方这些特征值被累加得到了最终的结果。

  • 不足
    TextCNN模型最大的问题就是这个全局的max pooling丢失了结构信息,因此很难去发现文本中的转折关系等复杂模式,TextCNN只能知道哪些关键词是否在文本中出现了,以及相似度强度分布,而不可能知道哪些关键词出现了几次以及出现这些关键词出现顺序。假想一下如果把这个中间结果给人来判断,人类也很难得到对于复杂文本的分类结果,所以机器显然也做不到。针对这个问题,可以尝试k-max pooling做一些优化,k-max pooling针对每个卷积核都不只保留最大的值,他保留前k个最大值,并且保留这些值出现的顺序,也即按照文本中的位置顺序来排列这k个最大值。在某些比较复杂的文本上相对于1-max pooling会有提升。
    卷积或池化操作会丢失词语间的位置信息。以致于序列标注任务比如词性标注或命名实体识别很难用这种网络来学习,一个解决方法是给输入加上位置编码,就像self-attention一样。

  • 其他

    • 不同的channel间可以共享也可以不共享权重?
  • 参考

  1. Convolutional Neural Networks for Sentence Classification
  2. 达观数据曾彦能:如何用深度学习做好长文本分类与法律文书智能化处理
  3. Understanding Convolutional Neural Networks for NLP
  4. [NLP] TextCNN模型原理和实现
  5. 一张图帮你弄懂text-cnn