论文题目:Generalize Symbolic Knowledge With Neural Rule Engine
论文地址:https://arxiv.org/abs/1808.10326
目前的自然语言处理任务中,神经网络模型在学术界占据了绝对的优势,然而,基于符号知识的规则系统仍然在工业界大有用武之地。人类语言是一种非常复杂的现象,为了更好地构建语言智能系统,可以将神经网络和符号知识融合使用,集成二者的优势。
近两年来,神经符号学习(Neural Symbolic Learning)成为一个非常热门的方向,不少优秀的科研工作把符号知识引入神经网络模型,增强了模型的学习能力和可解释性,在一些经典的 NLP 任务上都取得了不错的效果。与这种融合方式相反,近日,深度好奇的研究者们提出了一种全新的融合策略——利用 NN 模型来改进规则的效果。NN 模型的优点是灵活性高、泛化能力强、鲁棒性好,如果将 NN 模型的这些优势赋予规则系统,会产生出怎样的火花呢?
本文介绍了一种神经规则引擎(Neural Rule Engine,NRE),NRE 可以从规则中学习知识,同时又通过神经网络来泛化知识,这与人类学习知识的方式有异曲同工之妙。
具体来说,NRE 由神经模块网络(Neural Module Networks)构成,其中的每一个模块代表了规则中的一种操作,而模块的实现形式既可以是神经网络,也可以是符号算法。并且,给定少量的标注样本,可以使用强化学习来微调(Finetune)学习效果。实验证明,NRE 可以大幅提升规则的召回率(Recall),同时还能将精确率(Precision)维持在较高的水准。
举个具体的规则例子,对于一个判断案件类型的分类任务来说,案件内容如下:
「2003 年 12 月 21 日中午 12 时,东浦村张某与王某某二人到临西县游玩,被三名男子跟踪,后用刀威逼,抢走手机一只。」
根据经验来看,如果案件表述中有「跟在.*后面|跟踪」,一般属于「尾随作案」,但是如果其中有「事主.*跟随」的话就不是。所以,针对「尾随作案」类别,可以写一条规则:
「跟在.*后面|跟踪 @@ 事主.*跟随」
其中「@@」左边蓝色的是正规则,也就是句子中必须匹配上的内容,「@@」右边红色的是负规则,也就是句子中不能包含的内容。
由于正则表达式是有限状态机的一种,所以可以定义一些操作(Action)来解析正则表达式规则,比如:
用预先定义好的操作来表示规则,如下图所示:
每一条规则都可以被拆解成树状结构,拆解的过程依赖于 Rule Parser。由于整个系统的设计既考虑了符号性又考虑了神经网络的特性,所以对于规则的拆解上既可以用符号算法来实现也可以用 Neural Rule Parser 来实现。由于树状结构可以转变成逆波兰表达式(Reversed Polish Notation)的形式(如下图):
因此可以采用一个 Seq2Seq 的神经网络模型来实现对规则的拆解。具体如下:
给定一条规则,鉴于同时预测模块和模块所需参数较为困难,所以可以采取分步的方式来预测。第一步先预测操作序列,第二步根据规则和已经预测出来的操作来预测每个操作所对应的参数。为了让预测的结果更加可靠,在训练阶段,我们加入了微调(Finetune)过程,对于预测出来的操作序列根据在真实事例上的表现用强化学习来进行模型的调整。
得到 rule parsing 的结果后,即可对模块进行组装。在本文中,Find 模块和 And_Ordered 模块都采用了神经网络的设计。
Find 模块
Find(x) 模块是用来查找句子中匹配 x 部分的内容,可以用正则表达式的匹配来实现,也可以用神经网络来实现。神经网络的 Find 模块如下:
对于每一个句子来说,Find(x) 操作就是在句子中找到 x,x 可以是一个字、一个词或者是一个 N-gram。无论用神经网络实现还是用正则表达式的 match(x) 来实现,任务都可以看作是对句子做序列标注,也就是对句子中的每一个单位都标注「是否匹配」的标签。具体来说,对于句子中的每一个单位,先获取到它滑动窗口的上下文,并令上下文和要查找的 x 都通过相同的编码器(Encoder),之后用评价函数来对二者的相似程度进行打分,最后根据每个位置的所有分数来判断当前位置的标签。
And_Ordered 模块
And_Ordered 模块可以采取如下设计:
And_Ordered 操作是用来判断两个输入之间是否满足一定的距离关系。通常来说,输入就是子节点给出的标记结果,如 r0 和 r1。为了让神经网络更容易判断输入之间的距离,我们可以引入距离标记 d0 和 d1。结合句子原文,And_Ordered 模块可以判断出两个子节点的输入是否满足距离关系。
模型训练
在训练过程中,模块和 Neural Rule Parser 都采取了预训练+微调的策略。在训练时,先对数据和规则进行训练集/验证集/测试集的划分,为了避免数据泄漏,各部分之间不能混用。训练模块的时候,先根据数据随机生成各个模块的训练样本,在训练到一定程度时,把训练集中的规则真实应用于训练集中的数据,按照数据的真实标签采用强化学习的方式对模块进行微调。对于 Neural Rule Parser 也按照类似策略,依前文方式进行训练。
Neural Rule Engine (NRE)
NRE 集合了上述的组件:NN/算法实现的模块,NN/算法实现的 Rule Parser。NRE 的整体架构如下图所示:
对于给定的一条事例和一条规则,NRE 先将规则拆解成由模块组成的树状结构,之后根据树状结构将规则应用于具体的语句上,从而给出匹配后的结果。
实验
论文在中文案情分类(Chinese crime case classification)任务和 SemEval-2010 relation classification 任务上进行了实验。实验结果如下:
NRE 在中文案情分类数据集上的结果
NRE 在关系分类数据集上的结果
上面的结果显示,RE 的 Precision 很高,但是 Recall 相对较低。而第二组 Baseline 是传统意义上的序列模型,并不能处理好正则表达式,特别是正则表达式除了局部的匹配还需要考虑有层级关系的全局匹配,传统的序列模型很难处理好这些情况。NRE 则能带来 Recall 接近翻倍的效果,同时 Precision 仍维持在较高的水平。需要关注的是,微调(Finetune)对 NRE 来说是至关重要的,因为 NRE 在预训练阶段是单纯地在训练各个模块,而微调是让规则在真实场景中调整的关键。
同时,由于 NRE 可以充分利用神经网络和符号二者的优势,为了探究规则的泛化性从何处而来,我们还进行了额外的实验。我们通过对不同部分分别采用神经网络和符号算法,从而得到了混合的模型(见下表)。随着神经网络的介入,NRE 整体的 Recall 表现会更好,而 Precision 在合理的范围内有所下降。实际上,这是因为神经网络的灵活性所带来的优势,弥补了规则匹配的僵硬。
神经网络和符号算法的不同组合,其中「_」左边是神经网络的实现,右边是算法实现,「P」是「Find_Positive」,「N」是「Find_Negative」,「A」是「And_Ordered」,「S」是「Rule Parser」。
另一方面,研究模型给出的结果可以发现,Find 模块带来了巨大的泛化能力。传统的正则表达式是对样式进行匹配,而 NRE 在一定程度上是对语义进行匹配。如下述两图的中英文案例所示,查找「pushed into」会合理地找到「put inside」,而像「进入室内」被「入室」整体匹配上更能说明 NRE 对词语的查找会超越样式本身。
与此同时,用 Neural Rule Parser 对规则进行拆解也是对规则本身进行修正。比如下图中的「落水管」和「不锈钢管」被合并成为了「管」,而且「打墙洞」中的「洞」被删去。
总结
我们提出了一种全新的学习策略来对符号规则进行改进,神经规则引擎(Neural Rule Engine)使得规则获得了神经网络带来的灵活性、鲁棒性和泛化能力,同时又保持了规则的精确性和可解释性。
NRE 包含了 Rule Parser 和一系列操作模块,他们既可以是定制化的神经网络,又可以是符号算法。对于一条给定的规则,NRE 先对规则进行拆解,使其成为操作序列,之后根据操作序列来装配模块,最终给出预测结果。此外,我们还提出了分步的训练方法使得构建 NRE 成为可能,即先对模块和 Rule Parser 随机生成数据进行预训练,之后根据真实的样本标注用强化学习进行微调,从而得到具有泛化能力的规则表示。
实验表明 NRE 可以大幅提升规则的 Recall,同时还能维持较高的 Precision。NRE 不仅是一种新的神经符号学习范式,同时也为现有的工业应用带来了一种高效的改进,它可以被用来对已有的规则系统进行升级,或者在训练数据不大的情况下快速开发出神经规则系统。