最后更新于
最后更新于
Center loss与triplet loss本质上都是一种度量学习. 与triplet loss需要构造正样本和负样本不同, center loss只需要在原来的softmax分类模型基础上, 在特征提取完毕后引入关于center loss的计算即可, 如下图:
然后两部分按比例加在一起, 组成最终的损失进行训练. 这里的比例是一个超参数.
例如人脸识别, 假设我们的训练集中有10万张人脸, 那么这是一个10万分类的模型. 训练完毕后到了具体的应用, 可能只有几百人, 或是几百万人, 其中的一些人还不在训练集中, 这种情况下原本的分类就没了意义.
即我们需要的是特征具有聚类特性.
个人感觉, 这个损失函数适用于以下的样本分布情况:
同类样本之间的差别不能太大, 这也许是在人脸中表现好的原因
不同类样本之间要有一定的差别, 分类问题的根本, 而对于聚类, 可能两个类对应的中心向量很接近, 两个类就混淆在一起了
在训练时, 每个样本对应一个类, 也对应着这个类的中心向量. 使用Embedding方法进行管理. 在测试阶段就不用再使用中心变量了, 还是使用原来的模型进行特征提取即可.
注意这里的损失是交叉熵和center loss按照5:1的比例得到的, 注意代码中对应的写法.
对于多分类问题, 一般使用softmax+交叉熵. 经过整个神经网络, 抽取得到样本的特征, 有些情况下, 我们会更关心特征向量而非最后的分类结果.
这种情况下, 我们对特征提取提出了新的要求, 即训练后的模型, 对于同一类的样本, 得到的特征向量基本相同. 那么在实际使用中, 我们只使用网络进行特征提取, 然后把提取出来的特征再使用其他的方法, 如KNN进行分别.
以上面的意图为目的, 再使用softmax和交叉熵, 训练出来的模型就达不到要求了. 因为softmax会使特征进行分布满整个空间, 详情参考. 为了让模型得到的特征具有聚类特性, 使用centor loss:
上式右边第一项就是softmax交叉熵损失, 后面的一项, 是增加的聚类惩罚项. 对于每类, 都对应着一个可训练的中心, 即要求每个样本提取到的特征要跟自己类对应的中心靠的很近. 总的来说, 第一项负责拉开不同类之间的距离, 第二项负责缩小同一类之间的距离.