度量学习(Metric learning)------ 基于分类损失函数(softmax、交叉熵、cosface、arcface)-CSDN博客
loss分为两类,一类是基于softmax,一类是基于pair对的(如对比损失、三元损失)
基于softmax改进很多,基本上主要就是针对特征和分类的权值向量做归一化以及不同方式的引入 large margin,发展至今,常用的softmax,人脸等特征模型好用的CosFace ArcFace
softmax的作用是把一个序列,变成概率。假设输入的向量是(x1,x2,x3,x4),softmax的公式如下:
就是对向量进行归一化【对向量内部进行归一化】
softmax能够保证:所有值都是【0,1】之间的;所有的值加起来等于1
softmax直接求解存在数值稳定的问题,因为要算指数,输入稍微大一点,分母就很大 ,在计算上会溢出,可以使用log

softmax和损失函数的关系是什么?(以交叉熵损失为例)
cross entropy 是用来衡量两个概率分布之间的距离的,假设现在有一个样本集中两个概率分布 p q,其中p是真实分布,对于离散变量,H(p,q)称之为交叉熵

softmax能把一切转换成概率分布,如(0.1,0.2,0.3,0.4);对于多分类而言,如果采用one-hot 编码[one hot的意思就是只有一个位置是1,其余位置是0】,那么label便也成了一个概率分布,如(0,0,0,1),那么自然二者自然可以结合在一起使用。

softmax和分类器什么关系?
前面讲到softmax配合交叉熵构成了softmax 交叉熵损失,并且可以嵌入计算提高效率。以one hot编码,softmax的输入向量长度需要等同于类别的个数,因此需要一个全连接层 将网络的特征向量映射为一个长度为类别数的向量,这个有区别于现代使用GAP(全局平均池化)替代多层FC的操作。如下图,可以认为从512维到10000维的映射全连接层为分类器,训练时接 softmax+交叉熵,测试时接softmax的到置信度(或者不接,直接取最大值)。
m代表样本数,W代表最后一层全连接的参数,b代表偏置项,x代表特征向量

是向量点积,计算二者的相似度 
Wj表示第j个类别的权重向量,j指向某个具体的类别,比如 类别1 类别2.
计算的是样本xi与第j个类别的相似度得分
k所有类别的索引 用于求和
k用于遍历所有类别,k是总类别数,分母中的求和 表示对所有类别的得分求和,用于归一化
分子只计算真实类别yi的得分,为什么?我们要最大化真实类别的概率
分母:计算所有类别j的得分之和,进行归一化
右边那个式子其实就是计算相似度,使用cos夹角进行计算
m指的是Batch size i是样本索引,i=1表示第1个句子 batch中有多个sequence xi是输入向量,yi是真实标签 Wj是第j个类别的偏置 bj是第j个类别的偏置 n是类别总数(此表大小) θ是Wj和xi的夹角
所以需要改造Softmax,除了保证可分性外,还要做到特征向量类内尽可能紧凑,类间尽可能分离,以适用于度量的场景(测试类别不在训练类别中,如人脸)。 对比损失和三元组损失需要精心地构建图像对和三元组,耗时并且构建的训练对的好坏直接影响识别性能。
CosFace


为使度量学习更有效,CosFace首先对特征x和权重W做归一化 为1,这时点积就变成了余弦相似度。
θj是特征x与第j类权重Wj之间的夹角
为了放大梯度,通常还会乘一个缩放系数s 
CosFace的核心操作:只对正确类别y的logit动手脚,直接减去一个余弦边距m
,其余错误类别的logit保持不变
代入softmax后,Cosface损失函数变为:

几何直观:在特征空间里做了什么?
想象所有特征和权重都分布在一个单位超球面上,标准softmax:决策边界是:
角度平分线
正确类别的决策边界变为:
相当于将正确类别的录取线提高了 m
模型必须让特征与正确类权重的夹角更小,余弦值更大,结果就是类内特征被压缩的更紧,类间边界被强行推开
再看看Arcface

将惩罚项移动到cos内部