由于个人习惯,系统设计、nlp任务,会从 `五个步骤、四个组件`来分析:
系统设计五个步骤:
1. 数据预处理
2. 模型
3. 策略
4. 优化(算法)
5. 正则化
NLP模型四个组件:
1. Embedding
2. Representation(encoder)
3. Decoder
4. Output
任何论文在以上五个步骤、四个组件中任何一环节有卓越设计之处,我都希望能有机会好好学习研读,同大家分享。侵权必删。
Paper: A Joint Model of Intent Determination and Slot Filling for Spoken Language Understanding;
Task: JointTextTask;
一、Paper综述
该文章为针对SLU(Spoken Language Understanding)的意图-槽填充联合模型,文章的出色之处在于提供了一个同时在文本分类和文本标记两个nlp基本任务中都取得卓越成绩的基于RNNs的联合模型。
对于SLU(即语义理解)来说,一般有两项主要任务:意图识别(Intent determination,即文本分类)和槽填充(slot filling,即文本标记)。循环神经网络(RNNs),在文本分类任务中被证明可取得较好的结果。由于意图识别和槽填充有相当的联系,所以论文作者提出一个适合于两种任务的联合模型。
GRU具有随着时序学习每个词(token)的表征的特性,通过这个特性可以预测每个插槽,同时,一个max-pooling层可以捕捉句子的全局特征从而实现意图识别。GRU捕捉到的每个token的特征和max-pooling层捕捉的句子全局特征是被两个任务所共享的,譬如,假如一句话的意图是找到一个航班,那么他更有可能有出发以及目的城市,反之亦然。实验证明了联合模型比分开的每个模型效果都要更好一些。文章选用了United loss function作为策略,实验结果证明了该篇论文在两个任务中都取得了state-of-the-art的结果。
二、模型解释
模型的整体框架如下图所示,现在具体解释每一层的作用。
1. `Embeddings`
文章使用了预训练的词向量模型,并且加入了Mesnil et al.[2015]提出的context word window的想法,后者可以有效提高SF任务的表现,即除了使用词向量表征每个单词,使用d-context word window 来作为RNNs网络的时序输入,由单词的前d个、后d个和其本身一共2d+1个词向量表示而成,如下:
(1)
命名实体NER对SLU来说是一个非常重要的特征,为了使用这个特征,原文赋予每个命名实体一个置于[0, 1]的一个embedding,维度和词向量一样,并使之能在反向传播时进行训练,context named window如同上面定义context word window一样。所以,最后每个时序t的输入表示为:
(2)
注意,word和ner的窗口并不一定一样。
观察Pytext的model参数可以发现WordEmbedding的参数,其中,Embedding(820, 100)中的820代表输入文本单词总种类数vocabulary_size,100代表词向量的维数dimenstion_word2vec。
2. `Recurrent Hidden Layers`
即`Representation`,表示层,这里不再赘述Lstm和Gru的推导证明过程了,原文使用Gru的原因是,Gru使用了比Lstm更少的参数,但是得到了相当的结果。
这里使用了一个双向GRU的网络,用以捕捉一个d-gram的前向和反向序列的特征编码,前向和反向分别定义如下:
(3)
(4)
而t时刻的双向隐层状态是前向和反向隐层状态的拼接:
(5)
观察Pytext的model参数可以发现Representation的参数,可以发现双向LSTM的uniLSTM的输入和输出维数分别是100和366,通过将两个uniLSTM拼接起来,即可得到每个时序t的隐藏层,维数为732,假设一共有n个word,那么则有n个732维的向量来作为word级的表征。这里使用了SelfAttention而不是MaxPooling来作为网络的Pooling层(本人感觉Pooling层的定义在nlp领域现在逐渐发展为一种为数据降维或者连接各个部分得到语句统一表示的一种方法)以捕获句子级表征。
3. `Task Specific Layers`
双向隐层状态被两个任务所共用。一方面,在每个时序捕捉到的特征可以直接用来预测插槽的标签Label,另一方面,我们用max-pooling层来得到整个句子的表示:
(6)
这样我们即可得到整句话的特征信息表示。
最后,即是`Output` layer:
(7)
(8)
其中,和分别是SF和ID任务的转移矩阵,和分别是偏置向量。像序列标注和文本分类的任务不需要单独一个`Decoder` layers,或者说,解码和输出是同时进行的,如Pytext调用该模型时:
4. 策略
即目标函数的定义。事实上,目标函数的定义,作者希望能够考虑到从一个标签到另一个标签的转移分数(,in [Chen et al., 2015]),即从B-City到I-City的概率应该远比B-City到B-City的概率要大,所以,对于一个标签序列,一句话的分数由下面式子给出:
(9)
其中,是在t时刻预测正确的概率,即式(7)。特别注意的是,在时刻,标签为"BOS"。最后要输出的序列是得分最高的那组序列,即:
(10)
所以要训练的网络中参数包括:
(11)
其中,E和E'分别是单词token和命名实体ner的词嵌入,和分别是正向神经网络和反向神经网络的参数群。
接来下定义网络的损失函数,使用S来表示输入语句,和分别表示插槽slot和意图intent的ground truth。意图的损失函数是:
(12)
插槽slot的损失函数是max-margin(hinge loss):
(13)
对整个标签序列来说,损失函数定义如下:
(14)
最后的训练目标是最小化一个统一的损失函数:
(15)
是平衡两个任务的一个权重,D是整个数据集。通过这个损失函数,由GRU学到的表征可以同时考虑两个任务,并且,两个任务的联系使得表征可以同时被学习并且彼此提升。
三、实验分析
3.1. 数据集
ATIS dataset
ATIS是SLU领域中使用最广的数据集。
CQUD dataset
CQUD是百度知道搜集到的问题,是中文社区最受欢迎的Question Understanding Dataset.
3.2. 与之前的方法进行对比
实验结果展示如下,第二列是每个方法使用的特征,其中,W,N和S分别代表单词、命名实体和语义特征,在CQUD数据集中,W代表每一个中文字特征表示。
可以看到CRF的结果比SVM好,表明CRF更加适合序列标注任务。另外,RNN打败了CRF,因为RNN可以捕捉长依赖关系。而R-CRF模型结合了RNN和CRF模型的优点,可以模拟标签转移(本人以为这是指RNN加了CRF模型是可以避免一些大概率不存在的序列情况)和得到整个序列的全局的优点。对于填槽任务来说,sentence simplification是最好的办法,它使用了依存分析来提取句中关键词。RecNN使用dl提取的语义信息,但是他的效果比sentence simplification更差,作者认为可能的原因是语料的规模不够大。总的来说,论文在ID和SF领域分别提升了1.59%和1.24%的准确率。
3.3. 联合模型和分开的模型的对比
Joint Model根据不同有相应不同的表现,如下图所示: