小样本学习(few-shot learning)在文本分类中的应用

 1,概述html

  目前有效的文本分类方法都是创建在具备大量的标签数据下的有监督学习,例如常见的textcnn,textrnn等,可是在不少场景下的文本分类是没法提供这么多训练数据的,好比对话场景下的意图识别,这个时候若是咱们还以传统的深度学习模型+softmax的形式来分类的话,是极容易陷入过拟合的状态。所以就有不少人研究在少许样本下如何建模。one-shot learning,few-shot learning,甚至是zero-shot learning都是旨在解决这类的问题。git

  本篇博客将会介绍下几种比较经典的one-shot learning或者是few-shot learning。github

 

2,模型介绍算法

       接下来咱们来介绍几篇经典的文章,来看看都是怎么去作few-shot learning或者one-shot learning的。但由于大部分文章中的例子都是在图像领域的,所以不会很细的去描述模型的结构,应用到文本中这些结构能够本身去选择,在这里会侧重讲述其作法,代码实现见https://github.com/jiangxinyang227/few_shot_learning。数据集采用的是由阿里巴巴团队整理出来的ARSC数据集。网络

 

  论文一:Siamese Neural Networks for One-shot Image Recognition
  这篇论文的主体结构是孪生网络(Siamese Network),以前的一片博客有专门介绍过孪生网络,详情见
孪生网络(Siamese Network)在句子语义类似度计算中的应用。这一篇介绍下孪生网络在one-shot learning中的应用。函数

  假定你如今对孪生网络结构有个清晰的了解,咱们如今来看看是怎么用孪生网络作one-shot learning的。咱们给定三份数据集,用于训练的train set,用于测试时的support set,query。post

  train set包含M个类别,每一个类别下有N个样本,咱们如今随机从每一个类别下去采样,从同一类别下采样相同的两个句子做为正样本,从不一样的类别下采样两个句子做为负样本,保证正负样本对的数量为1:1。而后输入到孪生网络中做为一个二分类的任务来度量两个句子之间的距离。学习

  在本论文中的度量方式用的是曼哈顿距离,并采用了加权和的方式来加权,加权系数是经过网络本身学习的,其表达式以下:测试

    

  上面式子中$h_{1, L-1}^{(j)},h_{2, L-1}^{(j)}$分别表示第一个句子和第二个句子最终的向量表示,$\alpha_j$是上面两个向量相减后获得的向量的第$j$个值得系数,这个值是经过网络本身学习获得的,$\sigma$表示sigmoid函数,输入一个0-1之间的几率值。优化

  上面说到经过这种采样方式将问题转化成一个0,1的二分类问题,所以损失函数能够采用二元交叉熵损失函数。

    

  论文中也给出了本身的优化算法:

    

  引入了动量和正则,不过这里的正则的做用是什么,我不太清楚。

  one-shot learning在测试阶段是怎么实现的呢?具体以下:

  首先在给定的测试时的support set,support set是一个C个类别(原则上这C个类别和train set中的M个类别是不相交的,这样才符合one-shot learning的本质),且每一个类别下只有一个样本的数据集,如今给定一个query,将query和support set中的样本输入到孪生网络中,获得query和每一个样本之间的几率分数,在这里由于是one-shot,所以support set中每一个样本表示一个类别,而后取几率分数最大的类别做为输出类别,表达式以下:

    

  上面式子中$P^{(c)}$表示query和support set中的样本的几率分数。

 

  论文二:Prototypical Networks for Few-shot Learning
  原型网络(Prototypical Network)中引入了一个混合密度估计的思想,用few-shot样本集的均值来表示该类别的向量,咱们来看看具体的作法
  给定一个训练时的train set,测试时的support set和query。support set 包含C个类别,每一个类别下含有K个样本。train set 包含M个类别,每一个类别下含有N个样本。为了在训练时期模拟测试时的场景,咱们在训练时构造一系列的episode,每一个episode实际上就是一个meta task。那该怎么构造这样一个episode呢?从train set中随机抽取C个类别,而后从每一个类别中随机抽取K个样本,构造训练时期的support set,这样的问题也称为C-way K-shot问题,接着从另外N-K个样本中选取n个样本做为训练时期的query。构造一系列这样的episode来训练网络。其具体的结构能够描述以下:

  1)embedding层,将训练时的support set和query embedding成向量表示

  2)特征提取层,这里能够用LSTM来提取句子的高层特征

  3)针对support set作的类的向量表示层,其实就是对每一个类中的K个样本取平均来表示这个类

    

    上面式子中$f_{\phi}(x_i)$表示support set中第$i$个样本的向量表示,$k$表示第$k$个类别。

  4)计算query和每一个类别之间的分数

    

    上面式子中$f_{\phi}(X)$表示query的向量表示,$d(.)$是一个距离度量函数,上面整个式子是一个softmax函数,获得query和每一个类别的几率分数。

  真个算法流程图以下:

    

  整个算法原理图示化:

    

  如上图所示,整个模型也是能够很好的迁移到zero-shot,one-shot的任务上的。

  到了这里还有一个问题,就是距离度量函数$d(.)$该怎么选择,上面咱们说到是经过计算类别下全部样本的均值来表示该类别,文章中引入了Bregman 散度的概念,Bregman 散度认为:达到与指定点(query)最小距离的点为样本均值点,也就是说当咱们的度量函数$d(.)$选择Bregman 散度时,用样本均值来表示类向量是最佳选择,而欧式距离的平方就是一种Bregman 散度。所以本文的距离度量函数是欧式距离的平方:

    

  上面添加的负号是将求距离最小转换成求距离最大。

  测试的时候和训练时的episode中的操做同样,将测试时的support set 和query输入到模型中,而后计算query和每一个类别的几率分数,选择最大的几率值的类。

 

  论文三:Learning to Compare: Relation Network for Few-Shot Learning

  这篇论文中提出了关系网络(Relation Network)的概念。整个训练和预测时的方法和上一篇的原型是同样的。其主要创新点在于以前的网络都会给定一个肯定的距离度量函数,然而做者认为没有一个肯定的距离函数能做为全部类别的最佳度量函数,所以做者让网络本身去学习一个这样的度量函数,这里的Relation network就是经过关系网络来度量query和各种别之间的关系。

  其网络结构图以下:

    

  在这里是一个图像分类的例子,转换到文本上只要更改第一个embedding module。在这个模块以后有一个relation module模块,这个模块就是度量query和每一个类别的关系分数的。

  假设support set总共有C个类别,以one-shot为例,其关系分数表达式以下:

    

  上面式子中$x_i$表示support set中第$i$个样本,由于是one-shot,因此一个样本表示一个类别,所以$f_{\varphi}(x_i)$表示的是第$i$个类别的向量,$f_{\varphi}(x_j)$表示的是query中第$j$个样本的向量。

  而转换到few-shot的场景下,论文这里是经过对样本向量求和的方式来表示类向量。由于关系网络获得是一个关系分数,所以做者认为用回归的方式来训练网络更合适,所以这里的损失函数是均方偏差,表达式以下:

    

  真实的标签仍是0和1,用计算出来的关系分数和0,1计算均方偏差。

 

  论文四:Few-Shot Text Classification with Induction Network

  这篇论文是阿里小蜜团队提出的,并成功用在了他们的对话平台中,用来作少样本的意图识别。总体的训练方式和上面两篇论文一致,可是在类向量的表示上再也不是简单的求均值或者求和,此外也引入了关系网络来计算query和类别之间的关系分数。

  训练模型的算法以下:

    

  和上面的训练方式基本一致。

  首先来看下整个网络结构图:

    

  整个网络结构由三个模块组成:Encoder Module,Induction Module,Relation Module。咱们接下来一一介绍这三个模块:

  1)Encoder Module

  这个模块就是对输入的样本提取高层特征,用向量来表示它们。

   在这里用的方法就是Bi-Lstm + attention的方式,这个作NLP的基本都很清楚,就不详述。

  2)Induction Module

  这里也是整个论文的创新点,提出用胶囊网络(Capsules Network)来动态的表征类向量,首先胶囊网络是有Hinton提出的,关于胶囊网络具体的描述见看完这篇,别说你还不懂Hinton大神的胶囊网络,capsule network。在这里经过动态路由算法来获得某个类别下不一样样本对类向量的贡献,简单理解和attention中的加权和相似,因此后面做者也给出了基于attention的方法来表示类向量的实验结果,可是效果较胶囊网络要差一些。

  首先将Encoder Module获得的support set的结果表示为$e^s$,query的结果表示为$e^q$,具体的流程以下:

  (1)首先用一个矩阵将$e^s$映射到另外一个空间,做者认为这一步很重要,能够起到相似聚类的效果,将相同的样本映射到一个相同的子空间中,做者给出了转换先后可视化图的对比

    

    能够看到矩阵映射以后类别之间的界面更加明显,此外也和论文三作了对比:

    

    能够看到本论文提出的Induction Network在类别聚合上的效果更好。

    这个映射转换的公式以下:

      

  (2)对动态路由的值归一化

    

    上面的$i$表示第$i$个类

  (3)加权和获得类向量

    

  (4)通过激活函数squash函数,获得新的类向量

    

  (5)更新动态路由值

    

    这里的更新方式确保了和类向量相近的样本向量对应的路由值会增大,即$e_{i, j}^s$ 和 $c_i$的点积大,则$b_{i, j}$就大,在迭代计算$c_i$的时候,样本$j$的贡献就大。

    动态路由值在一开始会所有初始化为0,通过softmax后能够认为全部的样本对类向量的贡献是同样的,通过迭代能够获得新的动态路由值。在这里的迭代次数为3,整个Induction Module的算法以下:

    

  3)Relation Module

  关系模块就是来度量query和类别之间的关系分数的,其计算公式以下:

    

    

  最后的损失函数也是采用了均方偏差。

    

 

参考文献:

Siamese Neural Networks for One-shot Image Recognition

Prototypical Networks for Few-shot Learning

Learning to Compare: Relation Network for Few-Shot Learning

Few-Shot Text Classification with Induction Network 

数据集来源:Mo Yu, Xiaoxiao Guo, Jinfeng Yi, Shiyu Chang, Saloni Potdar, Yu Cheng, Gerald Tesauro, Haoyu Wang, and Bowen Zhou. 2018. Diverse few-shot text classification with multiple metrics

相关文章
相关标签/搜索