全文的标题是GL-GIN: Fast and Accurate Non-Autoregressive Model for Joint Multiple Intent Detection and Slot Filling。
目录
Introduction
在对话系统中,意图识别与槽填充可以说是两个最基本的任务,前者可以看做是文本分类;后者则是序列标注。目前越来越多的方法对二者进行联合提取,但是目前的联合模型严重依赖自回归方法,导致了两个问题:推理速度慢和信息泄漏。如图:
(a)表示自回归方式,同Seq2Seq类似,当前位置的slot必须根据前一个决定,因此是一个one-by-one的输出模式,因此时间复杂度很高。
因此,本文提出了一种全局-局部图交互网络(GL-GIN),其中提出了一个局部时隙感知的图交互层来建模时隙依赖,以缓解不协调的时隙问题,同时引入了一个全局意图时隙图交互层来建模话语中多个意图和所有时隙之间的交互。
本文的具体贡献如下:
- 第一次尝试探索联合多重意图检测和槽填充的非自回归方法。
- 提出了一种全局-局部图交互网络,其中局部图用于处理不协调的槽问题,而全局图用于模型序列级意图-槽交互。
- 框架不仅达到了最先进的性能,而且大大加快了槽解码速度。
- 本模型可以与预训练模型结合,从而进一步提升性能。
Problem Definition
下面介绍一些符号与定义:
- 输入序列: x = ( x 1 , . . . x n ) x={(x1,...xn)} x=(x1,...xn)
- 多意图分类:多标签文本分类任务,根据输入序列预测多个标签: o I = ( o 1 I , . . . o m I ) o^I=(o_1^I,...o_m^I) oI=(o1I,...omI)
- m m m:给定句子中意图的数量
- n n n:句子的长度
Approach
如图所示,模型分为三个部分:Self-attentive Encoder,Token-Level Intent Detection Decoder以及Slot Filling Decoder。其中,以Slot Filling Decoder最为复杂。
Self-attentive Encoder
这个结合了BiLSTM以及Self-Attention,没有什么好说的,最后将二者的输出拼接在一起:
其中
H
H
H是BiLSTM的输出,
C
C
C是Self-Attention的计算结果:
其中
E
=
{
e
1
,
.
.
.
e
n
}
∈
R
n
×
2
d
E=\{e_1,...e_n\}\in R^{n×2d}
E={e1,...en}∈Rn×2d。接下来的decoder操作都在encoder的输出
E
E
E的基础上完成。
Token-Level Intent Detection Decoder
在意图识别的时候使用了一个比较好玩的token级别的意图检测,首先还是使用一个BiLSTM对encoder的输出做进一步的操作:
h
t
I
h_t^I
htI被用于做意图识别:
然后,句子级别的意图可以根据
I
t
∈
R
n
×
k
I_t\in R^{n×k}
It∈Rn×k计算,
k
k
k表示意图的数量:
这个公式的意思是,加入
I
t
I_t
It每一个对应token的概率如果要比0.5大,那么就累加1,最终的累加和要是比句子长度的一半要大,那么就代表当前意图
k
k
k是这句话的意图。所以
I
(
i
,
k
)
I_{(i,k)}
I(i,k)表示的是token
i
i
i 对意图
k
k
k的贡献大小。
Slot Filling Decoder
Slot-aware LSTM
依旧是使用BiLSTM先进行操作:
首先将意图向量与encoder的输出进行拼接,原文中没有给出,不过可以推断
I
t
∣
∣
e
t
∈
R
n
×
(
2
d
+
k
)
I_t||e_t\in R^{n×(2d+k)}
It∣∣et∈Rn×(2d+k)。这样得到slot-aware隐藏表示。
Global-locally Graph Interaction Layer
全局-局部图交互层由两个主要部分组成:一个是局部槽感知图交互网络,用于模型跨槽依赖;另一个是全局意图-槽图交互网络,用于考虑意图和槽之间的交互。
Local Slot-aware Graph Interaction Layer。每个字槽用一个顶点表示,每个顶点都用相应的槽隐藏表示进行初始化,每个槽在一个窗口内部与其他槽进行连接,由此构建出一个slot之间交互的图。槽之间的信息聚合使用GAT:
这里的
l
l
l就是GAT的层数。
Global Slot-Intent Graph Interaction Layer。不使用自回归的重点在这里,所有预测的多个意图和序列槽连接起来,就能实现并行输出槽序列。在这里,一共有
n
+
m
n+m
n+m个节点,
m
m
m代表预测的意图。输入的槽的特征是上一步槽之间卷积得到的特征:
而意图节点的特征由
o
I
o^I
oI变换得到:
ϕ
\phi
ϕ表示线性变换。而边的情况比较复杂,一共有三种类型的边:
- 槽-意图。每个槽连接所有预测的多个意图。
- 槽-槽。通过共现窗口构建。
- 意图-意图。所有意图之间均存在边连接,然后为了去拟合意图之间的联系,用GAT能够很好地学习。这与多标签任务建模标签之间的联系是一样的道理。
然后,这个联合了槽与意图的异构图的更新方式如下:
Slot Prediction
最终使用得到的槽全局表示进行预测,这个
g
t
[
S
,
L
+
1
]
g_t^{[S,L+1]}
gt[S,L+1]融合了意图与槽的特征。
Joint Training
损失函数是两个任务的联合损失:
其中
N
S
N_S
NS是槽标签的个数。最终的损失函数:
Experiments
数据集
实验结果
速度比较:
消融试验
其中,主要消融的部分是和GAT有关的不同组件。
可视化
可以看到基于GAT的注意力能够很好地捕捉槽与意图之间的关系。
Case Study
可以见到GL-GIN很好地识别出来了时间槽。
Effect of Pre-trained Model
基于预训练模型能够很好地提升效果: