作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨NLP,神经网络
个人主页丨kexue.fm
早在年初的一文读懂「Attention is All You Need」| 附代码实现中就已经承诺过会分享 CNN 在 NLP 中的使用心得,然而一直不得其便。这几天终于下定决心来整理一下相关的内容了。
背景
事不宜迟,先来介绍一下模型的基本情况。
模型特点
本模型——我称之为 DGCNN——是基于 CNN 和简单的 Attention 的模型,由于没有用到 RNN 结构,因此速度相当快,而且是专门为这种 WebQA 式的任务定制的,因此也相当轻量级。
SQUAD 排行榜前面的模型,如 AoA、R-Net 等,都用到了 RNN,并且还伴有比较复杂的注意力交互机制,而这些东西在 DGCNN 中基本都没有出现。
这是一个在 GTX1060 上都可以几个小时训练完成的模型!
▲ 截止到2018.04.14的排行榜
DGCNN,全名为 Dilate Gated Convolutional Neural Network,即“膨胀门卷积神经网络”,顾名思义,融合了两个比较新的卷积用法:膨胀卷积、门卷积,并增加了一些人工特征和 trick,最终使得模型在轻、快的基础上达到最佳的效果。
在本文撰写之时,本文要介绍的模型还位于榜首,得分(得分是准确率与 F1 的平均)为 0.7583,而且是到目前为止唯一一个一直没有跌出前三名、并且获得周冠军次数最多的模型。
比赛情况
其实这个模型是我代表“广州火焰科技有限公司”参加 CIPS-SOGOU 问答比赛的产物。这个比赛在去年十月份开始,然而有点虎头蛇尾,到现在依然还是不上不下的(没有结束的迹象,也没有继续新任务的迹象)。
其实刚开始的两三个月,竞争还是蛮激烈的,很多公司和大学都提交了模型,排行榜一直不断刷新。所以我觉得 SOGOU 这样虎头蛇尾未免有点对不起大家当初提交的热情。
最关键是,它究竟是有什么计划、有什么变动,包括比赛的结束时间,一直都没公开发出什么通知,就一直把选手晾在那里。我后来打听到,截止时间是今年的 CIPS 举办前...一个比赛持续举办一年?
赛题简述
到目前为止,SOGOU 的这个比赛只举办了事实类的部分,而事实类的部分基本上是跟百度之前开放的 WebQA 语料集 [1] 一样的,即“一个问题 + 多段材料”的格式,希望从多段材料中共同决策出问题的精准答案(一般是一个实体片段)。
相比 WebQA,搜狗提供的训练集噪声大得多,这也使得预测难度加大。
此外,我认为这种 WebQA 式的任务是偏向于检索匹配以及初步的语义理解技术,跟国外类似的任务 SQUAD(一段长材料 + 多个问题)是有比较大的区别的,SQUAD 的语料中,部分问题还涉及到了比较复杂的推理,因此 SQUAD 排行榜前面的模型都比较复杂、庞大。
模型
现在我们正式进入模型的介绍中。
架构总览
先来看个模型总图:
▲ DGCNN模型总图
从示意图可以看到,作为一个“阅读理解”、“问答系统”模型,图中的模型几乎是简单到不能再简单了。
模型的整体架构源于 WebQA 的参考论文 Dataset and Neural Recurrent Sequence Labeling Model for Open-Domain Factoid Question [2]。这篇论文有几个特点:
1. 直接将问题用 LSTM 编码后得到“问题编码”,然后拼接到材料的每一个词向量中;
2. 人工提取了 2 个共现特征;
3. 将最后的预测转化为了一个序列标注任务,用 CRF 解决。
而 DGCNN 基本上就是沿着这个思路设计的,我们的不同点在于:
1. 把原模型中所有的 LSTM 部分都替换为 CNN;
2. 提取了更丰富的共现特征(8 个);
3. 去掉 CRF,改为“0/1 标注”来分开识别答案的开始和终止位置,这可以看成一种“半指针半标注”的结构。
卷积结构
这部分我们来对图中的 Conv1D Block 进行解析。
门机制
模型中采用的卷积结构,来自 FaceBook 的 Convolutional Sequence to Sequence Learning [3],而在《分享一个 slide:花式自然语言处理》[4] 一文中也提到过。
假设我们要处理的向量序列是 X=[x1,x2,…,xn],那么我们可以给普通的一维卷积加个门:
注意这里的两个 Conv1D 形式一样(比如卷积核数、窗口大小都一样),但权值是不共享的,也就是说参数翻倍了,其中一个用 sigmoid 函数激活,另外一个不加激活函数,然后将它们逐位相乘。
因为 sigmoid 函数的值域是 (0,1),所以直觉上来看,就是给 Conv1D 的每个输出都加了一个“阀门”来控制流量。这就是 GCNN 的结构了,或者可以将这种结构看成一个激活函数,称为 GLU(Gated Linear Unit)。
除了有直观的意义外,用 GCNN 的一个好处是它几乎不用担心梯度消失问题,因为有一个卷积是不加任意激活函数的,所以对这部分求导是个常数(乘以门),可以说梯度消失的概率非常小。如果输入和输出的维度大小一致,那么我们就把输入也加到里边,即使用残差结构:
▲ 残差与门卷积的结合,达到多通道传输的效果
值得一提的是,我们使用残差结构,并不只是为了解决梯度消失,而是使得信息能够在多通道传输。我们可以将上式改写为更形象的等价形式,以便我们更清晰看到信息是如何流动的:
从 (3) 式中我们能更清楚看到信息的流向:以 1−σ 的概率直接通过,以 σ 的概率经过变换后才通过。这个形式非常像递归神经网络中的 GRU 模型。
补充推导: