Pytorch中的Margin Loss
Margin Loss是一类特殊的loss
当使用CrossEntropy或MSE时,我们希望模型预测一个确定的期望值
而当使用Margin Loss时,我们不关心模型具体的输出值,只关心不同输出之间的相似度
例如人脸识别任务,我们可以用Margin Loss训练一个压缩模型,使得来自同一个人的不同图像输出的表达向量尽可能相似,而来自不同的人的图像则间隔尽可能大,这样识别就可以通过设定距离阈值判断相似/不相似来进行
Margin Loss应用非常广泛,在不同领域有很多不同称呼,例如Ranking Loss、Triplet loss、Contrastive Loss等等
Hinge Loss
Hinge Loss是机器学习中用于训练间隔最大化分类器(例如SVM)的损失函数,其表达式为
其中$y$为分类器的输出,$t={+1,-1}$为期望的标签
从直观上理解,若$t,y$同号且$|y|\geq1$,说明间隔已足够大,因此 $l(y)=0$
若$t,y$同号但$|y|<1$或$t,y$异号,则$l(y)$的值随$y$线性增大
HingeEmbeddingLoss和CosineEmbeddingLoss
HingeEmbeddingLoss和CosineEmbeddingLoss是Pytorch提供的两个loss,用于度量两个向量是否相似
令$x$表示某两向量的距离,$y=+1/-1$分别表示相似/不相似,则该loss表达式为
直观上理解,若向量相似,则希望距离$x$越小越好,因此$l=x$
若不相似,则希望距离$x$大于给定的间隔margin,因此$l=\max(0,margin-x)$
CosineEmbeddingLoss相当于HingeEmbeddingLoss用余弦相似度的版本,其表达式为
MarginRankingLoss
MarginRankingLoss也是Pytorch提供的loss,顾名思义其作用就是排序
给定输入$x_1,x_2$和$y\in{+1,-1}$,该loss表达式如下
其含义是当$y=1$时应有$x_1>x_2$,$y=-1$时应有$x_1
以分类任务为例,我们可以令$x_1$为正确类别的得分,$x_2$为所有错误分类的最高分,并令$y=1$计算loss
又例如对比学习中,我们可以令$x_1$为negative pair的距离,$x_2$为positive pair的距离,并令$y=1$,此时loss就化为了接下来要说的Triplet Loss
TripletMarginLoss
TripletMarginLoss是Pytorch提供的Triplet Loss的实现,这是应用最广泛的Margin Loss
给定正样本$p$,负样本$n$和锚(anchor)样本$a$,则可以分别组成正对$(a,p)$和负对$(a,n)$,Triplet Loss定义为
也即负对的距离应比正对的距离至少大margin
该loss提出于如下人脸识别论文FaceNet: A Unified Embedding for Face Recognition and Clustering,其中正样本与锚样本是来自同一个人的图像,负样本则与锚样本不同
Pytorch还提供了另一个TripletMarginWithDistanceLoss可以自定义距离函数的版本
MultiMarginLoss
MultiMarginLoss是Pytorch中用于多分类任务的Margin Loss,其表达式为
即正确类别的得分应比任意错误类别的得分至少高margin
SoftMarginLoss
SoftMarginLoss用于二分类,表达式为
和SVM的soft margin关系不大,其实就是logistic损失