您的位置:首页 > 其它

深度学习【17】Focal Loss 反向求导及darknet上的实现

2017-09-07 19:47 1666 查看

Focal Loss 反向求导及darknet上的实现

Focal Loss 可以解决不平衡分类问题,是在交叉熵损失函数上的扩展。详见,论文:Focal Loss for Dense Object Detection。

该文,主要推导FL在softmax函数下的求导,以及记录在darknet上的实现。

FL损失函数如下:

FL(pt)=−α(1−pt)γlog(pt)FL(pt)=−α(1−pt)γlog(pt)

其中ptpt为:

pt={p, 1−p,if y==1 otherwise pt={p,if y==1 1−p,otherwise

softmax公式:

pi=exi∑ekpi=exi∑ek

我们的目标得到x对FL的导数:

dFLdxi=dFLdpi∗dpidxidFLdxi=dFLdpi∗dpidxi

又,

dFLdpt =−α(d(1−pt)γdpt∗log(pt)+(1−pt)γ∗dlog(pt)dpt)=−α(−γ(1−pt)γ−1log(pt)+(1−pt)γ1pt)=−α(−γ(1−pi)γ−1log(pi)+(1−pi)γ1pi)because(y==1)(1)(2)(3)(1)dFLdpt=−α(d(1−pt)γdpt∗log(pt)+(1−pt)γ∗dlog(pt)dpt)(2) =−α(−γ(1−pt)γ−1log(pt)+(1−pt)γ1pt)(3) =−α(−γ(1−pi)γ−1log(pi)+(1−pi)γ1pi)because(y==1)

xixi 对softmax的求导,分两种情况:

ifi==j: dpidxi ifi!=j: dpidxi =exi∗∑exk−exi∗exi∑ex2k=exi∑exk−exi∑exk∗exi∑exk=pi−pi∗pi=pi(1−pi)=0−exi∗exj∑ex2k=−pi∗pj(4)(5)(6)(7)(8)(9)(10)(4)ifi==j:(5) dpidxi=exi∗∑exk−exi∗exi∑exk2(6) =exi∑exk−exi∑exk∗exi∑exk(7) =pi−pi∗pi=pi(1−pi)(8) ifi!=j:(9) dpidxi=0−exi∗exj∑exk2(10) =−pi∗pj

因此,

ifi==j: ifi!=j: dFLdxi=α(−γ(1−pi)γ−1log(pi)pi+(1−pi)γ)∗(pi−1)dFLdxi=α(−γ(1−pi)γ−1log(pi)pi+(1−pi)γ)∗pj(11)(12)(13)(14)(11)ifi==j:(12) dFLdxi=α(−γ(1−pi)γ−1log(pi)pi+(1−pi)γ)∗(pi−1)(13) ifi!=j:(14) dFLdxi=α(−γ(1−pi)γ−1log(pi)pi+(1−pi)γ)∗pj

darknet的softmax交叉熵反向传导时,当i==j时是,1-pi_1-pi_,;当i!=ji!=j时是−pj−pj,因此还需多一个负号。

默认alpha=0.25,gamma=2

int ti = index+stride*class;
float grad =-2*(1-output[ti])*logf(fmaxf(output[ti],0.0000001))*output[ti]+(1-output[ti])*(1-output[ti]);

for(n = 0; n < classes; ++n){
delta[index + stride*n] = scale * (((n == class)?1 : 0) - output[index + stride*n]);

delta[index+stride*n] *= 0.25*grad;

if(n == class) *avg_cat += output[index + stride*n];


如果alpha=1,训练就会出现nan。但是alpha=0.25,,训练又很慢,还需要多做实验。

2017.10.16更新:将alpha设置为0.5,经过漫长的训练,平均map能够上升2%。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  focal-loss