deep learning中各种loss function大杂烩
学习深度学习也有一段时间啦,很多论文都会在 loss function 上做文章,说明还是非常最重要的呢,因此总结一下自己对不同的loss function的理解。
Softmax Loss
网络的全连接层出来后,会加上一个softmax层,softmax的输入是该样本在某个类下的得分(这个得分没有范围限制),经过softmax层之后,输出为该样本属于某个类的概率(范围是0到1)。softmax的计算公式如下,想要更直观地理解公式,可以随便带几个值进去试一试。
∑j=1neWjTxi+bjeWyiTxi+byi
softmax loss 就是对计算出来的概率求损失函数值,其公式如下所示,预测错比预测对的损失要大,预测错得离谱比预测错得轻微的损失要大。举个例子,某样本的真是标签是类别3,即y=[0 0 1 0],模型1预测得到的softmax输出为[0.1 0.2 0.6 0.1],即得到正确的分类标签,对应的loss=-log(0.6);模型2预测得到的softmax输出为[0.2 0.4 0.3 0.1],即得到错误的分类标签,对应的loss=-log(0.3);模型3预测得到的softmax输出为[0.2 0.5 0.1 0.2],即得到错误的分类标签,对应的loss=-log(0.1);直观地感受一下,模型1分类正确,模型2、3分类错误,但模型3较模型2错误的更离谱,所以,我们得到的损失函数值排序为:loss=-log(0.6)<loss=-log(0.3)<loss=-log(0.1)。
LS=−i=1∑mlog∑j=1neWjTxi+bjeWyiTxi+byi
下面是用softmax loss 和 LeNets++得到的一个2D的可视化图,可以看出softmax loss可以将不同类区分开但类内的距离较大。

Center Loss
为了解决上述问题,减小类内距离就好啦。center loss 即引入了聚类中心,使每个类的样本向聚类中心靠拢以减小类内距离。center loss 如下所示:
LC=21i=1∑m∥xi−cyi∥22
将LS和LC结合得到损失函数为(其中λ为权衡两种loss的权重系数):
L=LS+λLC=−i=1∑mlog∑j=1neWjTxi+bjeWyiTxi+byi+2λi=1∑m∥xi−cyi∥22
c即为第yi个类的聚类中心,那么问题来了:
(1)在整个训练集上更新聚类中心,工程量大还耗时;→ 在mini-batch上更新聚类中心
(2)少数标签错误的样本在聚类的过程中会造成较大的干扰。→ 设置来控制聚类中心更新的学习率 cjt+1=cjt−α⋅Δcjt
加上center loss 后的特征分类可视化图如下所示:

随着center loss 所占权重的增加,特征的类内距离逐渐减小。
参考论文:https://link.springer.com/content/pdf/10.1007%2F978-3-319-46478-7_31.pdf
Triplet Loss
triplet loss的思想是增大类间距离,减小类内距离。采取的方法是讲一个三元组(anchor, negative, positive)输入进行学习,使得anchor与正样本距离更近,与负样本距离更远。

triplet loss 公式如下:
L=i∑N[∥f(xia)−f(xip)∥22−∥f(xia)−f(xin)∥22+α]+
更多的细节可以参考论文:https://arxiv.org/abs/1503.03832