首先需要明确的是少样本领域的数据划分和大规模监督学习方法的数据划分不一样。在大规模监督学习方法中,训练集和测试集是混合后按比例随机切分,训练集和测试集的数据分布一致。以分类问题为例,切分后训练集中的类别和测试集中的类别相同,区别是样本数量不同。但是,在少样本领域,训练集和测试集是不交叉的,也就是说测试集中的类别在训练集中没有出现。
N-way K-shot是指测试集中有N个类别,每个类别有K个样本。对训练集中的类别和样本数量没有限制,但是在训练过程中每次迭代需要遵守N-way K-shot设置。上文提到训练集需划分为support set和query set,但是实际上,我们是在每个batch中,从训练集中采样N个类别,每个类别采样K+Q个样本。然后将这个batch的数据分为support set和query set,其中support set包含N个类别,每个类别K个样本,query set包含N个类别,每个类别Q个样本。
训练集中的类别和样本数量没有限制。这好像和少样本场景不符,但是测试集是N-way K-shot,并且类别和训练集不交叉。少样本模型的目的就是learn to learn,不管在训练集上如何训练,使用多少数据,最终还是要在测试集上测试。在测试集上测试是不会反向传播更新参数的,测试过程和训练过程一样,只是不需要计算损失和更新参数。在训练时保持N-way K-shot设置就是为了模拟测试集环境,而不是说训练集只有N*K个样本。顺便提一下,在测试时,测试集也需要划分support set和query set,其中support set需要符合N-way K-shot定义,这也是N-way K-shot的真正含义!对query set的样本数量没有限制,只需要类别和support set保持一致即可。
下面是一个few-shot learning 的示意图:
总结一下就是,训练和测试时的类别是不一样的,训练的目的是使得模型具有一定的先验知识,这种先验知识可以通过预训练的方式获取。然后在正式训练的时候通过support set 和 query set对比误差的方式 更新模型参数,从而在测试的时候通过对比图片的相似度来达到学会学习的目的,这也是少样本学习的最终目的。