作者:黎槟华 耿瑞莹 李永彬 孙健
单位:云小蜜Conversational AI团队
随着深度学习和自然语言处理技术的发展,很多公司都在致力于发展人机对话系统,希望人和机器之间能够通过自然语言进行交互。笔者所在的小蜜北京团队打造了一个智能对话开发平台--Dialog Studio,以赋能第三方开发者来开发各自业务场景中的任务型对话,而其中一个重要功能就是对意图进行分类。大量平台用户在创建一个新对话任务时,并没有大量标注数据,每个意图往往只有几个或十几个样本,那如何使用现有的少量样本构建意图分类模型呢?面对这类冷启动问题,我们提出使用小样本学习(few-shot learning)来解决对话平台中的意图识别冷启动问题。关于few-shot learning的系统知识和最新进展情况,请参考我们之前的综述,本文主要详细介绍我们的工作:首先总结前人工作提出了Encoder-Induction-Relation的Few-shot Learning Framework,然后融合capsule network和dynamic routing,提出了Induction Network,在两个小样本文本分类数据集上,都做到了state-of-the-art。
问题定义
人类非常擅长通过极少量的样本识别一类物体,比如小孩子只需要书中的一些图片就可以认识什么是“斑马”,什么是“犀牛”。在这种人类的快速学习能力的启发下,我们希望模型在大量类别中学会通过少量数据正确地分类后,对于新的类别,我们也只需要少量的样本就能快速学习,这就是Few-shot learning 要解决的问题。
Few-shot learning是meta learning在监督学习领域的一种应用场景,我们training阶段将数据集按类别分解为不同的meta-task,去学习类别变化的情况下模型的泛化能力,在testing阶段,面对全新的类别以及每个类别仅有少量数据,不需要变动已有的模型,就可以完成分类。
形式化来说,few-shot的训练集中包含了大量的类别,每个类别中有少量样本。在训练阶段,会在训练集中随机抽取C个类别,每个类别K个样本(总共C×K个数据)构建一个meta-task,作为模型的支撑集(Support set)输入;再从这C个类中抽取一批样本作为模型的预测对象(Query set或者Batch set)。即要求模型从C×K个数据中学会如何区分这C个类别,这样的任务被称为C-way K-shot问题。
训练过程中,每轮(episode)都会采样得到不同meta-task的,即包含了不同的类别组合,这种机制使得模型学会不同meta-task中的共性部分,比如,如何提取重要特征及比较样本相似等,忘掉meta-task中领域相关部分。通过这种学习机制学到的模型,在面对新的未见过的meta-task时,也能较好地进行分类。详情见Algorithm 1.
Few-shot Learning 框架
Few shot learning中较为热门的方法大多是metric-based,即通过类别中少量样本计算得到该类别的表示,然后再用某种metric方法计算得到最终的分类结果。下面简单的介绍现有的相关方法。
Siamese Network
如图1所示,孪生网络(Siamese Network)[1]通过有监督的方式训练孪生网络来学习,然后重用网络所提取的特征进行one/few-shot学习。具体的网络是一个双路的神经网络,训练时,通过组合的方式构造不同的成对样本,输入网络进行训练,在最上层通过样本对的距离判断他们是否属于同一个类,并产生对应的概率分布。在预测阶段,孪生网络处理测试样本和支撑集之间每一个样本对,最终预测结果为支撑集上概率最高的类别。
Match Network
相比孪生网络,匹配网络(Match Network)[2] 如图2所示,它为Support集和Batch集构建不同的编码器,最终分类器的输出是支撑集样本和query之间预测值的加权求和。该网络在不改变模型的前提下能对未知类别生成标签,同时提出了基于memory和attention的matching nets,使得可以快速学习。此外该文章还使整个任务遵循传统机器学习的一个原则,即训练和测试是要在同样条件下进行的,提出在训练的时候不断地让网络只看每一类的少量样本,这使得训练和测试的过程是一致的。这一点也使得后续文章都会基于这样的方式进行训练和测试。
Prototype Network
原型网络(Prototype Network)[3]基于这样的想法:每个类别都存在一个原型表达,该类的原型是support set在embedding空间中的均值。然后,分类问题变成在embedding空间中的最近邻。如图3所示,c1、c2、c3分别是三个类别的均值中心(称Prototype),将测试样本x进行embedding后,与这3个中心进行距离计算,从而获得x的类别。
文章采用在Bregman散度下的指数族分布的混合密度估计,文章在训练时采用相对测试时更多的类别数,即训练时每个episodes采用20个类(20 way),而测试对在5个类(5 way)中进行,其效果相对训练时也采用5 way的提升了2.5个百分点。
Relation Networks
前面介绍的几个网络结构在最终的距离度量上都使用了固定的度量方式,如cosine,欧式距离等,这种模型结构下所有的学习过程都发生在样本的embedding阶段。而Relation Network[4]认为度量方式也是网络中非常重要的一环,需要对其进行建模,所以该网络不满足单一且固定的距离度量方式,而是训练一个网络来学习(例如CNN)距离的度量方式,在loss方面也有所改变,考虑到relation network更多的关注relation score,更像一种回归,而非0/1分类,所以使用了MSE取代了cross-entropy。
Few-shot Learning Framework
回顾上述方法,从表1中可以看出,现有的方法在表示新的类别时只是通过简单对样本向量加和(Relation Net)或求平均(Prototype Net),在这种情况下,由于自然语言的多样性,同一个类的不同表述只有一部分是和类别的内容相关,其他部分则随每个人的语言习惯而产生较大的变化,所以很多关键信息都会丢失在同一个类的不同表述产生的噪音之中。比如,在运营商领域,同样是表述“换套餐”的意图,既可以说的简单明了:“我想换套餐”,也可以说的十分繁琐:“我想下个月换套餐,就是把原本不需要的套餐取消掉,换个便宜的…”。如果只是对不同话术简单加和,那么和分类无关的信息就会产生累积,进而影响分类的效果。
与大量样本的监督学习不同,噪音问题会在few shot learning中变得更为明显,因为在监督学习的大量样本下,某个类别的数据中关键信息和噪音的比例悬殊,模型容易区别哪些是噪声(例如:词或n-gram),哪些是有效信息(例如:业务关键词或句式),相反few shot learning仅有少量样本,很难用简单的机制来捕获这样的信息,因此显式建模类别表示的步骤是非常有意义的,具体的实现细节在下文会详细描述。
所以更好的学习方法应该是建模归纳类别特征的能力:忽略掉和业务无关的细节,从样本级别多种多样的表达之中总结出类别的语义表示。因此,我们需要站在一个更高的视角,去重构支撑集中不同样本的层次化语义表示,动态的从样本信息中归纳出类别特征。在本工作中,我们提出了Induction Network,通过将动态路由算法与meta learning机制结合,显式建模了从少量样本中归纳出类别表示的能力。
首先,我们团队总结了metric-based方法的的共性,提出了Encoder-Induction-Relation的三级框架[5],如图5所示,Encoder模块用于获取每个样本的语义表示,可以使用典型的CNN、LSTM、Transformer等结构,Induction模块用于从支撑集的样本语义中归纳出类别特征,Relation模块用于度量query和类别之间的语义关系,进而完成分类。
如表1所示,之前的工作往往致力于学习不同的距离度量方式,而忽视了对样本表示到类别表示的建模。而在自然语言当中,由于每个人的语言习惯不同,同一个类别的不同表述往往有很多种,如果仅仅是简单加和或取平均来作为类别的表示,这些与分类无关的干扰信息就会累加,影响最终的效果,因此我们的工作显式的建模了从样本表示到类别表示这一能力。
Few-shot learning意图识别模型
如图6所示,我们的模型基于Encoder-Induction-Relation的三级框架,其中Encoder模块使用基于自注意力的Bi-LSTM,Induction 模块使用动态路由算法,Relation模块使用神经张量网络。
Encoder模块
本工作共使用bi-lstm self-attention建模句子级别的语义,输入句子的词向量矩阵,经编码得到句子级的语义表示e。
Induction 模块
将支撑集中每个样本编码为样本向量以后,Induction模块将其归纳为类向量
这一过程中我们将支撑集中的样本向量视为输入胶囊,经过一层dynamic routing变换后,输出胶囊视为每个类的语义特征表示。
首先,是对所有样本做一次矩阵转换,意味着将样本级的语义空间转换到类别级的语义空间,在此过程中我们对支撑集中所有的样本向量使用同一个转换矩阵,如此对于任意规模的支撑集都能进行处理,也就意味着我们的模型可以应对any-way any-shot的场景。
然后,通过dynamic routing的方式过滤无关信息,提取类别特征。在每次dynamic routing的迭代中,我们动态的调整上下两层之间的连接系数并确保其加和为1:
其中b_i连接系数的逻辑值,在第一次迭代时初始化为0。对于给定的样本预测向量,每个候选类向量如下:
然后使用一个非线性的squash函数来保证每个类向量的模长不超过1:
每次迭代的最后一步是通过“routing by agreement”的方式来调节连接强度,如果产生的类候选向量和某样本预测向量之间有较大的点乘结果,则增大他们之间的连接强度,否则减小之。
通过这种动态路由的方式建模样本向量到类别向量的映射过程,能够有效过滤与分类无关的干扰信息,得到类别特征,详情见Algorithm 2。
Relation 模块
我们通过Induction模块得到支撑集中每个类别的类向量表示,通过Encoder模块得到Batch set中每个query的向量,接下来要做到就是衡量二者之间的相关性。 Relation 模块是典型的neural tensor layer,首先通过三维tensor建模每个类向量和query向量对之间的交互关系,然后使用全连接层得到关系打分。
目标函数
我们使用最小平方损失来训练我们的模型,将关系打分回归至真实标签:匹配的类和query对之间的打分趋向于1而不匹配的打分趋向于0。在每个episode中,损失函数定义如下:
我们使用梯度下降法更新Encoder、Induction和Relation三个模块的参数。训练完成之后,我们的模型在识别全新的类别时不需要任何finetune,因为在meta 训练阶段已经赋予了模型足够的泛化能力,而且会随着模型的迭代不断累加。
实验
我们在两个few-shot文本分类的数据集上验证模型的效果,所有的实验使用tensorflow实现。
数据集
ARSC数据集由Yu 等人[6]在NAACL 2018提出,取自亚马逊多领域情感分类数据,该数据集包含23种亚马逊商品的评论数据,对于每一种商品,构建三个二分类任务,将其评论按分数分为5、4、 2三档,每一档视为一个二分类任务,则产生233=69个task,然后取其中12个task(43)作为测试集,其余57个task作为训练集。
ODIC数据集来自阿里巴巴对话工厂平台的线上日志,用户会向平台提交多种不同的对话任务,和多种不同的意图,但是每种意图只有极少数的标注数据,这形成了一个典型的few-shot learning任务,该数据集包含216个意图,其中159个用于训练,57个用于测试。
参数设置
预训练词向量使用300维glove词向量,LSTM隐层维度设为128,dynamic routing的迭代器爱次数设为3,Relation模块的张量数h=100。我们在ARSC数据集上构建2-way 5-shot的模型,在ODIC数据集上C和K在[5,10]中选取得到四组实验。在每个episode中,除了为支撑集选取K个样本以外,我们还为采到的每个类再采20个样本作为query set,也就是说在5-way 5-shot 场景下每次迭代训练都会有55+520=125个样本参与训练。
实验结果
在ARSC和ODIC数据集上实验结果如表2和表3所示,
由表2可知,我们提出的Induction-Network-Routing比ROBUSTTC-FSL正确率高出3%,他们是这个数据上之前的state-of-the-art。这是因为ROBUSTTC-FSL试图在样本层面构造一个足够鲁棒的度量方法,所以将多种度量方式进行组合,这种方法无法摆脱同一个类别中不同表述所产生的干扰。
在ODIC数据集上,我们提出的Induction-Network-Routing模型在四个不同的实验设置中都取得了最好的效果,通过表1可以看到,在Encoder使用相同结构的情况下,我们的模型通过建模class级别的归纳能力和更复杂的距离度量方式,取得了最好的结果,进一步的,我们通过比较不同的Induction方式,最终选取了Dynamic Routing的方式来构建样本级到class级的归纳表示能力。
如表1所示,我们将基于metric的方法都纳入Encoder-Induction-Relation框架中,可以发现之前的工作往往致力于学习不同的距离度量方式,而忽视了对样本表示到类别表示的建模。而在自然语言当中,由于每个人的语言习惯不同,同一个类别的不同表述往往有很多种,如果仅仅是简单加和或取平均来作为类别的表示,这些与分类无关的干扰信息就会累加,影响最终的效果,因此我们的工作显式的建模了将样本表示归纳为类别表示的能力,并超过了之前的state-of-the-art的模型。
实验分析
我们进一步分析转置矩阵的影响和模型对encoder模块的影响。
转置矩阵的作用
在5-way 10-shot场景下,我们用t-sne降维并可视化经过transformation转置矩阵前后支撑集样本的变化,如图所示,可以发现经过转置矩阵之后的支撑集样本向量可分性明显变好。这也证明了矩阵转置过程对于转换样本特征到类别特征的有效性。
Query 可视化
我们发现Induction Network不仅能够生成质量更高的类向量,而且可以帮助encoder模块学习更好的样本语义表示。通过随机抽取5个测试集的类别,并将其中所有样本Encoder之后的向量可视化,我们发现Induction Network中学到的样本向量可分性明显高于Relation Network,这说明我们的Induction模块和Relation模块通过反向传播给了Encoder模块更为有效的信息,使其学到了更易于分类的样本表示
结论
在本工作中,我们提出了Induction Network 来解决少样本文本分类的问题。我们的模型重构支撑集样本的层次化语义表示,动态归纳出类别的特征表示。我们将动态路由算法和meta learning的框架结合,模拟了类人的归纳能力。实验结果表明我们的模型在不同的少样本分类数据集上都超过了当前的state-of-the-art模型。
参考文献
[1] Koch, Gregory, Richard Zemel, and Ruslan Salakhutdinov. "Siamese neural networks for one-shot image recognition." ICML Deep Learning Workshop. Vol. 2. 2015.
[2] Oriol Vinyals, Charles Blundell, Tim Lillicrap, Daan Wierstra, et al. Matching networks for one shot learning. In Advances in Neural Information Processing Systems, pages 3630–3638, 2016.
[3] Snell, Jake, Kevin Swersky, and Richard Zemel. "Prototypical networks for few-shot learning." Advances in Neural Information Processing Systems. 2017.
[4] Sung, Flood, et al. "Learning to compare: Relation network for few-shot learning." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2018.
[5] Geng R, Li B, Li Y, et al. Few-Shot Text Classification with Induction Network[J]. arXiv preprint arXiv:1902.10482, 2019.
[6] Yu, Mo, et al. "Diverse few-shot text classification with multiple metrics." arXiv preprint arXiv:1805.07513