BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition
一、背景介绍
1.长尾效应
长尾分布比较常见,指的是数据集中少量类别占总数据集比重较大。如果使用带有长尾分布的数据集去直接训练分类网络的话,就会导致对于占比较大的类别能够较好的预测,占比较小的类别不能够较好的预测。这样做,模型整体性能就会下降。
2.问题
常见的解决长尾效应的方法有resampling(采样)和cost-sensitive re-weighting(给损失函数添加权重)——这两个统称class re-balancing方法。
- resampling:over-sampling——重复采集少类数据,可能会导致对少数类的过拟合。under-sampling——放弃主要类别数据,削弱深度网络泛化能力。
- re-weighting:通常在损失函数中为尾类的训练样本分配较大的权重。
通过采用class rebalancing方法可以更改训练集逼近测试集的分布并且使得训练更加关注尾部类别,这也就是为什么class rebalancing方法可以改善长尾效应。
然而,尽管重新平衡方法具有良好的最终预测,但我们认为这些方法仍然有不利影响,即它们也会在一定程度上意外地损害学习到的深层特征(即表示学习)的表示能力。具体来说,重采样存在尾部数据过拟合(通过过采样)的风险,并且在数据不平衡极度时也存在欠拟合整个数据分布(通过欠采样)的风险。对于重新加权,它会通过直接改变甚至反转数据呈现频率来扭曲原始分布。
作者通过实验论证了上述观点。具体做法为首先任意选取一个分类网络,将其分为两部分:特征提取部分+分类层,接着使用三种方法训练该网络,三种方法分别为正常训练、resampling、re-weighting。这样我们便得到了分别用三种方法训练得到的分类网络,选取其特征提取部分并固定住,然后从头开始训练整个分类网络(此时特征提取部分参数不再变化,就像迁移学习中的冻结网络)。然后继续使用三种方法训练得到上图的实验结果。从实验结果不难看出当时用resampling和re-weighting使得最终模型的分类性能提高但是特征提取能力变低。(感觉这里度量特征提取部分性能的方法有点怪怪的,作者采取的方式是如果特征提取层提取到的特征性能较好,那么使用相同的训练分类层方法训练得到的整个模型性能就越好,类似于特征≈数据。故横向对比时,使用CE方法训练得到的模型性能最好)。
从这个实验结果图来看,可以得出一个结论支撑作者的模型,也就是当我们使用CE方法训练整个模型,然后使用RS/RW方法从头开始训练分类层,此时我们可以得到最好的结果。从实验结果来看,这个训练方法是明显好于直接使用RW/RS来训练整个网络的性能。
具体来说,对于每个类,我们首先通过平均此类的表示来计算质心向量。然后,计算这些表示与其质心之间的 2 距离,然后将其平均作为类内表示的紧凑性的度量。如果一个类的平均距离很小,则意味着该类的表示在特征空间中聚集得很近。我们在训练阶段将表示的 2-范数归一化为 1,以避免特征尺度的影响。我们根据分别使用交叉熵 CE)、重新加权 RW) 和重新采样 RS) 学习的表征来报告结果。
基于此,我们便可以知道,想要得到一个更好的分类模型去处理长尾问题,我们便需要充分利用上述这个实验结果。
除了这个,作者还在补充材料里面利用另一种方法论证了使用re-balancing方法会导致特征提取能力变差。这次使用的评价标准是类内特征之间的距离,如果类内特征之间的距离越近,即平均距离越近,得到的特征越好。
综上,在本文中,作者揭示了re-balancing的机制是显着促进分类器学习,但会在一定程度上意外地损害所学深层特征的表示能力。
二、How class re-balancing strategies work?
这个部分上面两个实验已经介绍过了。即re-balancing可以提高分类器的性能但是同时会退化特征提取器性能。
三、方法介绍
1.网络结构图
作者已经发现使用re-balancing方法可以提高模型性能,但是使用该方法会导致特征提取层模型性能下降。故作者想要结合这两个方法的优势,来进一步提高模型性能。作者的办法是使用一种累计学习策略,先学习通用模式,然后逐渐关注尾部数据。
这里简单介绍一下这个网络的流程。首先通过两个部分共享的双分支网络,输入一个是具有长尾分布的数据集xc,yc)x_c,y_c)xc,yc),另一个是通过reverse操作后的数据集xr,yr)x_r,y_r)xr,yr)。特征提取网络采用的是残差网络,最后一个残差网络不共享权重。GAP指的是全局平均池化。最终两个层的输出特征分别为fcf_cfc和frf_rfr。中间的α\alphaα是一个参数,其随着epoch的增加而改变。最终的输出结果为zzz,其表达式如下
z=αWcTfc+1−α)WrTfrz=\alpha W_c^Tf_c+1-\alpha)W_r^Tf_r z=αWcTfc+1−α)WrTfr
由于是分类,最终的输出要经过softmax操作得到概率值ppp。
从α\alphaα的大小变化来看,随着训练的增加模型参数更新越来越依赖于红色框的分支。
损失函数的表达式如下:
L=αEp,yc)+1−α)Ep,yr)L=\alpha Ep,y_c)+1-\alpha)Ep,y_r) L=αEp,yc)+1−α)Ep,yr)
这里简单说一下,第二个分支输入数据、权重共享策略以及如何获得以及α\alphaα的更新策略。
- 第二个分支主要通过每个类别的概率PiP_iPi来进行采集,PiP_iPi表达式如下。
Pi=wi∑j=1Cwj,wi=NmaxNiP_i=\frac{w_i}{\sum_{j=1}^{C}w_j},w_i=\frac{N_{max}}{N_i} Pi=∑j=1Cwjwi,wi=NiNmax
这里NmaxN_{max}Nmax表示所有类别中类别数量最大的样本数,NiN_iNi表示第iii类样本对应的样本数。
数据生成步骤如下:1.计算出PiP_iPi;2.根据PiP_iPi随机抽取一个类iii;3.均匀地从第iii类中抽取一个样本进行替换。重复这个过程,直到获得一个batch的样本。
-
在 BBN 中,两个分支在经济上共享相同的残差网络结构,如图 3 所示。我们使用 ResNets [12] 作为我们的骨干网络,例如 ResNet-32 和 ResNet-50。详细地说,除了最后一个残差块之外,两个分支网络共享相同的权重。共享权重有两个好处:一方面,传统学习分支(蓝色框)的良好学习表示可以有利于重新平衡分支(红色框)的学习。另一方面,共享权重将大大降低推理阶段的计算复杂度。
-
α=1−TTmax)2\alpha=1-\frac{T}{T_{max}})^2 α=1−TmaxT)2
这里的TTT表示当前时刻的epoch数,TmaxT_{max}Tmax表示最大的epoch数。
2.推理阶段
这里面涉及到一个超参α\alphaα,这里作者直接令α=0.5\alpha=0.5α=0.5。
四、实验结果
1.数据集介绍
CIFAR数据集为常用实验数据集,作者用β=NmaxNmin\beta=\frac{N_{max}}{N_{min}}β=NminNmax来表示不平衡比例。iNaturalist数据集是真实世界的大尺度数据集,其数据类别分布极度不平衡且存在细粒度问题。
2.对比实验
这里简单说一下2X scheduler的意思是允许两倍个epoch数。
3.消融实验
4.观点的验证实验
注意,这个图是越平坦+方差越小越好。纵坐标表示对于分类器第iii类的倾向性。
疑惑点
这个α\alphaα起作用原因是啥——个人觉得这东西很像混合学习,只不过取的混合系数分布不同。
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/1448551.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
长尾分布论文笔记:BBN
BBN: Bilateral-Branch Network with Cumulative Learning for Long-Tailed Visual Recognition
一、背景介绍
1.长尾效应 长尾分布比较常见,指的是数据集中少量类别占总数据集比重较大。如果使用带有长尾分布的数据集去直接训练分类网络的话,就会导致……
stc单片机真是服了他了
stc12c5a60s2单片机试了一下,原因是at89c52价格涨了,寻找替代产品,stc的东西还能有isp功能,但是问题出来了,没有t2,这么明显的差别,还是拿到芯片后次看到的,真是晕呀。
不得已再找&……
awg线规,直径,面积,电流对照
AWG 直径 面积 铜阻抗 inch) mm) kcmil) mm) Ω/km) Ω/kFT) 0000 4/0) 0.46 11.684 212 107 0.1608 0.04901 000 3/0) 0.4096 10.404 168 85 0.2028 0.0618 00 2/0) 0.3648 9.266 133 67.4 0.2557 0.07793 0 1/0) 0.3249 8.252 106 53.5 0.3224 0.09827 1 0.2893 7.……
关于反汇编工具mbug.exe
mbug这个工具是一个老软件,配合硬件可以仿真51,简单应用主要是汇编和反汇编。是个dos环境下的软件,在xp下勉强还能用,挂在cdsn这里,看到有很多人下了不能用,可能是win7下就不行了,很遗憾。
这个……
高稳定度电源好费劲
采样部分真麻烦,电阻取样电流有温升,漂移,噪声。光探测器做光反馈,一样也会有光响应度的变化。
还是卤钨灯的简单些,就是纯电阻负载。
led的电源在光探测器上的温度变化不好处理,加大散热器试一下吧&……
打算写一个vbnet调用vc编译出的dll
只能说是基本成功。
简单的dll选项,mfc的dll,都是缺省项。
添加函数,和原函数毫无关系。
全局变量a,b,c。函数分别set和get,再加简单的addab,addab,addbc。编译,成功 ……
支持一下mschart
MFC中MSChart的使用示例
http://blog.sina.com.cn/s/blog_9a2a952201018ey9.html
在vs里面自带的图形控件加载方法和简单示例 微软图形控件(Chart或MSchart)的用法 http://www.cnblogs.com/Nazarite/archive/2010/06/19/1760974.html
应该是vs2008的……
csdn界面为什么要改呢
不习惯,真不明白费这个劲改界面图什么?闲的没事干了?不解…
labview和c#的string到字节数组的转换
labview有一个控件是做这个转换的,在程序框图里面的函数选板-》数学-》数值-》转换中找,初用labview的感觉就是控件太多,不好找。
c#的源程序 static void Mainstring[] args) { // Input string. const s……
还是c#的toolstrip简单
比较了一下vb,vc和c#,觉得还是c#的toolstrip简单,原来的vb还要弄个imagelist对应ico图片,c#就是对应一个图片,bmp,jpg,就完事了,大小由size确定.
而且还可以使用下拉菜单,一个键一个事件,vb是一个toolbar一个事件,键是索引,在事件里面选择case.
vc也是ico对应,是一个button一……
c++中的继承的讲解
cpp中的继承的总结: 1、继承方式对于之列继承自父类的成的访问权限的影响 对于父类本身没有影响,对于子类扩展成员也没有影响。 2、子类中从父类继承的成员,其访问权限不能高于继承声明时使用的访问权限。 私有继承: 子类中所有继……
c++虚函数的讲解
废话少说,直接上测试代码 #include<iostream> #include<stdlib.h>usingnamespace std;//有虚函数的类 class A{public:A);~A);virtual void f){cout<<"this is A f)"<<endl;}virtual void g){cout<<"this is A g……
ListView TableView ScrollView三者之Tableview
注意点:
1、其中的listView和Tableview都是继承自Scrollview
2、本文主要讲解的是tableview
3、代码部分引用的是在公司中做的产品
4、以上代码可以修改的地方:将cell改为继承自TableviewCell,这样可以直接创建cell。
5、代码中使用了函数的绑定和函……
c++中的std::shared_ptr和std::weak_ptr
std::share类型在c11提出,其意义:使用shared_ptr解决的主要问题是知道删除一个被多个对象共享的资源的正确时机,在本项目中所有的数据类均是使用智能指针来存储,就是为了解决这个问题。
一、std::shared_ptr采用的是引用计数来管……
std::pair的使用
待续。。。。。。…
cocos2d-x安卓启动页的背景图路径
启动页和icon的资源路径:工程名/proj.android/res/drawable/…
c++中的虚函数详解
//废话少说直接上代码,用一个测试来阐述虚函数:
#include<iostream> #include<stdlib.h>usingnamespace std;//有虚函数的类 class A{public:A);~A);virtual void f){cout<<"this is A f)"<<endl;}virtual void ……
Flink Stream 处理数据倾斜
数据倾斜的场景
在数据源发生的数据倾斜。例如,Kafka 的分区,有的分区数据量特别的少,有的特别的多,这样在消费数据后,各个 subtask 拿到的数据量就有了差异。在 keyBy 之后,产生的数据倾斜。例如……
cocos2d-x中的触摸事件详解
屏蔽相关节点的方法。
注意吞噬触摸时候需要进行在ontouchbegan 中需要设置ture。
链接地址:
http://www.68idc.cn/help/buildlang/ask/20150309260641.html…
编程注意的问题
一、改Bug注意的问题 1、复现bug,明白功能或者是错误的现象 2、代码中打断点,确定Bug的位置,接着是确定bug的具体的原因。 3、理清楚Bug的关键点,提出解决方案,这里需要强调一下,一种方案不行,切……
编程日记2023/4/16 15:01:14