论文阅读笔记《Dense Classification and Implanting for Few-Shot Learning》
核心思想
本文是对基于度量学习的小样本学习算法进行改进。常见的度量学习算法通常利用一个嵌入式网络对图像进行特征提取,然后利用一个线性分类器进行分类。在训练过程中得到的线性分类器权重可以看作对应每个类别的权值(class weights),在测试时,就比较查询图像对应的特征值与每个类别权值之间的相似性,并以此进行分类预测。二维图像经过特征提取后得到的特征信息是高维的张量,因此通常需要压缩维度,以便于计算相似性。常见的压缩维度的方式有两种:压平(Flattening)或者池化(Pooling).
图a所示的就是压平操作,就是将原本为维的张量,拉伸为维的张量,其中。这一方法具有较高的区分能力,但是不具备空间不变性。图b所示的是池化操作,利用全局平均池化将每个通道的特征图都压缩为一个值,得到一个长度为的特征向量。这一方式能够显著降低维度,并且具有空间不变性,但区分能力较差。本文提出一种称之为稠密分类(Dense classificatio)的方法,对于提取到的特征图不进行维度压缩,而是对空间中的每一点对应的特征向量进行分类预测。具体而言,假设特征提取网络最后一层输出了维度为的张量,那可以将其拆分成个长度为的特征向量,然后分别计算类别权重与之间的距离,对每个空间上的点都进行类别预测,如下图所示。
在元测试阶段,对于新类别的样本,通常是对已训练好的特征提取网络进行微调训练,以满足新类别样本特征表达的需要。在低层级的网络中特征信息的通用性较强,对于不同类别的样本都能提取到有用的信息,而随着网络的加深,在高层级的网络中,特征信息就具备较强的区分度,而不具备通用性了。因此本文提出一种称为“神经移植”(Neural Implants)的方法,针对高层级的特征提取网络进行改进,改进的结构如下图所示
如图所示,低层级的特征提取网络保持不变,在高层级的卷积层上增加一个新的分支,与原有的卷积层构成一个平行的结构。冻结原本高层级网络的权重,使其不再更新,以保留对于原有类别的特征提取能力,然后对于新类别的样本,其特征信息会分别经过两个分支网络,并且将原本高层级网络提取的特征图,与新添加的网络提取的特征图级联起来,作为新添加网络分支下一层的输入。最后得到新类别样本对应的特征信息。这一方法既消除了使用深层网络出现过拟合的问题,又提高了特征提取网络对于新类别样本的表征能力。
实现过程
网络结构
嵌入式特征提取网络采用ResNet-12
损失函数
如上文所述,计算损失要对空间中的每个点分别计算再求和,如下式
其中
表示scaled cosine similarity,计算过程如下
其中,,表示Frobenius内积,表示放缩系数。
训练策略
在元测试过程中,每次只选择一个样本作为查询样本,其余样本都作为支持集,类似《Few-Shot Learning with Localization in Realistic Settings》提出的留一交叉验证法
创新点
- 提出了稠密分类的方法,对空间中的每个点都进行分类预测,并计算损失,提高了分类的细粒度
- 提出了神经移植的方法,保留已训练好的网络参数,增加新的网络分支用于处理新的类别样本
算法评价
作者针对原有的小样本学习算法提出两点改进:稠密分类与神经移植。首先要说明的是,这两点改进都是针对元测试阶段,也就是网络已经在一个数据集上训练好了,目前要针对新的类别,且每个类别仅包含少量样本的情况进行微调训练。稠密分类的思想与DN4算法中提到的局部描述子的概念非常相似,都是通过增加分类的细粒度,不在图片级别上进行类别预测,而在像素(或超像素)级别上进行类别预测,如果细粒度进一步提高到对原图中每个像素进行类别预测,那么就成为语义分割任务了。而神经移植的思想有点类似于迁移学习的一些方法,只不过是在保留原有网络的基础上,对网络结构进行了“拓宽”,但是新增加网络分支的参数初始化怎么处理呢?如果是从随机状态开始训练,少量的数据集是否足够呢?
如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。