Meta learning
few-shot learning是meta learning中的一种。可将few-shot learning看做是meta leaning即可。
Meta learning 与 传统监督学习的区别
传统监督学习: 对于一个给定训练数据集,通过训练使模型可以识别训练数据集,并将其泛化到测试数据集中。要求测试数据集中数据标签类别包含在训练数据集中。 meta learning: 目的是让模型learn to learn,使模型可以区分不同的事物。意思是让模型自己学会学习。通过一张待测试图像,其类别不包含在训练数据集中,但包含在support set中,通过待测试图像与support set中每张图像计算他们之间的相似度,将与support set中相似度最高的类别作为query图像的类别,完成模型的预测。
Meta learning中的一些术语
Query:待测试图像 Support set:数据集相较于训练数据集很小,每类下只有几张图像,只在预测时为网络提供额外的信息,且Query图像的类别需在support set中。 Train set: 数据量大,每一类下存在多张图像,可以用此训练一个深度神经网络。 K-way:指support set中所具有的类别个数。随着类别数的提高,模型的预测准确率会降低。 N-shot:指support set中每一个类别中所存在的图像数量。随着图像数量的提高,模型的预测准确率也会提高。
Siamese Network解决few-shot learning
训练一个孪生网络(Siamese Network)来解决小样本检测(few-shot learning)的问题。使用相似度来做预测。通过query与support set中的每一张图像,使用相似度函数(similarity function)来计算其之间的相似度,最后完成模型的预测。
训练Siamese Network得到相似度函数(similarity function)
1、第一种训练Siamese Network的方法。 ① 构建正负样本。 正样本的构建:首先从训练数据集(train set)中随机抽取一张图像,然后从随机选择出图像的类别下再随机抽取一张图像,构成正样本,并将标签设置为1,代表相似度100%。 负样本的构建:从train set中随机抽取一张图像,然后删除该类别,从剩余的类别中再抽取一张图像,构成负样本,并将标签设置为0。
②训练神经网络 如果是正样本,将两张正样本图像分别用x1,x2来表示。x1和x2分别通过卷积神经网络(具有参数共享的同一个神经网络)进行特征提取,输出特征向量为好h1=f(x1), h2=f(x2)。 z=|h1 - h2| 用于表示两个特征向量之间的区别。将特征向量z通过全连接层(fc)输出一个标量,标量通过sigmoid得到0-1之间的数(网络的最终输出)。这个数(网络的输出)是用于衡量输入的两张图像之间的相似度(相同类别输出应接近1,不同类别输出应接近0)。将网络的输出与标签之间的差别记做损失函数,可以使用cross entropy来衡量标签与网络预测输出之间的差别,然后使用梯度下降来更新模型中的参数。 样本训练过程同上。负样本之间的标签为0.
③预测。构建support set(k-way n-shot)。其中的类别不包含在训练数据集中。输入query,其类别必须属于support set中的任意一个类别。将query与support set中的图像分别当做上面训练好的Siamese Network的输入,计算其相似度。逐一将query与support set中的所有图像都做对比,选择出相似度最大的support set中对应的图像的类别,作为query的预测类别。
2、第二种训练Siamese Network的方法。triplet loss.
① train set:从train set中每次选择三张图像。第一张图像是从train set中随机选择一张,作为anchor。第二章图像是从anchor所对应的类别中随机选取一张图,作为positive。第三张图像是从排除掉anchor对应类别的剩余图像中任意选择一张图像,作为negative。 ②将positive、anchor、negative图像分别记做x+,xa,x-,输入到神经网络中,得到特征向量f(x+),f(xa),f(x -). 分别计算positive、negative图像与anchor在特征空间上的距离。计算距离d+ = ||f(x+) - f(xa)||二范数的平方,距离d- = ||f(xa) - f(x-)||二范数的平方。 希望网络可以将相同类别的特征向量在特征空间中应尽可能的接近,而不同类别之间的特征向量在特征空间应尽可能的远离,因此求得的距离d,d+应该尽可能小,而d-应尽可能的大。 ③损失函数 对于positive sample在特征空间中应尽可能的接近anchor,即d+尽可能小。 对于negative sample在特征空间应尽可能的远离anchor,即d-尽可能大。 通过设定一个超参数margin,来区分正负样本。 若d- >= d+ + margin,即认为这组样本的分类结果正确,loss=0. 否则,loss = d+ + margin - d-. 整体损失函数为: Loss(xa, x+, x -) = max{0, d+ + margin - d-}
基于Siamese Network解决few-shot learning的思想
1、在大规模的数据集上训练一个Siamese Network,使Siamese Network学习到训练数据集中数据之间的异同。 2、使用Siamese Network将图像映射到特征空间中,解决few-shot learning问题。 3、构建support set。其中k-way代表k个类别,n-shot代表每个类中具有n张图像。support set中的类别不属于train set中的类别。 4、query图像作为预测图像。query与support set中的每张图像计算距离,距离最近的类别为query的预测类别。
Fine-tune
在大规模数据集上预训练模型,然后在小规模数据集(support set)上做微调(fine-tune)。 1、(xj,yj)为support set中的一个样本。其xj为图像数据,yj为图像所对应的标签。 2、 pretrain model: 将图像映射成特征向量。 3、 softmax classifier: pj=softmax(W * f(xj) + b). 输出为pj的概率分布。W的每一行对应support set中的类别数,其值为每一个类别中所有图像所求得的特征向量的做平均后的均值向量。pj的维度为support set中的类别数,其中的每个元素为对应support set中类别的概率值。pj中的元素用于反应query图像的特征与support set中图像特征之间的相似性。
若不使用fine-tune,W,b为固定的值,W=M, b=0. 其中M为support set中每一个类别所对应的均值向量。 均值向量: 对support set中每一类的所有样本通过神经网络后得到的特征向量求平均得到。
使用fine-tune,通过support set更新W,b。 使用交叉熵损失函数(cross Entropy)衡量真实标签yj与预测输出pj之间的差别。 min∑ j Cross Entropy(yj, pj). 该公式为对于support set中每一个样本都会产生一个预测输出与真实值计算得到一个cross entropy loss,将得到的所有loss求和作为目标函数。通过最小化这个函数,以此来使得模型的预测输出接近真实标签,来优化W,b。
由于support set数据量规模很小,因此需加入正则化项或者合理的参数初始化,来防止模型过拟合,提高模型的准确率。
1、参数初始化: 在神经网络中初始化操作通常使用随机初始化,但由于support set数据量很小,随机初始化操作并不适用于此。在few-shot learning中,W,b的初始化通常设置为W=M,b=0作为该分类器的初始化,以此为基础来训练这个分类器。M为support set中每一个类别所对应的均值向量。
2、正则化项来防止模型过拟合。 Entropy Regularization:将query图像记为x。通过神经网络得到特征向量f(x). 概率分布P=softmax(W*f(x) + b)。 使用Entropy计算P中每个元素所包含的信息量,公式如下: H§ = -∑i pi log(pi). pi为p中的第i个元素。 对于每一个query图像都求一个entropy,将所有的entropy求和再取平均即为Entropy Regularization。目的是希望Entropy Regularization越小越好。
3、将Wf(x)的内积替换为Cosine Similiarity。即Sim(W, f(x)). Sim(W, f(x))=Wf(x) / (||W||2 * ||f(x)||2). Cosine Similiarity就是在求内积之前对W和f(x)做归一化,也就是将两个向量的二范数归一化成1.
|