论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》

核心思想

  本文提出利用语义信息对数据进行扩充的方法,来解决小样本学习问题。之前采用数据增强或者说数据集扩充方式的小样本学习算法,通常都是在图像级别或者说特征空间里进行扩充,但本文利用编码TriNet将特征空间映射到语义空间中,并在此进行数据增强,然后利用解码TriNet将扩充后的语义信息还原到特征空间,再进行分类。整个算法的流程如下图所示
论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》
  首先,输入图像IiI_i会经过一个采用ResNet-18结构的特征提取网络fΩf_{\Omega},该特征提取网络包含四个残差块,输出的特征图为fl(Ii)f_l(I_i)ll表示第ll个残差块。然后每个残差块的输出都依次输入到编码TriNet网络gEncg_{Enc}中,如上图所示,编码器会融合多个层级网络的输出,并最终利用全连接层将其映射到语义空间中得到语义特征向量u^zi=gEnc(fl(Ii))\hat{u}_{z_i}=g_{Enc}(f_l(I_i)),在这里就可以对语义特征进行扩充了,作者提出了两种扩充方式:语义高斯(Semantic Gaussian,SG)和语义邻域(Semantic Neighbourhood,SN)。其中语义高斯就是将高斯噪声引入语义特征中,具体而言就是以语义特征gEnc(fl(Ii))g_{Enc}(f_l(I_i))为均值,以σ\sigma为方差构建高斯分布,然后从中进行随机采样作为扩充后的语义特征vziGv_{z_i}^G
论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》
语义邻域则是在一个已经训练好的词向量空间中,找到与语义特征向量u^zi=gEnc(fl(Ii))\hat{u}_{z_i}=g_{Enc}(f_l(I_i))最接近的一些向量,并从中进行采样
论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》
  完成语义特征扩充后,利用解码TriNet网络gDecg_{Dec}对扩充后的语义特征vziv_{z_i}进行还原,也就是逐级恢复为图像特征f^l(Ii)=gDec(vzi)\hat{f}_l(I_i)=g_{Dec}(v_{z_i}),然后再将第ll层网络的输出f^l(Ii)\hat{f}_l(I_i)作为第l+1l+1层网络的输入,直至最后一层,将最终的特征图输入到分类器中得到分类结果,分类器可采用kNN,SVM和逻辑回归等形式。

实现过程

网络结构

  特征提取网络采用ResNet-18结构,编码和解码TriNet如图中所示主要使用多个卷积层和池化层构成。

损失函数

  损失函数包含两部分:分类损失J1(Ω)J_{1}(\Omega)和语义损失J2(Θ)J_{2}(\Theta)
论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》
分类损失就是采用交叉熵损失函数,无需介绍。语义损失计算方式如下
论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》
首先是约束每一层解码器恢复的图像特征f^l(Ii)\hat{f}_l(I_i)要与原特征信息fl(Ii)f_l(I_i)尽可能相似,其次编码器最终得到的语义特征u^zi\hat{u}_{z_i}要与真实的语义特征向量uziu_{z_i}尽可能接近,语义特征向量uziu_{z_i}是利用训练好的word2vec模型得到的。

创新点

  • 基于语义空间实现数据增强以解决小样本学习问题
  • 利用dual TriNet融合多层级图像特征信息,实现语义特征的编码和解码过程

算法评价

  本文是将语义特征信息和数据集扩充两种方式结合起来的方法,相比于在图像级别上进行数据增强,基于语义空间的数据增强方法其效果更好,例如在语义空间上的高斯扩充,最终能够获得非高斯的扩充效果。但我对这篇文章并不满意,抛开其思想和方法不谈,首先文章介绍中存在一个很令人疑惑的地方,就是如何将解码器的结果当作下一层网络的输入呢?就文中的介绍来看,整个网络只包含一个ResNet-18结构,那么如果我要获得语义特征必须已经得到四层ResNet-18网络的输出结果了,然后经过编码-扩充-解码操作,才能得到对应的特征信息f^l(Ii)\hat{f}_l(I_i),那此时如何再将其输入回原来的ResNet-18的网络中呢?这不存在逻辑矛盾吗?我想得到第2层网络的输入,我必须要已经获得全部四层网络的输出?有一种方法是,经过特征提取得到四层网络的输出,然后再将扩充后的特征信息f^l(Ii)\hat{f}_l(I_i)重新输入回对应的网络层中,那这样的话如何建立起各层之间的连接关系呢?另一种可能的方式是,每得到一层特征就进行编码-扩充-解码,然后再输入到下一层网络中,这样的话TriNet聚集多层级特征信息的作用就消失了。这一点我没能搞懂,去看源代码,结果作者只公开了关于ResNet-18+SVM的部分代码,对于整篇文章中最重要的语义扩充部分完全没有开源,这怎么能在摘要中说已经开源了代码和模型呢?而且作者的插图也与文章描述不太对应,本来第ll层的输出特征f^l(Ii)\hat{f}_l(I_i)应该作为第l+1l+1层的输入,但图中是对应第ll层;解码器进行恢复过程应该采用上采样或反卷积的形式进行尺寸恢复吧?但图中也没有标明。

如果大家对于深度学习与计算机视觉领域感兴趣,希望获得更多的知识分享与最新的论文解读,欢迎关注我的个人公众号“深视”。论文阅读笔记《Semantic Feature Augmentation in Few-shot Learning》