论文提出了类似于dropout作用的diversification block,通过抑制特征图的高响应区域来反向提高模型的特征提取能力,在损失函数方面,提出专注于top-k类别的gradient-boosting loss来优化训练过程,模型在ResNet-50上提升3.2%,算法思路巧妙,结构易移植且效果也不错,值得学习
论文:Fine-grained Recognition: Accounting for Subtle Differences between Similar Classes
在FGVC(fine-grained visual categorization)上,一般的深度学习模型都是通过学习输入图片到输出标签的映射,这样会导致模型倾向于专注少部分显著区域来同时区分模糊的种群内(inter-class)相似性和种群间(intra-class)的变化
如图1所示,一般的深度学习模型的attention经常密集地集中在小部分区域,因此只会提出有限的特征。因此,论文建议分散attention来构建多样的分布在特征图上的特征。因为在特征层面进行attention分散,在预测时则需要反过来,例如只关注最相似的类别来提高模型的辨别能力。通过关注相似的类别以及分散模型的attention,论文实际是在让模型避免对训练集的overfiting,增加泛化能力。论文的主要贡献如下:
论文提出的方法能简单地接到所有分类网络中,结构如图2所示。使用论文的方法,需要将主干网络的所有global pooling layer和最后的fully conntected layer替换成1x1 convolution,ouput channel等于类别数,模型主要包含两个部分:
考虑如图2中 C C C个类别的多标签分类任务, I I I为训练图片, l ∈ J , J = { 1 , 2 , . . . , C } l\in J, J=\{1,2,...,C\} l∈J,J={1,2,...,C}是对应的GT,diversification block的输入是类别特定(category-specific)的特征图 M ∈ R C × H × W M\in R^{C\times H\times W} M∈RC×H×W ,由修改后的主干网络输出。标记 M = { M c : c ∈ [ 1 , C ] } M=\{M_c : c\in [1,C]\} M={Mc:c∈[1,C]},其中 M c ∈ R H × W M_c\in \mathbb{R}^{H\times W} Mc∈RH×W是对应类别 c t h c^{th} cth的独立特征图。diversification block的核心思想是抑制 M M M中的明显区域,从而迫使网络去提取其它区域的特征,主要面临两个问题:1) 抑制哪些特征? 2) 怎么抑制?
下面解释如何产生用于指明抑制区域的mask,定义 B = { B c : c ∈ [ 1 , C ] } B=\{B_c : c\in [1, C]\} B={Bc:c∈[1,C]}, B c ∈ R H × W B_c\in \mathbb{R}^{H\times W} Bc∈RH×W是二值抑制mask对应特征图 M c M_c Mc,1表示抑制,0表示不抑制
首先对特征图的峰值进行随机抑制,因为这是对分类器最显著的部分, P c ∈ R H × W P_c\in \mathbb{R}^{H\times W} Pc∈RH×W是 M c M_c Mc的峰值mask,’*'是element-wise的相乘,而 r c r_c rc是服从伯努利分布的随机值,即有 p p e a k p_{peak} ppeak的概率为1
将每个 M c M_c Mc分成多个固定大小的patch,定义l行m列的patch为 M c [ l , m ] ∈ R G × G M_c^{[l,m]}\in \mathbb{R}^{G\times G} Mc[l,m]∈RG×G, G c G_c Gc为patch的集合
B c ′ ′ ∈ R H × W B_c^{''}\in \mathbb{R}^{H\times W} Bc′′∈RH×W对应 M c M_c Mc的抑制mask,跟峰值的mask一样,使用伯努利分布对块进行赋值,随机值为1的块将整块进行抑制, [ 0 , 1 ] ∈ R G × G [0, 1]\in \mathbb{R}^{G\times G} [0,1]∈RG×G
由于只考虑非峰值点,因此将峰值点的值设为0
最后将两种mask相加得到最后的抑制mask
M c ′ M_c^{'} Mc′为抑制后的特征图, α \alpha α为抑制因子,后面的实验设置为0.1
在进行特征抑制后,对特征进行global average pooling来获取最后的置信度 s ∈ R 1 × C s\in \mathbb{R}^{1\times C} s∈R1×C
diversification module用于发现更多不易察觉的细微特征,而gradient-boosting loss则是避免容易混淆的类别的误分
论文认为,目前使用最广的交叉熵损失函数平均地考虑了所有的负类别,而在细粒度分类中,模型更应该关注相似的负类别,因此提出gradient-boosting cross entropy(GCE),只专注于top-k个负类别
首先定义 J ′ J' J′为所有的负类别, J ′ = { i : i ∈ [ 1 , C ] ∧ i ≠ l } J'=\{i : i\in [1,C]\land i\neq l \} J′={i:i∈[1,C]∧i=l}, s ′ = { s i , i ∈ J ′ } s'=\{s_i, i\in J'\} s′={si,i∈J′}为所有负类别的得分, t k t_k tk为负类别的top-k类别集合,将 J ′ J' J′分别top-k集合和非top-k集合
对交叉熵进行改造,只考虑top-k类别的计算,k一般设置为15
公式13和公式14分别是交叉熵和GCE的梯度回传公式
根据公式10和公式11的定义,可以发现公式15的包含关系
因此可以推出GCE的梯度是要比交叉熵的梯度要大的,使用GCE能够让模型专注于区分混淆类别
diversification block仅在训练阶段使用,在测试阶段不再使用,改为将完整的特征图输入到global average pooling中
实验在5个最常用的数据机上进行
其中两个数据集的结果如表2、表3所示,可以看到,论文提出的方法在效果上的提升还是挺不错的,而且参数量比较小,在另外几个数据集上,论文提出的方法也是比其它方法要出色
使用diversification block能让ResNet-50的性能提升0.8%
如表4所示,使用gradient-boosting loss能让ResNet-50+DB从86.3%提升到87.7%,提升要比其它损失函数方法要好
从实验看出,抑制因子 α \alpha α对实验结果影响挺大的,选择0.1的时候表现最好
top-k的数量选择对结果影响也是比较大的,选择top-15的时候效果最好
从图5可以看出,论文提出的方法收敛速度更快,尽管可以看到原始方法在训练集上的准确率比论文提出的方法要好,但是在测试集的表现不好,这说明原始方法对训练集有点过拟合了
从图4可以看出,论文提出的方法提取了更多的特征区域
为了进一步验证论文提出的模型的效果,在ImageNet上进行了实验。由于论文的方法专注于难样本,因此在50轮后的训练才进行对比,可以看到论文的方法的效果在ImageNet上还是不错的
论文提出了diversification block以及gradient-boosting loss,diversification block通过随机抑制响应高的区域引导模型学习更多的不易察觉的特征,有点类似dropout的思想,而gradient-boosting loss则让模型专注于top-k个类别的学习,加大对应类别的梯度回传,使得训练收敛更快且提升性能。总体而言,论文的思路清晰,而且效果还是有的,可以实验下,然后当作基本方法加入到平时网络的架构中,特别是后面的gradient-boosting loss
写作不易,未经允许不得转载~
更多内容请关注 微信公众号/知乎专栏【晓飞的算法工程笔记】