少样本学习

深度学习是data hungery的方法, 需要大量的数据,标注或者未标注。少样本学习研究的就是如何从少量样本中去学习。拿分类问题来说,每个类只有一张或者几张样本。少样本学习可以分为zero-shot learning,即要识别训练集中没有出现过的类别样本,和one-shot learning/few shot learning,即在训练集中,每一类都有一张或者几张样本。

人类是有少样本学习的能力。以zero-shot learning来说,比如有一个中文 “放弃”,要你从i,your,she,them,abnegation 五个单词中选择出来对应的英文单词,尽管你不知道“放弃”的英文是什么,但是你会将“放弃”跟每个单词对比,而且在你之前的学习中,你已经知道了i,your,she,them的中文意思,都不是“放弃”,所以你会选择abnegation。

关于deep learning on few-shot leaning ,有比较多的研究。不过要明白的是,使用深度学习一定是要足够多的数据的,不管是样本增强,还是根据网络构造样本。这篇文章主要会介绍四种方法,都是分类问题:

(1)Siamese Neural Network

(2)Matching Network

(3)Prototypical Network

(4)Relation Network

孪生网络 - Siamese Neural Network

孪生网络的主要思想是学习一个网络,对于输入的两张图片,判断其是否是同类还是非同类,也就是一个二分类问题。孪生网络就是有两支对称的(相同)网络,各自输入一张图片,各自对其进行特征编码,论文中是编码为[1,4096]的特征向量,随后对这两个向量特征计算L1距离,对得到的[1,4096]的向量进行fully connect 至一维输出,0 or 1,不相同 or 相同。其中,要求对称或相同是因为p(x1,x2)与p(x2,x1)是相等的。

下图是网络结构,只画了其中一支网络,另一只是一样的,在倒数第二层结合了。

孪生网络

当网络做单样本学习的时候,也就是预测,孪生网络简单的分类一下测试图像与训练集的图像中哪个最相似就可以了:

需要指出的是,在训练时,采用逐对训练的话,将会有平方级别对的图像对来训练模型,这让模型很难过拟合,好酷。假设我们有E类,每类有C个样本。一共有 C⋅ E 张图片,总共可能的配方数量可以这样计算:

对于Omniglot中的964类(每类20个样本),这会有185,849,560个可能的配对,这是巨大的!然而,孪生网络需要相同类的和不同类的配对都有。每类E个训练样本,所以每个类别有

对,这意味着这里有

个相同类别的配对。 对于Omniglot有183,160对。即使 183,160对已经很大了,但只是所有可能配对的千分之一,因为相同类别的配对数量随着E平方级的增大,但是随着C是线性增加。这个问题非常重要,因为孪生网络训练的时候,同类别和不同类别的比例应该是1:1。或许,它表明逐对训练在那种每个类别有更多样本的数据集上更容易训练。

匹配网络-matching network

首先明确几个概念

(1)support set :每次训练的样本集合

(2)query set :用于与训练样本比对的样本,一般来说query set就是一个样本

(3)在support set中,如果有n个种类,每个种类有m个样本,那么这个训练过程叫

n -way m-shot ,如下图就是4-way 1-shot.

匹配网络
matching network 引入了注意力机制。以下是其核心步骤:

(1) 用g和f对图片提取特征向量,也可说是 embedding,f和g可以是相同的

(2)用query set样本的特征向量与support set 样本的特征向量一 一计算相似度,如余弦距离或者欧式距离。如果到了这步就停止的话就是简单的KNN了。

(3)如下公式,其中C就是距离度量函数。利用softmax对得到的距离度量进行归一化得到注意力矩阵

公式1
(4)如下公式,其中y(i)是support set中每个样本的标签。那么最终query set样本的预测结果就可以表达为下式,也就是利用注意力矩阵a对标签线性加权得到。

公式2
如果你了解attention机制就会发现,(3)(4)步就是用了很简单的attention机制。在这里,attenion论文中的F函数就对应于公式1,计算C(i)就对应于公式2.在NLP中,C(i)还只是计算y的一个输入,这里就已经是输出了,同时此处也不需要训练参数。这里的注意力机制,我们可以将其理解为一种特殊的联想记忆,在给定输入的情况下,我们“指向”支持集中的相应示例,检索其标签。

原型网络-Prototypical networks

Our approach, Prototypical Networks, is based on the idea that there exists an embedding in which points cluster around a single prototype representation for each class. In order to do this,we learn a non-linear mapping of the input into an embedding space using a neural network and take a class’s prototype to be the mean of its support set in the embedding space. Classification is then performed for an embedded query point by simply finding the nearest class prototype.
源论文中的这段话 已经指出了论文所提出的方法了。就是说,Prototypical Networks是基于这样一种思想,对于每个类别,都存在一个嵌入空间中的点,称为类的原型,每个样本的嵌入空间表示都会围绕这个点进行聚类。 为了做到这一点,即利用神经网络的非线性映射将输入映射到嵌入空间,并将嵌入空间中支持集的平均值作为类的原型。 预测分类的时候,就只需要比较跟支持集类别的哪个类的原型更近了。看看下面这幅图就更清楚了

简述一下几个训练过程:

(1)在所有的类别中随机选择K个类别的样本

(2)在K个类别的样本中,随机选择出每个类别的support set和query set,各M个

(3)通过CNN网络进行特征映射,并计算每个类的样本的特征向量平均值作为类原型,下图c(k)就是类原型。

(4)计算quert set 的特征向量与K个类原型的距离,并通过softmax归一化,得到

quert set 所属类别的概率分布。

关系网络-Relation Network

Relation Network 的 5-way 1-shot的结构见下图。 也是先利用一个 网络f 先将样本提取特征向量,然后用query set样本的特征向量与support set 样本的特征向量一 一进行特征拼接,再利用网络g计算相关评分,可以理解为query set样本与每个support set 样本的相似度。其中,relation module里进行特征拼接时,图上是按特征向量的depth进行拼接,当然还可以有其他的方法。

下图是更为详细的一个结构图。需要指出的是,最后一层的激活函数是signoid,而不是softmax,也就是仅仅独立的衡量了query set与每个support set样本的relation score.同时,损失函数采用的均方误差(MSE),引用论文中的话就是:MSE的选择有些不合标准, 我们的问题可能似乎是一个{0,1}的二分类问题, 然而从概念上讲,我们预测的是关系分数,尽管对于实际情况来说我们只能自动生成{0,1}个目标,但它可以被认为是回归概率模型。

这里的C-way K-shot 还有一个问题就是 , 对于K> 1的K-shot,就将每个训练类的所有样本的特征向量进行求和,以形成这个类的特征映射。 这个汇集的类级特征图与上面的查询图像特征图结合。 因此,对于一个查询集的关系分数的数量在ont shot还是 few shot 任务中总是为C.

可以看到这几个网络的方法都很类似(是不是有点水?)。以上几个网络的实验细节可以查看一下原论文。下图是关于多个few shot learning算法 在Omniglot数据集上的表现的比较。可以看到,relation-network是很start-of-art的。(文章如有错误请多多指出)

参考

(1)koch et al, Siamese Networks for one-shot learning

(2)Matching Networks for One Shot Learning

(3)Prototypical Networks for Few-shot Learning

(4)Learning to Compare: Relation Network for Few-Shot Learning

(5)Attention Is All You Need

你可能感兴趣的:(少样本学习)