A Joint Model of Intent Determination and Slot Filling for Spoken Language Understanding
Abstract
在SLU(spoken language understanding)中的两个主要任务是intent determination(ID)和slot filling(SF)。循环神经网络已经证明了能高效地解决SF类的问题,但是目前还没有将RNN运用到ID中的例子。本文提出了一个同时解决两个问题的joint model。本文模型使用GRU作为特征提取的循环神经网络单元,使用max-pooling层提取句子的全局特征,用来做ID。使用两个任务的联合loss来训练模型。本文在两个数据集上进行了实验,在两个数据集上,两个任务都达到了state-of-art的效果。
Introduction
对话系统中的SLU主要目的是拿到一句话的intent以及slot需要的值。最近几年,在自动客服系统,自动问答系统,语音助手等领域,SLU都是很火的研究热点。一般会先将语音转换为文本信息或者直接拿到用户的文本信息,再确定用户的意图以及一些参数(slot)值,下一句就是根据intent和slots值来帮助用户实现他们的要求。
举个例子,比如”Show flights from Boston to New York today”,一条来自airline travel information system (ATIS) corpus的数据(SLU中特别最广泛使用的数据集)。这句话的Domain是airline travel,intent是find a flight。”Boston”被标记为离开的城市,”New York”被标记为目的地。如下表所示。
domain和intent的识别可以认为是semantic utterance classification问题,而slot filling是槽填充问题。本文将主要聚焦在意图识别上。
目前,已经用RNN达到了SF任务的state-of-art,然而却没有将RNN运用到ID任务中。使用联合模型有两个主要的原因:
- 两个任务在SLU系统都是必须的
- 解决一个任务时的一些信息可以被另一个任务所使用来提高最终的效果。
本文采用GRU来学习序列的每个time step的语义表达,一方面这些语义表达会用预测slot的标签,另一方面这些也会进行意图的分类。本文提出的joint model在两个数据集上,在ID和SF任务上都达到了 state-of-the-art的效果。
上面的joint方法是并列的形式,另一种结合的方式是用用pipeline的串行结构,首先做意图分类,然后使用意图分类信息进行槽填充。这种方法并没有上一种方法好,因为这种信息流动是单向的,并且会受error propagation problem影响。
Related Work
介绍了一些SF和ID的传统机器学习和深度学习方法。
Model
模型的主要结构如下图所示
模型输入是文本S,是一系列的词 $w_1, w_2,…,w_T$,T是文本的长度。有两个输出,$l^s$ 和 $l^u,分别代表槽序列标注以及意图的标签。
1. Embedding
和一般NLP任务的Embedding略微不同,每个time step的输入是一个context窗口,每个词的Embedding会考虑上下d个单词,会concat上下文一共2d+1个单词作为当前time step的输入。公式如下:
因为在SLU任务中命名实体的特征非常重要,所以我们会考虑在Embedding过程中加入命名实体特征,每种命名实体(包含不是实体)都会进行Embedding,这些向量可以使用[0,1]之间进行随机初始化,同时在训练过程中fine-tune。所以最终的每个time-step的输入为:
这种方法值得我们借鉴,是不是使用context-window的方式是不是效果会好
2. Recurrent Hidden Layers
使用GRU作为神经单元的双向循环神经网络。将两个方向的隐藏层输出concat作为RNN层的输出。
3. Task Specific Layers
使用上一层的语义输出,针对具体的任务进行计算。针对SF,可以直接使用输出进行序列标注;针对ID,使用max-pooling 层拿到整个序列的语义 $h^u$
max方法是元素级别的,会对每个位置的T个元素取最大,得到定长的特征序列。
最后一部分是输出层,使用softmax函数得到每个类别的概率。
除此之外,我们还引入了一个转移得分矩阵$A_{ij}$表示从label i 转移到 label j的概率。对于一个标注序列,我们将计算该标注的综合得分,根据综合得分取概率最高的序列作为最后的序列标注结果。
我们会引入一个表情”BOS”来表示序列的$l_0$, 最后选择概率最大的序列最为slot label序列:
4. Training
主要的训练参数包括:
A矩阵是slot标注的转移矩阵。
意图识别的loss使用的是交叉熵:
slot filling的loss根据最大间隔准则计算:
最终的loss为
$\alpha$是调节两个任务loss的系数。
总结
模型本身不难,但是意图识别和槽填充是自己之前没有做过的方向,算是一次学习吧。
- 输入为context-window的方式可以考虑借鉴
- joint model的方式可以借鉴
- 使用了转移矩阵A计算计算最终的序列概率