Focal-Loss-Pytorch
Focal-Loss-Pytorch copied to clipboard
原始论文中提到,应该给样本数量较少的类别较小的权重
您好,非常感谢您的工作,我最近在看Focal Loss的时候,发现论文中提到,应该给原始类别较少的类别较小的权重,即设背景类是0,目标类是1的话,那么应该令$\alpha=[0.75, 0.25]$才对,这是否和您写的代码有出入呢?
还望不吝赐教,不知道是您写的有问题,还是我理解错了,感谢!
模型在训练时更偏向于权重更大的类别。
为平衡目标检测任务中背景类与目标类别样本量失衡的问题,应该加大目标类的权重,减小背景类的权重。
加大目标类的权重利用的是$(1-\hat{y})^{\gamma}$这一项,减少背景类的权重利用的是$\hat{y}^{\gamma}$这一项。但是随着训练不断迭代,因为这两项权重,结果形式逆转了,现在目标类反而权重特别大,所以要给目标类降权,即给目标类再乘一个较小的缩放因子$\alpha$,那么目标类应该乘0.25,背景类乘0.75才对
我是从苏剑林大佬的博客看到的,文章链接,相关内容截图如下

首先,有两个参数 α γ。
- α 负责平衡类别样本数量间差异。
- γ 负责平衡类别难易度差异。
你这里说的“因为这两项权重,结果形式逆转了”,如果我没理解错的话,是这样的意思:随着训练的进行,模型对正例的识别效果越来越好。
这两件事儿是完完全全的不同的两件事儿。
在目标检测任务中,假定你取三倍正例的负例来进行训练,负例数量是正例数量的三倍,α设定为 0.25 ,负例权重0.25,正例权重(1-0.25),这步的目的是 平衡 正负例数量差异的。 这个操作在没有focal loss时就会这么做。
至于这里说的“也许形式还逆转了”,那是之后的事儿了,是难易度的问题了。
我做几组实验再来说服您,哈哈
你把α 和 γ 分开就明白了。
α就是一个单纯的平衡正负样本数的 参数。
这个和任务无关,不管是目标检测,还是分类,还是分割。
你可以多试一试看看效果
我认为你说的是对的,focalloss的alpha是用来平衡正负样本的损失的,不是用来平衡类样本数量的。这是我的理解。
alpha就是类别不平衡问题里最常用的reweighting方法,小类样本赋予更高的权重,大类样本赋予更低的权重
alpha就是类别不平衡问题里最常用的reweighting方法,小类样本赋予更高的权重,大类样本赋予更低的权重
样本计算时候的loss,更准确的说。
如果正负样本是1:3的话,alpha理应是0.75,因为正样本更少。但是因为gamma的存在,由于负样本很多都是easy样本(易分样本),gamma把它们的loss调整的太低了,导致模型可能就会比较关注正样本而忽视了负样本了,最后模型偏向于全部预测正样本了。 我自己的实验情况下,正负样极不均匀,大概200个正样本,5000个负样本。这种情况下我设置gamma=2,alpha=0.96(≈5000/5200),试图加大正样本的权重,最后就是由于负样本很多都是easy样本,导致loss很低,模型正样本准确率不断上升,但是负样本就越来越差了,模型非常偏向于预测正样本,所以也不能完全根据正负样本比重来设置alpha,还需要根据自己的实验调参数。没有很多计算资源我还是打算就设置为0.5了。
如果正负样本是1:3的话,alpha理应是0.75,因为正样本更少。但是因为gamma的存在,由于负样本很多都是easy样本(易分样本),gamma把它们的loss调整的太低了,导致模型可能就会比较关注正样本而忽视了负样本了,最后模型偏向于全部预测正样本了。 我自己的实验情况下,正负样极不均匀,大概200个正样本,5000个负样本。这种情况下我设置gamma=2,alpha=0.96(≈5000/5200),试图加大正样本的权重,最后就是由于负样本很多都是easy样本,导致loss很低,模型正样本准确率不断上升,但是负样本就越来越差了,模型非常偏向于预测正样本,所以也不能完全根据正负样本比重来设置alpha,还需要根据自己的实验调参数。没有很多计算资源我还是打算就设置为0.5了。
alpha完全可以看做torch实现的cross entropy中的weight 参数。
在实际应用中,一般情况下只用gamma就可以训练的比较好。alpha可以用来平衡自己模型的训练倾向,但如果设置太大的话,就比如这个0.96,相当于负样本对损失的影响只剩下0.04了,即使负样本多,也会造成负样本的训练不充分。