focal loss理解与初始化偏置b设置解释

1.focal loss解决了什么问题?

focal loss解决了类别不平衡的问题,比如one-stage detector中需要产生许多anchor,但大部分都是属于背景而且很好判断,相比代表object的anchor,代表背景的anchor多的多,而背景的error也是算在loss中的,虽然背景很好判断,概率值很高,但大部分都是0.5以上的,跟1总有差距,这就会带来error,就会被算入loss,虽然背景好判断,它带来的error很小,但是架不住多,那么这些小error累积起来就会比较大了,可能就在loss里占主导地位了,就会导致那些代表object的anchor的误差在loss里占比较小的比重了,那么反向传播的时候,代表背景的anchor的error就会带偏loss(我的理解按照极限来讲,即代表object的anchor的数量很小,那么可能这个detector就变成了判断是否是背景的了)。


2.为什么需要对 classification subnet 的最后一层conv设置它的偏置b为 -log((1 - \pi)/\pi),\pi 代表先验概率,就是类别不平衡中个数少的那个类别占总数的百分比,在检测中就是代表object的anchor占所有anchor的比重。论文中设置的为0.01,这个问题没见有人回答过。

首先知道最后一层的激活函数是sigmod: \frac{1}{1 + e^{-(wx+b)}}

论文中说对于二分类问题,输出y=-1 与 y=1 的概率都是0.5,因为默认初始化情况下即w零均值,b为0,这时候不管输入是什么,sigmod的输出都是0.5,所以正类和负类都是0.5.这是会带来什么问题?

loss是对所有anchor的误差求和,假设使用的二分类的cross entropy: -log(p) - (1 - y) log(1 - p)

那么刚开始的时候,对于anchor不管代表的是物体还是背景,他们的误差都是 -log(0.5) ,而代表背景的anchor的个数又多的多,这么看,刚开始训练的时候,loss肯定要被代表背景的anchor的误差带偏。

而如果我们对最后一层的偏置使用上面的初始化呢?

把b带入到sigmod中, \frac{1}{1+e^{log(\frac{1-\pi}{\pi})}} = \pi

那么loss会变成: \pi = 0.01

对代表object的anchor来说: -log(\pi)

对代表背景的anchor来说 -log(1 - \pi)

这么看一开始代表object的anchor的误差相比代表背景的anchor的误差就大的很多了,然后就能解决类别不平衡问题。

最后对cross entropy加上 (1 - p_t)^\gamma ,使得 -log(1 - \pi) 更小了。


以上仅代表个人理解,有不对的地方希望大家指正。

发布于 2019-04-24 21:53