cross entropy有两种解释。一种是信息论KL散度角度,一种是概率论角度MLE。详见参考文献[1]。
y=\{+1,-1\}, p\in [0,1] ,其中y是ground truth label, p是predicted scores。
令
则p_t大时,样本简单,p_t小时,样本难。
这时cross entropy loss可写为:CE(p,y)=CE(p_t)=-logp_t
公式:FL(p_t)=-\alpha(1-p_t)^\gamma logp_t
focal loss在实现时,有三个要点:
这条比较明显,对于logx来说,如果x过大,logx数值很大,所以对x作sigmoid(x)使得其数值范围在(0,1)之间,log(sigmoid(x))数值也在(0,1)内。
如果不设置合适的bias的话,focal loss的表现可能会不如L1或者L2 loss(自己实现过)。
如论文[3]中section 3.3及section 4.1 initialization所述,在训练刚开始的iteration里,负样本比例远大于正样本的情况下,负样本的loss也远大于正样本的loss,即对回传梯度的贡献也远大于正样本。这样会带来训练不稳定(loss-> Nan)或者训练不出好结果(loss一直下降,但AP趋近于0)的问题。
在section 4.1中,论文指出在训练最开始,把所有正样本anchor的confidence都取为\pi,
则网络输出的最后一层的bias初始值应设置为b=-log((1-\pi)/\pi)。
解释:
最后一层的输出loss = wx + b, wx = -logp_t, loss = -logp_t-log((1-\pi)/\pi)=-log(p_t*(1-\pi)/\pi)。在网络训练开始时,若数值上p_t和\pi相消,只剩下-log(1-\pi)约为0。即这样构造可以使初始训练时loss不过于大。
笔者自己认为\pi设置为多少最好需要做几次实验试。第一次尝试可以取得和论文中一样, \pi=0.01。 设置bias比直接给正负样本的loss设置固定的加权系数好,因为只设置了bias的初始值,bias是网络参数,在迭代过程中会更新。
focal loss example in CornerNet见参考文献[2]。
In kp.py
for tl_heat, br_heat in zip(self.tl_heats, self.br_heats):
tl_heat[-1].bias.data.fill_(-2.19)
br_heat[-1].bias.data.fill_(-2.19)
We set the bias following the formula given in Section 4.1 of the focal loss paper. We use pi equals to 0.1.
最后输出层设置bias是训练网络的一个有用的trick,适用于正负样本悬殊情况下的loss训练。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。