1. Label Smoothing理论概要
假设我们的分类只有两个,一个是猫一个不是猫,分别用1和0表示。Label Smoothing的工作原理是对原来的[0 1]这种标注做一个改动,假设我们给定Label Smoothing的平滑参数为0.1:
[0,1]×(1−0.1)+0.1/2=[0.05,0.95]
可以看到,原来的[0,1]标签成了[ 0.05 , 0.95 ] 了,那么就是说,原来分类准确的时候,p = 1,不准确为p = 0 。假设为Label Smoothing的平滑参数为ϵ,现在变成了: 分类准确的时候 p = 1 − 0.5 ∗ ϵ , 分类不准确时 p = 0.5 ∗ ϵ,也就是说对分类准确做了一点惩罚。
这实际上是一种正则化策略,减少了真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。
2. Label Smoothing实现代码
YOLOv3-SPP中的代码:
def smooth_BCE(eps=0.1): # https://github.com/ultralytics/yolov3/issues/238#issuecomment-598028441 # return positive, negative label smoothing BCE targets return 1.0 - 0.5 * eps, 0.5 * eps cp, cn = smooth_BCE(eps=0.0) if model.nc > 1: # cls loss (only if multiple classes) t = torch.full_like(ps[:, 5:], cn, device=device) # targets t[range(nb), tcls[i]] = cp lcls += BCEcls(ps[:, 5:], t) # BCE