精华内容
下载资源
问答
  • DGCNN

    千次阅读 2019-09-09 15:29:20
    早在年初的《Attention is All You Need》的介绍文章中就已经承诺过会分享...本模型——我称之为DGCNN——是基于CNN和简单的Attention的模型,由于没有用到RNN结构,因此速度相当快,而且是专门为这种WebQA式的任务...

    另一篇关于DGCNN的延伸

    早在年初的《Attention is All You Need》的介绍文章中就已经承诺过会分享CNN在NLP中的使用心得,然而一直不得其便。这几天终于下定决心来整理一下相关的内容了。

    背景 #
    事不宜迟,先来介绍一下模型的基本情况。

    模型特点 #
    本模型——我称之为DGCNN——是基于CNN和简单的Attention的模型,由于没有用到RNN结构,因此速度相当快,而且是专门为这种WebQA式的任务定制的,因此也相当轻量级。SQUAD排行榜前面的模型,如AoA、R-Net等,都用到了RNN,并且还伴有比较复杂的注意力交互机制,而这些东西在DGCNN中基本都没有出现。

    这是一个在GTX1060上都可以几个小时训练完成的模型!

    截止到2018.04.14的排行榜
    截止到2018.04.14的排行榜

    DGCNN,全名为Dilate Gated Convolutional Neural Network,即“膨胀门卷积神经网络”,顾名思义,融合了两个比较新的卷积用法:膨胀卷积、门卷积,并增加了一些人工特征和trick,最终使得模型在轻、快的基础上达到最佳的效果。在本文撰写之时,本文要介绍的模型还位于榜首,得分(得分是准确率与F1的平均)为0.7583,而且是到目前为止唯一一个一直没有跌出前三名、并且获得周冠军次数最多的模型。
    比赛情况 #
    其实这个模型是我代表“广州火焰科技有限公司”来参加CIPS-SOGOU问答比赛的产物。这个比赛在去年十月份开始,然而有点虎头蛇尾,到现在依然还是不上不下的(没有结束的迹象,也没有继续新任务的迹象)。

    其实刚开始的两三个月,竞争还是蛮激烈的,很多公司和大学都提交了模型,排行榜一直不断刷新。所以我觉得SOGOU这样虎头蛇尾未免有点对不起大家当初提交的热情。最关键是,它究竟是有什么计划、有什么变动,包括比赛的结束时间,一直都没公开发出什么通知,就一直把选手晾在那里。我后来打听到,截止时间是今年的CIPS举办前…一个比赛持续举办一年??

    赛题简述 #
    到目前为止,SOGOU的这个比赛只举办了事实类的部分,而事实类的部分基本上是跟百度之前开放的WebQA语料集一样的,即“一个问题 + 多段材料”的格式,希望从多段材料中共同决策出问题的精准答案(一般是一个实体片段)。

    问题:社保缴纳多少年可以领养老金
    答案:15年
    材料1:最好不辞,交够15年到退休就可以领养老金了如果有特殊原因非要辞,可以个人接着交。
    材料2:你好!养老保险缴纳满15年,达到退休年龄可以领取养老金。
    材料3:在生活中,每个人都会缴纳社保,多少年可以领取退休... 社保要交多少年才能领养老金 呢,在上文中为大家介绍了一下。
    相比WebQA,搜狗提供的训练集噪声大得多,这也使得预测难度加大。此外,我认为这种WebQA式的任务是偏向于检索匹配以及初步的语义理解技术,跟国外类似的任务SQUAD(一段长材料 + 多个问题)是有比较大的区别的,SQUAD的语料中,部分问题还涉及到了比较复杂的推理,因此SQUAD排行榜前面的模型都比较复杂、庞大。

    模型 #
    现在我们正式进入模型的介绍中~

    架构总览 #
    先来看个模型总图
    DGCNN模型总图
    DGCNN模型总图

    从示意图可以看到,作为一个“阅读理解”、“问答系统”模型,图中的模型几乎是简单到不能再简单了。

    模型的整体架构源于WebQA的参考论文《Dataset and Neural Recurrent Sequence Labeling Model for Open-Domain Factoid Question》。这篇论文有几个特点:

    1、直接将问题用LSTM编码后得到“问题编码”,然后拼接到材料的每一个词向量中;

    2、人工提取了2个共现特征;

    3、将最后的预测转化为了一个序列标注任务,用CRF解决。

    而DGCNN基本上就是沿着这个思路设计的。我们的不同点在于

    1、把原模型中所有的LSTM部分都替换为CNN;

    2、提取了更丰富的共现特征(8个);

    3、去掉CRF,改为“0/1标注”来分开识别答案的开始和终止位置,这可以看成一种“半指针半标注”的结构。

    卷积结构 #
    这部分我们来对图中的Conv1D Block进行解析。

    门机制 #
    模型中采用的卷积结构,来自FaceBook的《Convolutional Sequence to Sequence Learning》,而在《分享一个slide:花式自然语言处理》一文中也提到过。假设我们要处理的向量序列是\boldsymbolX=[\boldsymbolx1,\boldsymbolx2,…,\boldsymbolxn],那么我们可以给普通的一维卷积加个门:
    \boldsymbolY=Conv1D1(\boldsymbolX)⊗σ(Conv1D2(\boldsymbolX))(1)

    注意这里的两个Conv1D形式一样(比如卷积核数、窗口大小都一样),但权值是不共享的,也就是说参数翻倍了,其中一个用sigmoid函数激活,另外一个不加激活函数,然后将它们逐位相乘。因为sigmoid函数的值域是(0,1),所以直觉上来看,就是给Conv1D的每个输出都加了一个“阀门”来控制流量。这就是GCNN的结构了,或者可以将这种结构看成一个激活函数,称为GLU(Gated Linear Unit)。

    残差与门卷积的结合,达到多通道传输的效果
    残差与门卷积的结合,达到多通道传输的效果

    除了有直观的意义外,用GCNN的一个好处是它几乎不用担心梯度消失问题,因为有一个卷积是不加任意激活函数的,所以对这部分求导是个常数(乘以门),可以说梯度消失的概率非常小。如果输入和输出的维度大小一致,那么我们就把输入也加到里边,即使用残差结构:
    \boldsymbolY=\boldsymbolX+Conv1D1(\boldsymbolX)⊗σ(Conv1D2(\boldsymbolX))(2)

    值得一提的是,我们使用残差结构,并不只是为了解决梯度消失,而是使得信息能够在多通道传输。我们可以将上式改写为更形象的等价形式,以便我们更清晰看到信息是如何流动的:
    \boldsymbolY=\boldsymbolσ=\boldsymbolX⊗(1−\boldsymbolσ)+Conv1D1(\boldsymbolX)⊗\boldsymbolσσ(Conv1D2(\boldsymbolX))(3)

    从(3)式中我们能更清楚看到信息的流向:以1−σ的概率直接通过,以σ的概率经过变换后才通过。这个形式非常像递归神经网络中的GRU模型。

    补充推导:
    \boldsymbolY==\boldsymbolX⊗[1−σ(Conv1D2(\boldsymbolX))]+Conv1D1(\boldsymbolX)⊗σ(Conv1D2(\boldsymbolX))\boldsymbolX+(Conv1D1(\boldsymbolX)−\boldsymbolX)⊗σ(Conv1D2(\boldsymbolX))
    由于Conv1D1并没有加激活函数,所以它只是一个线性变换,从而Conv1D1(\boldsymbolX)−\boldsymbolX可以结合在一起,等效于单一一个Conv1D1。说白了,在训练过程中,Conv1D1(\boldsymbolX)−\boldsymbolX能做到的事情,Conv1D1(\boldsymbolX)也能做到。从而(2)和(3)两者是等价的。

    膨胀卷积 #
    接下来,为了使得CNN模型能够捕捉更远的的距离,并且又不至于增加模型参数,我们使用了膨胀卷积。

    普通卷积跟膨胀卷积的对比,可以用一张图来演示
    普通卷积vs膨胀卷积
    普通卷积vs膨胀卷积
    在这里插入图片描述
    同样是三层的卷积神经网络(第一层是输入层),窗口大小为3。普通卷积在第三层时,每个节点只能捕捉到前后3个输入,而跟其他输入完全不沾边。

    而膨胀卷积在第三层时则能够捕捉到前后7个输入,但参数量和速度都没有变化。这是因为在第二层卷积时,膨胀卷积跳过与中心直接相邻的输入,直接捕捉中心和次相邻的输入(膨胀率为2),也可以看成是一个“窗口大小为5的、但被挖空了两个格的卷积”,所以膨胀卷积也叫空洞卷积(Atrous Convolution)。在第三层卷积时,则连续跳过了三个输入(膨胀率为4),也可以看成一个“窗口大小为9、但被挖空了6个格的卷积”。而如果在相关的输入输出连一条线,就会发现第三层的任意一个节点,跟前后7个原始输入都有联系。

    按照“尽量不重不漏”的原则,膨胀卷积的膨胀率一般是按照1、2、4、8、…这样的几何级数增长。当然,这里指明了是“尽量”,因为还是有些重复的。这个比例参考了Google的wavenet模型。

    Block #
    现在就可以解释模型图中的各个Conv1D Block了,如果输入跟输出维度大小一致时,那么就是膨胀卷积版的(3)式;如果输出跟输出维度大小不一致时,就是简单的(1)式,窗口大小和膨胀率在图上都已经注明。

    注意力 #
    从模型示意图可以看到,本文的DGCNN模型中,Attention主要用于取代简单的Pooling来完成对序列信息的整合,包括将问题的向量序列编码为一个总的问题向量,将材料的序列编码为一个总的材料向量。这里使用的Attention稍微不同于《Attention is All You Need》中的Attention,本文这种Attention可以认为是一种“加性注意力”,形式为
    \boldsymbolxλi=Ecndoer(\boldsymbolx1,\boldsymbolx2,…,\boldsymbolxn)=∑i=1nλi\boldsymbolxi=softmaxi(\boldsymbolα⊤Act(\boldsymbolW\boldsymbolxi))(4)

    这里的\boldsymbolα,\boldsymbolW都为可训练参数。而Act为激活函数,一般会取tanh,也可以考虑swish函数。注意用swish时,最好把偏置项也加上去,变为
    λi=softmaxi(\boldsymbolα⊤Act(\boldsymbolW\boldsymbolxi+\boldsymbolb)+β)(5)

    这种Attention的方案参考自R-Net模型。(注:不一定是R-Net首创,只是我是从R-Net中学来的。)

    位置向量 #
    为了增强CNN的位置感,我们还补充了位置向量,拼接到材料的每个词向量中。位置向量的构造方法直接沿用《Attention is All You Need》中的方案:
    ⎧⎩⎨⎪⎪PE2i§=sin(p/100002i/dpos)PE2i+1§=cos(p/100002i/dpos)(6)
    输出设计 #
    这部分是我们整个模型中颇具特色的地方。

    思路分析 #
    到现在,模型的整体结构应该已经呈现出来了。首先我们通过卷积和注意力把问题编码为一个固定的向量,这个向量拼接到材料的每个词向量中,并且还拼接了位置向量、人工特征。这时候我们得到了一个混合了问题、材料信息的特征序列,直接对这个序列进行处理即可,所以后面接了几层卷积进行编码处理,然后直接对序列进行标注,而不需要再对问题进行交互了。

    在SQUAD的评测中,材料是肯定有答案的,并且答案所在的位置也做好了标注,所以SQUAD的模型一般是对整个序列做两次softmax,来预测答案的开始位置和终止位置,我们一般称之为“指针网络”。然而我们这里的WebQA式问答,材料中不一定有答案,所以我们不用softmax,而是对整个序列都用sigmoid,这样既允许了材料中没有答案,也允许答案在材料中多次出现。

    双标注输出 #
    既然用到标注,那么理论上最简单的方案是输出一个0/1序列:直接标注出材料中的每个词“是(1)”或“否(0)”答案。然而,这样的效果并不好,因为一个答案可能由连续多个不同的词组成,要让模型将这些不同的词都有同样的标注结果,有可能“强模型所难”。于是我们还是用两次标注的方式,来分别标注答案的开始位置和终止位置。
    pstarti=σ(\boldsymbolα⊤1Act(\boldsymbolW1\boldsymbolxi+\boldsymbolb1)+β1)pendi=σ(\boldsymbolα⊤2Act(\boldsymbolW2\boldsymbolxi+\boldsymbolb2)+β2)(7)

    这样一来,模型的输出设计跟指针方式和纯序列标注都不一样,或者说是两者的简化及融合。

    大局观 #
    最后,为了增加模型的“大局观”,我们将材料的序列编码为一个整体的向量,然后接一个全连接层来得到一个全局的打分,并把这个打分的结果乘到前面的标注中,即变成
    \boldsymbolo=pglobal=pstarti=pendi=Ecndoer(\boldsymbolx1,\boldsymbolx2,…,\boldsymbolxn)σ(\boldsymbolW\boldsymbolo+\boldsymbolb)pglobal⋅σ(\boldsymbolα⊤1Act(\boldsymbolW1\boldsymbolxi+\boldsymbolb1)+β1)pglobal⋅σ(\boldsymbolα⊤2Act(\boldsymbolW2\boldsymbolxi+\boldsymbolb2)+β2)(8)

    这个全局打分对模型的收敛和效果具有重要的意义,它的作用是更好地判断材料中是否存在答案,一旦材料中没有答案,直接让pglobal=0即可,不用“煞费苦心”让每个词的标注都为0。

    人工特征 #
    文章的前面部分,我们已经多次提到过人工特征,那么这些人工特征的作用有多大呢?简单目测的话,这几个人工特征对于模型效果的提升可能超过2%!可见设计好的特征对模型效果的特征、模型复杂度的降低,都有着重要的作用。

    人工特征是针对材料中的词来设计的,列举如下(Q即question,代表问题;E即evidence,代表材料)。

    Q-E全匹配 #
    也就是判断材料中的词是否在问题出现过,出现过则为1,没出现过则为0。这个特征的思路是直接告诉模型问题中的词在材料中什么地方出现了,那些地方附近就很有可能有答案。这跟我们人类做阅读理解的思路是吻合的。

    E-E共现 #
    这个特征是计算某个材料中的词在其他材料中的出现比例。比如有10段材料,第一段材料有一个词w,在其余九段材料中,有4段都包含了这个词,那么第一段材料的词w就获得一个人工特征4/10。

    这个特征的思路是一个词出现在的材料越多,这个词越有可能是答案。

    Q-E软匹配 #
    以问题大小为窗口来对材料的每个窗口算Jaccard相似度、相对编辑距离。

    比如问题“白云山 的 海拔 是 多少 ?”,材料“白云山 坐落 在 广州 , 主峰 海拔 3 8 2 米”。问题有6个词,那么窗口大小就为6,将材料拆分为:

    X X X 白云山 坐落 在
    X X 白云山 坐落 在 广州
    X 白云山 坐落 在 广州 ,
    白云山 坐落 在 广州 , 主峰
    坐落 在 广州 , 主峰 海拔
    在 广州 , 主峰 海拔 3
    广州 , 主峰 海拔 3 8
    , 主峰 海拔 3 8 2
    主峰 海拔 3 8 2 米
    海拔 3 8 2 米 X
    3 8 2 米 X X
    其中X代表占位符。有了这个拆分,我就可以算每一块与问题的Jaccard相似度了,将相似度的结果作为当前词(也就是红色词)的一个特征,上述例子算得[0.13, 0.11, 0.1, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.1, 0]。

    同样地,我们还可以算每一块与问题的编辑距离,然后除以窗口大小,就得到一个0~1之间的数,我称之为“相对编辑距离”,上述例子算得[0.83, 0.83, 0.83, 0.83, 1, 1, 1, 0.83, 1, 1, 1]。

    Jaccard相似度是无序的,而编辑距离是有序的,因此这两个做法相对于从有序和无序两个角度来衡量问题和材料之间的相似度。这两个特征的思路跟第一个特征一样,都是告诉模型材料中哪部分会跟问题相似,那部分的附近就有可能有答案。

    这两个特征的主要思路来自Keras群中的Yin神,感谢~

    字符特征 #
    SQUAD排名靠前的模型中,基本都是以词向量和字符向量共同输入到模型中的,而为了提升效果,我们似乎也要把字向量和词向量同时输入。但我们并不想将模型做得太庞大,于是我们在人工特征这里,加入了字符级特征。

    其实思路也很简单,前面介绍的4个特征,都是以词为基本单位来计算的,事实上也可以以字为基本单位算一次,然后把每个词内的字的结果平均一下,作为词的特征就行了。比如在“Q-E全匹配”特征中,假设问题只有“演”这个词,而材料则有“合演”这个词,如果按照词来看,“合演”这个词没有在问题出现过,所以共现特征为0,而如果考虑字的话,“合演”就被拆开为两个字“合”和“演”,按照同样的方式算共现特征,“合”得到0、“演”得到1,将两者平均一下,得到0.5,作为“合演”这个词的字符级“Q-E全匹配”特征。

    其他三个特征也同样处理,这样我们就得到了另外4个特征,一定得到8个人工特征。

    实现 #
    现在,模型的各个部分基本上都解释清楚了。其实模型整体简单明了,讲起来也容易,应该会有种“大道至简”的感觉。下面介绍一些实现要点。

    模型设置 #
    下面是实现模型的一些基本要点。

    中文分词 #
    从前面的介绍中可以看到,本模型是基于词来实现的,并且基于前面说的人工特征简单引入了字符级别的信息。不过,为了使得模型整体上更加灵活,能够应答更多的问题,本文仅仅对输入进行了一个基本的分词,使得分词的颗粒度尽量低一些。

    具体实现为:自己写了一个基于一元模型的分词模块,自行准备了一个约50万词的词典,而所有的英文、数字都被拆开为单个的字母和数字,比如apple就变成了五个“词”:a p p l e,382就变成了三个“词”:3 8 2。

    由于没有新词发现功能,这样一来,整个词表的词就不会超过50万。事实上,我们最后得到的模型,模型总词数只有30万左右。

    当然,读者可以使用结巴分词,关闭结巴分词的新词发现,并且手动对数字和英文进行拆分,效果是一样的。

    部分参数 #
    1、词向量的维度为128维,由比赛方提供的训练语料、WebQA语料、50万百度百科条目、100万百科知道问题用Word2Vec预训练而成,其中Word2Vec的模型为Skip Gram,窗口为5,负采样数为8,迭代次数为8,训练时间约为12小时;

    2、填充词向量取全零向量,词向量在DGCNN模型的训练过程中保持固定;

    3、所有Conv1D的输出维度皆为128维,位置向量也是128维;

    4、序列的最大长度取为100,如果一个batch中某些样本涉及到padding,那么对padding部分要做好mask;

    5、由于最后变成一个二分类的标注形式,并且考虑到正负类不均衡,使用二分类的focal loss作为损失函数;

    6、用adam优化器进行训练,先用10−3的学习率训练到最优(大概6个epoch内),然后加载最优模型,改用10−4学习率训练到最优(3个epoch内)。

    正则项 #
    在比赛后期,我们发现一种类似DropPath的正则化能轻微提升效果,不过提升幅度我也不大确定,总之当时是带来了一定的提升。
    在这里插入图片描述

    对GCNN的门进行扰动,作为模型的一个正则项
    对GCNN的门进行扰动,作为模型的一个正则项

    这个正则化手段建立在(3)式的基础上,我们的思路是在训练阶段对“门”进行扰动:
    \boldsymbolY=\boldsymbolσ=\boldsymbolX⊗(1−\boldsymbolσ)+Conv1D1(\boldsymbolX)⊗\boldsymbolσσ(Conv1D2(\boldsymbolX)⊗(1+\boldsymbolε))(9)

    其中\boldsymbolε是[−0.1,0.1]内的均匀随机数张量。这样一来,我们给GCNN的“门”加入了“乘性噪声”来使得具有更好的鲁棒性(对抗参数的小扰动)。

    这个正则化方案的提出,多多少少受到了《FractalNet: Ultra-Deep Neural Networks without Residuals》和《Shake-Shake regularization》里边的正则化技术启发。

    数据准备 #
    数据预处理 #
    由于SOGOU这个比赛允许使用外部数据,因此我们及大多数参赛队伍都使用了WebQA数据集补充训练。考虑到WebQA数据集相对规整一些,而SOGOU提供的语料噪声相对大一些,所以我们将SOGOU和WebQA的语料集以2:1的比例混合。

    不管是WebQA还是SOGOU,所提供的语料都是“一个问题 + 多段材料 + 一个答案”的形式,并没有特别指明答案出现在哪段材料的哪个位置。因此,我们只好把材料中所有能跟答案全匹配的子串都视为答案所在处。对于某些样本,这样操作有点不合理,但是在不加额外的人工标注的情况下,这也是我们能做到的最优的思路了。

    训练语料还有一个问题答案的同义词问题,比如问“憨豆的扮演者”,标准答案是“罗温艾金森”,但是材料中不仅有“罗温艾金森”,还有“罗温·艾金森”、“罗温.艾金森”、“洛温·艾金森”等。SOGOU比赛比较好的一点是它提供了一个相对客观的线下评测脚本,这个评测脚本考虑了同义词的变化,因此我们可以从这个评测脚本中找到答案的同义词,从而可以把同义答案都标注出来。

    还有一些诸如全角字符转半角的操作,相信大家看了数据集自然也就想到了,因此不再赘述。

    数据打匀 #
    SOGOU最后一共提供了3万个问题的标注语料,并且给我们预先划分好了训练集(2.5万)和验证集(0.5万)。但是如果直接用它的划分来训练,那验证集的结构却跟线上提交的结果出入比较大。

    所以我们把所有的标注语料混合然后重新打乱,并且重新划分训练集(2万)和验证集(1万),这样在验证集上的得分约为0.76,跟线上提交的结果接近。

    数据扩增 #
    在模型的训练过程中,使用了可以称得上是数据扩增的三个操作。

    1、直接随机地将问题和材料的部分词id置零:问题和材料都是以词id序列的方式输入,0是填充符(相当于),随机置零就是随机将词用替换,减弱对部分词的依赖;

    2、将同一段材料通过重复拼接、随机裁剪的方式,来得到新的材料(答案的数目、位置也随之变化);

    3、对于答案出现多次的材料,随机去掉某些答案的标注。比如答案“广东”可能在某段材料中出现两次,那么做答案标注的时候,可能只标注第一个、或只标注第二个、或都标注。

    印象中,第1个数据扩增手段影响比较大的,能有效提升模型的稳定性和精度,至于第2、3个方案相对微弱一些。第1个数据扩增手段,跟直接对词向量序列进行dropout的区别是:dropout除了随机置零外,还会进行尺度缩放,而这里就是不想要它的尺度缩放,解释性要好些。

    解码策略 #
    很多参赛选手可能会忽略的一个细节是:答案的解码方式可能有很大的优化空间,而优化解码带来的提升,可能远比反复对模型调参带来的提升要大!

    打分方式 #
    何为答案解码?不管是用softmax形式的指针,还是用本文的sigmoid形式的“半指针-半标注”,最后模型输出的是两列浮点数,分别代表了答案起始位置和终止位置的打分。但问题是,用什么指标确定答案区间呢?一般的做法是:确定答案的最大长度max_words(我取了10,但汉字算一个,字母和数字只算半个),然后遍历材料所有长度不超过max_words的区间,计算它们起始位置和终止位置的打分的和或积,然后取最大值。那么问题来了,“和”好还是“积”好呢?又或者是“积的平方根”?

    开始我按直觉来,感觉“积的平方根”是最合理的,后来测试了一下直接改成“积”,发现效果提升很明显(1%)。于是我就反复斟酌了这个解码决策过程,发现里面还其实有很多坑,这也是一种重要的超参,不能单纯按照直觉来。

    投票方式 #
    比如同一段材料同一个片段出现多次时,是要把这些片段的打分求和、求平均还是只取最大的?每段材料都得到了自己的答案,又怎么把这么多段材料的答案投票出最终的答案来?

    比如有5段材料,每段材料得出的答案和分数依次是(A, 0.7)、(B, 0.2)、(B, 0.2)、(B, 0.2)、(B, 0.2),那么我们最终应该输出A还是B呢?有人说“三个臭皮匠,顶一个诸葛亮”,自然这里的臭皮匠指的是指低分答案B,诸葛亮是指高分答案A,4个B的分数加起来为0.8 > 0.7,这样看起来应该输出B?

    我觉得不大对。在我们的生活中,专家并不等于平民的简单叠加,人多的确力量大,但很多时候1+1是小于2的。就好比上面的答案分布,我们其实更倾向于选择A答案,因为它接近满分1,而且相对其它答案更加“出类拔萃”。

    所以,我们的投票方式必须体现两点:1、人多力量大;2、1+1<2。所以求和以及求平均都不行,最简单的方案应该是“平方和”

    1、对于同一段材料,如果一个片段出现了多次,那么只取最大的那个分,不平均也不求和,这是因为“同一段材料”相当于“同一个人”,同一个人就没必要叠加太多了;

    2、经过这样处理,每段材料都“选举”出自己的答案了,每段材料就相当于一个“臭皮匠”或“诸葛亮”,每个答案都有自己的分数,就是代表这些“臭皮匠”或“诸葛亮”的决策,将相同答案的打分求“平方平均”作为该答案的最后打分,然后在不同答案中选最大的那个:
    sa=∑i=1ns2a,i

    因为“平方”会把高分的样本权重放大。

    3、相比步骤2,我在比赛中使用了一个略微不同的打分公式:
    sa=∑i=1ns2a,i1+∑i=1nsa,i

    这个公式同样是平方求和的思想,只是再求了一次平均,并且分母“+1”。“平方”这个操作是对专家的加权,“+1”则是对小样本的惩罚,这个公式比直接平方求和更加平缓。

    注意,不仅仅是我们的模型,我在跟另外一参赛选手交流的时候,提示了他这个解码方式,他用同样的思路经过调试后,也得到了比较大的提升~

    模型融合 #
    经过上述步骤,模型在SOGOU的在线测试集上达到0.74~0.75的分数应该是没有问题的。但要达到最优的0.7583,就要上模型融合了。

    模型融合分单模型融合和多模型融合。单模型融合是指同一个模型架构,用不同的方式训练多次,然后将结果平均;多模型融合则是给每个模型都做一次单模型融合,然后将多个单模型融合的结果再次融合。简单起见,我们只做了单模型融合。

    单模型建立在交叉验证的基础上。前面我们提到,将标注语料重新打乱后,重新划分训练集和验证集,交叉验证的话更彻底一些,它把标注语料重新打乱后,分为k份,每份都拿来做一次验证集(每次都要重零开始训练模型)

    模型的k折交叉验证
    模型的k折交叉验证

    这样一来,我们就得到了同一个模型的k个不同训练结果,然后将这些结果平均一下,就是模型融合了:
    在这里插入图片描述
    PS:后来发现,本文的模型其实跟
    《Fast Reading Comprehension with ConvNets》

    《QANET: COMBINING LOCAL CONVOLUTION WITH
    GLOBAL SELF-ATTENTION FOR READING COMPREHENSION》
    这两篇论文“撞车”了,但笔者当初做比赛时,确实从未参考过这两篇论文。当时是从WebQA的论文出发,打算复现WebQA的模型,然后觉得好奇就想试试CNN模型,然后就一发不可收了。

    展开全文
  • DGCNN 关于 DGCNN(深图卷积神经网络)的PyTorch实现。 检查更多信息。 要求:python 2.7或python 3.6; 火炬> = 0.4.0 安装 此实现基于戴汉俊的structure2vec图后端。 在“ lib /”目录下,键入 make -j4 编译必要...
  • DGCNN Semantic Segmentation

    2020-12-08 18:43:32
    <div><p>Will you implement the DGCNN semantic segmentation model? Currently, it seems that the classification model is implemented.</p><p>该提问来源于开源项目:NVIDIAGameWorks/kaolin</p></div>
  • DGCNN.pytorch 此仓库是用于点云学习的动态图CNN的PyTorch实现(DGCNN) ( )。我们的代码框架是从借用的。 请注意,DGCNN论文中用于分类的网络结构(图3)与该论文第4.1节中的相应描述不一致。 DGCNN的作者采用第4...
  • DGCNN-master.zip

    2019-08-20 16:41:52
    A powerful deep neural network toolbox for graph classification, named Deep-Graph-CNN (DGCNN). DGCNN features a propagation-based graph convolution layer to extract vertex features, as well as a novel...
  • 模板-DGCNN

    2020-09-10 16:47:00
    DGCNN指的是膨胀卷积门,体现了信息的选择性多通道传输。 具体使用可以参考苏剑林的博客:基于DGCNN和概率图的轻量级信息抽取模型 from keras.layers import Conv1D def func_DGCNN(seq, mask, dilation_...

    DGCNN指的是膨胀卷积门,体现了信息的选择性多通道传输。

    Y=X\otimes (1-\sigma)+Conv1D_1(X)\otimes\sigma

    \sigma=\sigma(Conv1D_2(X))

    具体使用可以参考苏剑林的博客:基于DGCNN和概率图的轻量级信息抽取模型

    from keras.layers import Conv1D, Lambda
    import keras.backend as K
    
    
    def func_DGCNN(sequence, mask, dilation_rate=1):
        dim = K.int_shape(sequence)[-1]  # 输入序列最后一个维度
        h = Conv1D(dim * 2, 3, padding='same', dilation_rate=dilation_rate)(sequence)  # 后面对半切片,等价于两次卷积
    
        def _gate(seq):
            dropout_rate = 0.1
            s, h = seq
            g, h = h[:, :, : dim], h[:, :, dim:]  # 对半分
            g = K.in_train_phase(K.dropout(g, dropout_rate), g)  # 只有在训练阶段才会进行dropout
            g = K.sigmoid(g)
            return g * s + (1 - g) * h
    
        sequence = Lambda(_gate)([sequence, h])
        sequence = Lambda(lambda x: x[0] * x[1])([sequence, mask])
        return sequence

     

    展开全文
  • DGCNN论文笔记

    2020-04-11 22:31:01
    论文地址:DGCNN 代码地址:https://github.com/muhanzhang/pytorch_DGCNN 简要概述 论文提出了图卷积的方法,此处的图(Graph),指的是包含节点与边的二维图,与一般的图像卷积不同,图卷积有节点数和边数不...

    An End-to-End Deep Learning Architecture for Graph Classifification 论文笔记

    简要概述

    论文提出了图卷积的方法,此处的图(Graph),指的是包含节点与边的二维图,与一般的图像卷积不同,图卷积有节点数和边数不固定,如何提取特征等难题,该论文构造图卷积神经网络DGCNN可用于图的回归和分类

    论文核心

    图卷积神经网络的结构如图:在这里插入图片描述
    输入是一张图

    • 过程1,Graph convolution layers:

      此阶段是提取图的特征,将输入从图结构转换成矩阵结构,毕竟神经网络要处理的依旧是矩阵。DGCNN通过以下算法提取图的特征。
      Z=f(D^1A^XW) Z=f(\hat{D}^{-1}\hat{A}XW)
      假设图G有n个节点,其中A^=A+I\hat{A}=A+IAA是图的邻接矩阵,加上单位矩阵相当于节点自身也有边相连,则ARnnA \in R^{n* n}XX是图的节点的信息,XRncX\in R^{n*c}cc为每个原子的特征纬度,WW为一个权重矩阵,需要学习,可以通过神经网络实现,WRcc1W\in R^{c*c_1}DD是标准化用的。这样一层得出来ZRnc1Z\in R^{n*c_1}

      解释A^X\hat{A}X可以理解为更新后的节点信息为原节点信息与其邻接节点信息的和

      当然这只是一层,继续有:
      Zi+1=f(D^1A^ZiW) Z_{i+1}=f(\hat{D}^{-1}\hat{A}Z_{i}W)
      最终将所有ZiZ_i拼接在一起则完成过程1,这就完成了图的特征的提取
      Z=[Z1,Z2,,Zh]s=i=1hch,ZRns Z=[Z_1,Z_2,\cdots,Z_h]\\ 记s=\sum_{i=1}^{h}c_h, Z\in R^{n*s}

    • 过程2,SortPooling:

      这个过程解决节点数不固定的问题。输入为ZRnsZ\in R^{n*s},此处n为图中节点个数不固定,最终该层输出为SRksS\in R^{k*s},k为固定。此处论文提出的解决方法是进行排序,代码中实际做的事情是对ZZ的最后一列进行简单的大小排序(这里的原理看不懂~),取前k个,若k>nk>n,则填充0.

    • 过程3,1-D convolution:

      SRksS\in R^{k*s}平铺成一维向量,然后进行一维的卷积,max_pooling池化再卷积

    • 过程4:,Dense layers:

      最后一层是全连接。

    展开全文
  • /Users/jishilun/Desktop/DGCNN_official/DGCNN_embedding.py", line 17, in from gnn_lib import GNNLIB File "/Users/jishilun/Desktop/DGCNN_official/lib/gnn_lib.py", line 87, in GNNLIB &#...
  • DGCNN论文理解

    2020-07-26 20:50:45
    DGCNN论文理解 一、EdgeConv概述 1.对输入点云构造基于每个点的knn局部邻域图G=(V,E),每条边表示为 其中h是一个具有一组可学习参数的非线性函数 2. 通过应用通道对称聚合操作来定义EdgeConv操作, 在第i个顶点的...

    DGCNN论文理解

    一、EdgeConv概述

    1.对输入点云构造基于每个点的knn局部邻域图G=(V,E),每条边表示为
    在这里插入图片描述
    其中h是一个具有一组可学习参数的非线性函数
    在这里插入图片描述
    2. 通过应用通道对称聚合操作来定义EdgeConv操作, 在第i个顶点的输出是
    在这里插入图片描述

    二、文中具体的EdgeConv

    1.对邻域边特征提取: 显式地将由补丁中心xi的坐标捕获的全局形状结构与xj-xi捕获的局部邻域信息结合起来,并且该操作可以作为共享的MLP
    在这里插入图片描述
    其中参数为
    在这里插入图片描述

    2.邻域特征聚合—max-pooling
    在这里插入图片描述

    展开全文
  • DGCNN理解理论篇

    2021-06-14 21:31:58
    DGCNN理解理论篇 参考了LDGCNN论文,分别从输入点集、任务描述、点云特性、局部图结构、图特征提取等角度给出DGCNN数学理论理解。 输入点集 输入数据可用集合来描述,即向量的集合,每一个向量代表着一个欧式空间点...
  • Alternatively, there could be an error in our implementation of DGCNN. I'll keep investigating but if anyone sees anything that looks incorrect, let me know. <p>P.</p><p>该提问来源于开源项目ÿ...
  • 点云dgcnn边特征理解

    2021-03-05 17:55:08
    关于点云dgcnn中边缘特征的学习和理解 本篇博文要讨论的是DGCNN中的边缘特征,作者在语义分割部分提供了边缘特征的实现过程,代码段如下: def get_edge_feature(point_cloud, nn_idx, k=20): """Construct edge ...
  • CVPR2018 DGCNN、RSNet

    2020-02-14 17:15:33
    文章目录CVPR2018 DGCNNEdge ConvolutionDynamic graph updatePropertiesArchitectureClassificationPart SegmentationIndoor Scene ...DGCNN和RSNet都是基于此前PointNet和PointNet++的工作提出的,与KCNet和Poi...
  • 【论文阅读】DGCNN

    2021-05-26 11:00:18
    动态图卷积神经网络(DGCNN) 一、简介 1、下图是运用所提出的神经网络进行点云分割过程 如上图所示: 底部表示图神经网络架构的原理 上部表示网络不通层所产生的特征空间的结构,可视化为红点到其他所有点的距离...
  • dgcnn最近邻knn理解

    2021-03-05 17:34:50
    关于点云dgcnn中knn的理解 前几篇博客介绍了原作者代码中pairwise_distance与 tf.nn.top_k的用法,本篇继续对knn进行学习。 pairwise_distance的返回值是一个形状为(B,N,N)的张量,也就是有B个batch,每个batch有N个...
  • 论文笔记:DGCNN(EdgeConv)

    万次阅读 多人点赞 2018-12-26 10:41:30
    DGCNN 1、四个问题 要解决什么问题? 使用深度学习处理3D点云。 设计一个可以直接使用点云作为输入的CNN架构,同时可以获取足够的局部信息,可适用于分类、分割等任务。 用了什么方法解决? 提出了一个新...
  • <div><p>This change was noted on the original implemented repo: <a href="98b744a">WangYueFt/dgcnn</a></p>该提问来源于开源项目:NVIDIAGameWorks/kaolin</p></div>
  • 以下代码为苏神参加百度信息抽取比赛提出的DGCNN模型代码,其源码基本是没有注释的,所以本文对大部分代码做了注释,可能有不对的地方,可以指出。另一个就是对keras3.x版本下Attention模块的计算做了修改。 2.代码...
  • 点云DGCNN中对于代码中pairwise_distance的分析与理解 一点一点读,相信我,我能讲清楚。 这个是本篇文章所要讨论的代码段 def pairwise_distance(point_cloud): """Compute pairwise distance of a point cloud. ...
  • <div><p>While trying to run ./run_DGCNN.sh I get the same error each time I run for different datasets: <code>TypeError: new(): data must be a sequence (got dict_values)</code></p> <pre><code> >>...
  • PointNet与DGCNN分类网络网络参数量计算话不多说,直接上表 话不多说,直接上表 PointNet的计算步骤类似。 肯定存在各种问题,希望大佬们帮忙改正各种问题。自学实在太惨了。 由于能力不足,存在以下问题: 1.只会...
  • DGCNN 1. 背景介绍 1.1 点云 点云(Point Cloud),顾名思义是很多2维或3维点的集合。 因为传感器获取的数据往往是点云形式,而将点云还原成图形再进行处理的方法消耗过大,所以直接利用点云进行操作的一类技术...
  • 先去github下载好ldgcnn和DGCNN代码 复制部分 首先在data文件夹新建:extracted_feature文件夹,其中包含两个txt文本,分别为:test_files.txt,train_files.txt,内容分别是:data/extracted_feature/test_global_...
  • DGCNN,全名为Dilate Gated Convolutional Neural Network,即“膨胀门卷积神经网络”,顾名思义,融合了两个比较新的卷积用法:膨胀卷积、门卷积,并增加了一些人工特征和trick,最终使得模型在轻、快的基础上达到...
  • 文章目录1 背景介绍图核方法DGCNN和WL和PK的关系2 Deep Graph Convolutional Neural Network (DGCNN) 深度图卷积神经网络图卷积层与Weisfeiler-Lehman subtree kernel的联系和propagation kernel的联系2.2 ...
  • DGCNN 学习笔记

    2021-02-07 20:48:52
    使用EdgeConv搭建的DGCNN网络,在多个基准数据集上取得了state-of-the-art的效果。 1.3 EdgeConv的优缺点 包含了局部领域信息; 通过堆叠EdgeConv模块或循环使用,可以提取到全局形状信息; 在多层系统中,特征空间...
  • 基于CNN的阅读理解式问答模型:DGCNN

    千次阅读 2018-07-17 11:32:42
    早在年初的《Attention is All You Need》的介绍文章中就已经承诺过会分享CNN在NLP...本模型——我称之为DGCNN——是基于CNN和简单的Attention的模型,由于没有用到RNN结构,因此速度相当快,而且是专门为这种WebQA...
  • DGCNN 的动态图,是因为在特征空间取k近邻,每层计算的特征都不相同,因此相当于每一层的图都具有不同的顶点。 实验证明,特征空间中的距离可以更好的拉近相同语义点的距离。这样不仅学习到了点云的几何信息,而且...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 144
精华内容 57
关键字:

dgcnn