文章目录
前言
许多自然语言处理(NLP)任务的成功都受到注释数据的数量和质量的限制,但往往缺乏这样的训练数据。在本文中,我们提出了这样一个问题:“我们可以将神经网络(NN)与正则表达式(RE)结合起来来改进NLP的监督学习吗?”。作为回答,我们开发了新的方法来利用神经网络中不同水平上的REs的丰富表达性,表明当有少量的训练例子可用时,这种组合显著地提高了学习效率。我们通过应用于意图识别( intent detection)和语义槽填充(slot filling)的口语理解来评估我们的方法。
一、介绍
正则表达式(REs)被广泛应用于各种自然语言处理(NLP)任务中,如模式匹配、句子分类、序列标记等(Chang and Manning, 2014)。作为一种基于人工制作的规则的技术,它简洁、可解释、可调,并且不依赖于太多的训练数据来生成。因此,它通常在工业中使用,特别是当可用的培训例子有限时——如少样本学习(GC et al., 2015)。
虽然REs功能强大,但泛化能力较差,因为RE中所有同义词和变体都必须明确指定。因此,REs通常与数据驱动的方法相集成,如基于神经网络(NN)的技术:一组精心编写的REs用于高精度地处理某些情况,其余的留给数据驱动的方法。
我们相信REs的使用可以超越简单的模式匹配。除了作为一个要集成的单独分类器外,RE还对开发人员的问题域知识进行编码。例如,知识可以是一个RE的表面形式中的信息词(线索词clue words)。我们认为,这些信息可以利用数据驱动的方法来获得更好的预测结果,特别是在少样本学习中。
这项工作研究了使用REs来改进NNs——一个广泛应用到NLP任务的学习框架(Goldberg, 2017)。REs和神经网络的结合使我们能够利用REs的简洁性和有效性,以及神经网络的强泛化能力。这也为我们提供了向各种REs学习的机会,因为NNs善于容忍噪音(Xie et al., 2016)。
本文提出了在不同层次上REs与神经网络结合的新方法。在输入层,我们打算使用REs的评价结果作为神经网络的输入特征(3.2节)。在网络模块层,我们展示如何利用REs中编码的知识来指导神经网络的注意力机制(3.3节)。在输出层,我们以一种可学习的方式将RE的评估结果与神经网络输出相结合(3.4节)。
我们通过将其应用于两个口语理解(SLU)任务来评估我们的方法,即意图识别(intent detection)和语义槽填充(slot filling)——它们分别对应于两个基本的NLP任务:句子分类和序列标记。真实世界中可用的带注释数据的数量可能会有所不同。为了演示REs在这些场景中的有效性,我们探索了少样本学习设置和一个完整的训练数据。实验结果表明,该方法在可利用的注释数据中非常有效的,明显优于不使用RE的方法。
我们的贡献如下:(1)我们首次系统地研究了REs与NNs结合的方法。2)所提出的方法在少样本学习(the few-shot learning )和全注释设置(the full annotation settings)中都明显地提高了神经网络的性能。(3)我们提供了一套关于如何将REs与神经网络和RE注释相结合的指南。
二、背景
2.1 排版(略)
2.2 问题定义
我们的工作针对两个SLU任务:意图识别和语义槽填充。前者是一个句子分类任务:学习一个函数将一个n个单词的input:x = [x1, ..., xn],映射到相应的意图标签(intent label)。后者是一个序列标记任务:学习一个函数将一个n个单词的输入查询序列,x = [x1, ..., xn],,生成相应的标记序列,y=[y1,...,yn],其中,yi是对应单词xi的插槽标签(slot label)。
以Fig. 1 中的句子为例。一个成功的意图检测器(intent detector)会找出这个句子的意图,即flight,查询与航班相关信息。插槽填充子(slot fifiller)应该用BIO方法,通过标签Boston 和Miami来识别插槽fromloc.city 和toloc.city。
2.3 正则表达式的使用
在这项工作中,RE定义了从文本模式到多个REtags的映射,和target labels (即意图和插槽标签)相同或相似。一个搜索函数接受一个RE,把它应用到所有句子,并返回与该模式相匹配的任何文本。然后我们将 REtag(s) (与匹配的RE有关)分配给所有匹配到的句子(用于意图识别)或匹配到的短语(用于语义槽填充)。
具体来说,我们用于意图检测的 REtags 与意图标签是相同的。例如,在Fig. 1中,我们得到的“flight”的REtag与意图标签“flight”相同。
对于语义槽填充,我们使用两个不同的REs集合。给定RE的组功能,我们可以将REtags分配给我们感兴趣的RE groups 即(圆括号内定义的表达式)。从REtags到插槽标签的转换取决于相应的REs的使用方式。(1)当REs用在网络模块时(3.3节),相应的REtags与目标插槽标签相同。例如,Fig. 1 中的 slot RE 即将把 fromloc.city 分配给第一个RE group ,toloc.city分配给第二个。此处提到的,_ _CITY是city names的列表,可以被RE字符串(如:/Boston|Miami|LA|.../.)替换。(2)如果在神经网络的输入输出层使用了 REs ,相关的 REtag 将不同于目标插槽标签。在这种情况下,Fig. 1 中的两个 RE groups 会被简单地标记为 city ,用于捕获三个相关的目标插槽标签(fromloc.city, toloc.city, stoploc.city.)的共性。我们可以使用目标插槽标签作为所有集合的REtags 。这里将 REtags 抽象为目标槽标签的简单版本的目的是为了证明:当评估结果不完全符合我们的学习目标时,REs 仍然有用。进一步地,如4.2节所示,使用简化的 REtags 也可以使任务中的 REs 开发得更好。
直观地说,复杂的REs可以导致更好的性能,但需要更多的努力来生成。一般来说,最影响RE复杂性的方面有两个方面:RE groups的数量和 RE groups 中的 or clauses(即:由分离运算符分隔的表达式)。拥有更多的RE组通常会使结果更加准确,但是对模式匹配的覆盖率较低;而大量的or clauses通常会提供更高的覆盖率,但准确度略低。
三、方法
如Fig. 2所示,我们建议从三个不同的角度结合NNs和REs。
3.1 Base Models
我们使用 Bi-directional LSTM (BLSTM) 作为我们的基础神经网络模型,因为它在意图检测和插槽填充方面都是有效的(Liu and Lane, 2016)。
Intent Detection.
如 Fig. 2 所示,BLSTM将一个n个单词句子的单词嵌入[ x1 , ..., x n] 作为输入,并为每个 word i 生成一个 vector h i 。然后,一个自注意层接受由BLSTM产生的向量来计算句子嵌入s:
这里 αi 是 word i 的注意力;c是随机初始化的可训练向量,用于选择信息丰富的词进行分类;W
是一个权重矩阵。最后,将s 输入一个softmax分类器进行意图分类。
Slot Filling.
插槽填充的模型很简单——插槽标签预测由一个softmax分类器生成。BLSTM的输出 h i 传入softmax分类器,然后生成了word i 的插槽标签。值得注意的是,Fig. 2 中的注意力聚集仅采用3.3节提出的网络模块级的方法。
3.2 在输入级别上使用REs
在输入层面,我们使用REs的评价结果作为特征,输入神经网络模型。
Intent Detection.
我们的意图检测的 REtag 与我们的目标意图标签相同。因为现实世界中的 REs 不太可能是完美的,一个句子可以匹配到多个RE。这可能导致一些 REtags 相互冲突。例如,句子“ list the Delta airlines flflights to Miami”可以匹配输出标签 airline的 RE:/list( the)? _ _AIRLINE/,还可以匹配到输出标签 flight的RE:/list( \w+) {0,3 }flights?/。
为了解决上述相互冲突的情况,我们对随机初始化的可训练标签嵌入进行平均,形成一个聚合的嵌入作为 NN输入。有两个使用聚合嵌入的方法。我们可以将聚合的嵌入附加到每个输入词的嵌入中,或者是softmax分类器的输入中(如 Fig. 2(a)的①所示 )。为了确定哪种策略最有效,我们进行了一项试点研究。我们发现,第一种方法会导致标签嵌入被多次复制,因此,神经网络倾向于严重依赖 REtags ,并且所得到的性能类似于在少样本中单独使用REs所得到的性能。因此,我们采用了第二种方法。
Slot Filling.
因为 slot REs 得到的评价结果是字级标签,所以我们可以简单地将 REtags 嵌入并平均到每个单词的向量 f i中,并将其添加到相应的词嵌入 w i中(如 Fig. 2(b) 的①所示 )。 注意,我们也要将插槽 REtags 扩展到BIO格式,如:对于词 New York ,如果它最初的标签是 city,那么它的 REtags 就是 B-city和 I-city 。
3.3 在网络模块级别上使用REs
在网络模块层面上,我们探索了使用RE表面形式中的线索词的方法来指导神经网络中的注意力模块。
Intent Detection.
例如Fig. 1,RE: /ˆflights? from/指向意图“flight”的意思是,flights from是决定意图flight的关键词。
因此,神经网络中的注意力模块应该利用这两个词得到正确的预测。为此,我们通过两个方面的改变来合并从REs中获得的信息,从而扩展基本的intent模型。
首先,因为每个意图都有它自己的线索词,所以,为所有的intent模型使用一个单一的句子嵌入,会让注意力不那么集中。因此,我们让每个意图标签k使用不同的注意力ak,然后它被用来生成句子嵌入sk 的意图:
其中ck是意图k(用于计算注意力ak)的可训练向量,hi是单词 i 的BLSTM输出,Wa是一个权矩重阵。
输入句子的表达意图k的概率pk计算如下:
其中wk, logit_k, bk分别是意图k的权重向量、对数几率和bias偏差。
其次,除了表示意图k的句子(positive REs),一个RE也可以表达“句子没有表达的意图k(negative REs)”。因此,我们使用了一套新的注意力(negative attentions),与positive attentions形成对比,利用式子2,3计算每个意图的另一组logit对数几率。
我们把通过positive attentions计算得到的logit定义为logit_pk,通过negative attentions计算得到的定义为logit_nk。最后求得的意图k的logit为:
为了使用REs来引导注意力,我们在最后的损失的基础上加上注意力损失:
其中,当没有一个相匹配的REs(指向意图k)将单词i标记为线索词时,tki被设置成0;否则设置为1/lk,其中lk是意图k的线索词的数量。我们使用式子5来计算positive REs的注意力损失loss_att_p,和negative REs的注意力损失loss_att_n。最终的损失计算为:
Slot Filling.
意图预测所使用的双向注意力机制(positive and negative attention)不适用于语料槽填充。因为对于语料槽填充,我们需要计算每个单词的注意力,这需要过大的计算量和内存资源。
因此,我们使用了双向注意力的简化版本——所有的槽标签使用相同的正反向注意力。为了预测单词 i 的槽标签,我们使用与式子1类似的式子7,从正向注意力中生成有关单词 i 的句子嵌入 s pi。
其中 hi,h j分别是 BLSTM有关词 i 和 j 的输出。 W sp 是一个权重矩阵, α pij 是单词j对单词i的正关注价值。用 W sn替换 W sp,用式子7,再次计算得到反向注意力,并生成相应的句子嵌入 s ni。
最后,对单词i的预测pi可以计算为:
其中 W p , W n , b p , b n分别是正负注意力的权重矩阵和偏差向量。我们把 BLSTM的输出hi添加到spi 和sni,因为单词i本身在识别其槽标签中也起着至关重要的作用。
3.4 在输出级别上使用REs
在输出级别,REs用于修正NN的输出。对于意图识别和语义槽填充,我们使用相同的方法(图2.③)。
如2.3节所述,输出层使用slot REs只得到了目标插槽标签的简化版本,我们可以进一步注释它们,得到相应的目标插槽标签。例如,输出city的RE可以进一步得到三个插槽标签:fromloc.city, toloc.city, stoploc.city.。
设置一个0—1的数zk,用来表示:是否至少有一个匹配的RE可以生成目标标签k。一个句子的标签k(或者一个特定的槽填充)的最终对数几率为:
其中logit’k是由原始NN生成的logit,wk是可训练权重,表示对REs的总体置信度,可以通过它得到目标标签k。这里我们不为每个RE分配一个可训练的权重,因为通常只有几个句子能匹配一个RE。
我们修改了logit而不是最终的概率,因为一个logit是一个无约束的真实值,它比概率更匹配wkzk的性质。在模型进行集成时,使用对数进行集成通常比使用最终概率更好。这也是我们在3.3节选择对logit进行操作的原因。
四、评估方法
我们的实验旨在回答三个问题:当注释实例的数量很少时,使用REs是否能提高学习质量?在使用完整的训练数据时,使用REs仍然有帮助吗?我们如何选择不同的组合方法?
4.1 数据集
我们使用ATIS数据集(Hemphilletal.,1990)来评估我们的方法。该数据集被广泛应用于SLU的研究中。它包括对航班、膳食等的查询等等。我们遵循Liu和Lane(2016)的设置,使用4978个查询进行训练,使用893个查询进行测试,其中有18个意图标签和127个插槽标签。在标记化阶段,我们还将像Miami’s这样的单词分成像Miami ’s这样的单词,以减少没有预先训练过的单词嵌入的单词的数量。这个策略对few—shot学习很有用。
对于问题一,具体来说,对于意图检测,我们为每个意图随机选择5、10、20个训练实例,形成少镜头训练集;对于槽填充,我们还探索了5、10、20个shots设置。
然而,由于一个句子通常包含多个槽,频繁提及槽标签的次数可能不可避免地超过目标shot数。为了更好地接近目标shot数,我们按照标签频率的升序为每个槽标签选择句子。即如果k1>k2,k1-shot数据集将包含k2-shot数据集。所有设置都使用原始测试集。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。