“知物由学”是网易易盾打造的一个品牌栏目,词语出自汉·王充《论衡·实知》。人,能力有高下之分,学习才知道事物的道理,而后才有智慧,不去求问就不会知道。“知物由学”希望通过一篇篇技术干货、趋势解读、人物思考和沉淀给你带来收获的同时,也希望打开你的眼界,成就不一样的你。当然,如果你有不错的认知或分享,也欢迎在“网易易盾”公众号后台投稿。
导读:自然语言处理的ESIM模型目前已在多家公司的内容相关性搜索模型、人机对话模型上较为广泛的使用,业内不少人对ESIM模型也耳熟能详。实际上,ESIM模型只是本篇文章要介绍的HIM模型的阉割版,后者潜力很大,能应用在包括内容安全在内的多个领域。近日,网易易盾实验室的研究员撰写了此篇文章,对HIM模型进行简单解读。
大家对自然语言处理的ESIM模型可能已经耳熟能详,但是它其实是这里介绍的HIM模型的阉割版。
自然语言推理NLI(natrual language inferrence,NLI)一直是人工智能自然语言处理研究的一个热门方向。但人类语言的推理也一直是一个极具挑战的任务。举个例子,文本蕴含关系描述的是两个文本之间的推理关系,其中一个文本作为前提(premise),另一个文本作为假设(hypothesis),如果根据前提P能够推理得出假设H,那么就说P蕴含H,记做P→H。这跟一阶逻辑中的蕴含关系是类似的。
这里解释也许还有些抽象,在实际的应用中,前提句子可以是用户输入的query查询短语,假设句子可以是新闻库中一篇新闻的标题、正文、摘要,或者是网络音乐曲库库中一首歌曲的介绍、歌词。推理出来的关系,就是搜索查询与搜索结果对象的相关性。
**在内容安全检测应用中,前提句子亦可以是一条待检测的数据,假设句子就是举报违禁样本库中一条样本记录,推理出来的关系,就是待检测数据是否和违禁内容相关。
**
要完成自然语言的文本推理任务,最近stanford大学贡献了一个重要的数据集——SNLI。这帮助广大研究人员能够训练更复杂的模型。使用这个数据训练的序列推理模型能够得到比之前已有的各种最先进的模型更优秀的模型。这也预示着,很多已有的序列推理算法的潜力都还没有挖掘出来。
由于句法和语义联系紧密,在自然语言推理任务中,挖掘句法对我们十分的重要。因此在自然语言研究任务中,我们需要把大部分的精力投入到利用循环神经网对句法分析树信息进行编码。在神经网络中对局部推理和推理组合进行建模。
1、混合神经网络推理模型
在自然语言推理神经网络中,有三个组成部分:输入编码、局部推理和推理组合。图一展示的是这种结构的高层架构的三个重要组成部分。左边展示的是序列推理模型ESIM,右边展示是融合句法分析信息的树形LSTM。
图 1推理神经网络模型的组成
首先我们介绍输入编码的部分。
在输入编码的部分中,使用的是双向LSTM(BILSTM)作为自然语言推理的基本模块。BILSTM用来对输入的前提和假设进行以下的编码:
在基本的LSTM单元中,LSTM使用一组soft门限开关和记忆单元来控制信息的传递,这种结构能够有效地跟踪序列中长距离的信息和语法依赖关系。而且双向LSTM从句子序列的最左端和最右端进行了前向和后向的计算,两个方向计算所得的隐层向量在每个时刻点连接起来,在效果上比其他的递归记忆模块(比如GRU单元)来的好。
为了有效分析自然语言推理中句法结构,在推理中,我们使用了如图2所示的树形LSTM。通过树形LSTM,我们把前提和假设两个句子的句法分析树的信息编码起来。
图 2树形LSTM
根据以下(3)-(10)的计算,句法分析树中的每个节点使用如图2所示的tree-LSTM的记忆单元进行计算。每个节点中,输入向量
和这个节点的两个子节点的隐藏向量
,
作为输入信息进行计算,得到当前节点的隐藏向量
。一个节点的输入用来设置4个门限开关的阈值:输入门,输出门,两个遗忘门。而且记忆单元
的门阀阈值也由左遗忘门和右遗忘门的阈值计算得到。在当前的输入编码层中,输入
是叶子节点的词嵌入编码向量,而非叶子节点由于没有对应的具体的词语,我们使用一个特殊的向量
作为输入。
类似于未登录词所对用的词嵌入向量。
值得一提的是,这与下面我们要介绍的推理组合层有很大的不同。在推理组合层中,树形LSTM使用的输入信息是局部推理信息的编码,而且在树里面的所有节点上都是有具体对应的,也就是说在推理组合层中,不需要用未登录词向量的手段来解决问题。
2.局部推理建模
对前提句子和假设句子进行子句子级别的局部推理建模是决定整个推理的重要环节。为了更仔细地进行局部推理,我们对序列和句法树模型继续做更进一步地挖掘。其中序列模型对词和词的上下文进行局部推理相关信息的收集;树形LSTM进行对词组和从句级别的局部信息收集。
这里的局部信息推理模型涉及到对前提句子/假设句子相互之间各个句子子部分的硬对齐操作和软对齐操作。这种对齐操作和传统自动机器翻译中的对齐方法很相近。具体的实现过程,可以通过计算soft的注意力分数实现。
前人的工作将这种操作分解成一下过程:
前提句子或者是假设句子的序列转化成词嵌入向量的词袋。前提句子内的每个词各自与假设句子中的每个词计算得到的注意力分数作为soft对齐的关联程度。值得注意的是,这种基本做法尽管有效并且是目前能够取得最好结果的做法,但是使用预训练的词嵌入向量本身忽视了NLI任务中词语的上下文信息。
这里的软对齐操作是使用一下计算公式的注意力权重计算。
它是前提句子序列和假设句子序列的隐状态之间的相似度计算。这是通过多次实验得到的,使用更复杂的关系计算方式,并不能得到更好的效果提升。这里公式中的计算对象,是前面BILSTM计算得到的隐状态向量,也可以是树形LSTM计算得到的隐状态向量
。
序列上的局部推理信息
局部推理主要是由注意力权重
决定的,它代表了前提句子和假设句子的局部相关性。举个例子,前提句子某个词语的隐状态向量
,它已经包含了词语本身和词语上下文的信息,而且在假设语句中和它相关的语义信息通过
进行识别和组合。比如,两个句子间的相互关联和组合表达,可以通过以下方式:
假设语句中内容
会通过与
的相关性进行选择和参与加权表示。
句法分析树上的局部推理信息
这里所讨论的句法分析树是成分句法分析树(constituency parser.),而不是依存句法分析树(Dependency Parsing)。成分句法分析树用来收集词组和从句的局部推理信息。当分析树中的每个节点的隐状态都计算好了之后,这些分析树中的节点都是没有区别的,唯一要做的就是使用注意力分值来分析它们之间的关系。我们还是使用
来计算前提句子和假设句子的所有节点配对之间的注意力权重。这种做法把前提句子、假设句子中含有的所有的词语、成分词组和从句都联系起来了。我们计算得到这种关系信息,并把它们传递到接下来的神经网络层。
增强局部推理信息
我们进一步增强局部信息收集。我们计算隐状态向量两两之间的差值向量和元素点积结果向量。这种操作能够帮助获得局部推理过程中比较突出和明显的特征信息,或者获得一些类似矛盾关系的推理信息。差异向量和元素点积结果向量通过和原始的隐状态向量连接起来,得到增强后的特征。
这种隐状态的增强操作,对句子序列BILSTM模型和树形LSTM模型的隐状态向量都进行操作。这种操作是一种对序列特征进行抽取高阶交互特征的方法。然而,根据实验的尝试,我们也发现对这种高阶的交互特征进行进一步的前向神经网络的计算,增加顶层隐状态向量到前面我们讨论的特征连接的结果向量上,并不会得到更好的效果。
3.推理组合
在推理组合环节中,我们将最终确定前提句子和假设句子的全局关系。在组合层我们对增强版的局部推理信息
和
进行组合。我们进行句子序列的组合或者进行上下文句法分析树形的组合。
在句子序列的推理模型中,同样也使用BILSTM模型进行组合推理信息
和
,计算方式和前面提到的输入编码的操作相同,但是目的不一样。这里的主要目的是获得局部推理信息和以及上下文信息进行组合。
在树形组合过程中,每个树上的节点的高层次计算主要是进行组合局部推理信息。
在这种组合过程中,由于向量的连接操作,会使得BILSTM、树形LSTM模型的输入维度翻倍的增加,导致模型参数的成倍增加。众所周知,这种参数的成倍增加很容易导致模型潜在的过拟合。为了避免这种过拟合的后果,在模型中需要对输入增加一层带ReLU激活函数的前向神经网络。
推理的最后是通过池化技术将推理组合得到的结果向量转化成一个固定长度向量,并且输入到最终的分类器中来决定最终的全局推理关系。前人的一些向量求和池化方法都对序列长度很敏感并且欠缺鲁棒性。我们使用新的策略:同时计算平均池化和最大值池化,把结果串联连接成一个最终的固定长度的向量。具体的计算方式如下:
这种方法通过多次实验比较,显示能够比求和池化的结果有明显的提升。在树形推理组合中,最后一步向量的串联连接稍微有所不同。树形组合需要将根节点隐状态向量连接起来。
在最后的分类环节中,模型把得到
的输入到最后的多层感知器MLP分类器中。MLP有一个tanh激活函数和一个softmax输出层。带有输入编码、局部推理和推理组合三个模块的整个模型,本质上还是一个端到端训练的模型,训练的损失函数也采用多分类交叉熵的损失函数。
这里介绍的模型,当只保留对序列句子的推理,舍弃句法分析树相关的分析推理组件,这时候模型就是增强化的序列推理模型ESIM。ESIM在竞赛中已经取得了很不错的结果。当考虑句法分析树的信息,通过多层次的树形LSTM编码,把这部分的信息和ESIM模型的信息结合起来,比如使用取预测概率的平均值得到句子配对的最终关系标签,这就是混合推理模型HIM。通过实验的验证,融合句法分析的信息的HIM能够比ESIM模型进一步提升推理的效果(文/易盾实验室)。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。