Cross Entropy Loss
交叉熵损失(Cross-entropy loss)通常用于分类问题,定义如下:
其中y是真实的类别,是一个向量,用下标i进行索引,每个元素取0或1。
p是预测的概率,在做多分类时,一般是以softmax作为最后的激活函数的,输出有多个值,对应每个分类的概率值,和为1。
p的大小能反映出模型预测样本类别的难易程度,不管是正样本还是负样本,模型预测正确时p都很大,预测错误时p值很小。通常易分类样本的特征为p>0.5;难分类样本特征为p<0.5,p值越大,表示预测越准确。
Focal Loss
我们希望模型更加关注难分类样本,所以会考虑将难分类样本在损失函数中的比重加大。Focal Loss定义如下:
当p趋向于1,即说明该样本是易区分样本,此时调制因子是趋向于0,对损失的贡献就较小,即减低了易区分样本的损失比例。假如某个样本是正样本,但是该样本为目标的概率p特别小,即被错分到负样本了,此时调制因子趋向于1,接近交叉熵损失。
为了控制正负样本的权重,通常再乘以一个权重系数:
可以通过调整alpha来降低多类样本的权重。
from torchvision.ops import sigmoid_focal_loss
input = torch.tensor([0.1,0.2]).float() # 表示正样本的概率
target = torch.tensor([0,1]).float()
weight = 0.25
gamma = 2
loss = sigmoid_focal_loss(input, target, weight=0.25, gamma=2, reduction='none')
print(loss)
'''
loss值 tensor([0.1539, 0.0303])
对于第一个,它的标签是负样本,计算过程
pt = 1-torch.sigmoid(input[0])
loss_1 = -(1-weight)*(1-pt)**gamma*torch.log(pt) #值为0.1539
对于第二个,它的标签是正样本,计算过程
pt = torch.sigmoid(input[1])
loss_2 = -weight*(1-pt)**gamma*torch.log(pt) #值为0.0303
'''