简介:
论文地址:https://arxiv.org/abs/1704.06369
代码地址:https://github.com/happynear/NormFace
我们都知道做人脸认证时,使用训练好的模型,测试阶段将特征归一化再做余弦相似度进行比较。而这篇文章主要的想法来源是为什么再训练阶段我们不进行归一化了?本文主要解决的问题就是如何训练的时候增加归一化。
作者分别使用两种策略来训练分析归一化特征:
- 修改过的softmax,直接优化余弦相似度。
- 重先修改度量学习 的方法。
算法分析
测试阶段将特征归一化并没有研究者能清楚的解释,这种手段如今作为一种trick存在。下表显示了归一化使用前后的对比:
从表中可以看出将特征归一化可以有效提高识别率。
L2归一化层
作者通过可视化lenet的二维特征。
从上图中可以看出,当使用欧式距离进行度量时,f1f2距离小于f2f3距离,但f2f3是一类,但使用余弦相似度却能将他们分离。
Proposition 1
在使用归一化层时,需要考虑在softmax前的全连接是否需要添加偏置。作者在mnist上做了实验,当使用归一化时特征分布0点附近,如果添加偏置,则一类的特征会变肥,混叠在一起。因此不需要添加偏置。
实现如下:
layer {
name: "normalize1"
type: "Normalize"
bottom: "last_ip_layer"
top: "norm1"
}
layer {
name: "cosine_layer"
type: "InnerProduct"
bottom: "norm1"
top: "cosine"
param {
lr_mult: 100
decay_mult: 0
}
inner_product_param{
bias_term: false
normalize: true
num_output: 10572
weight_filler {
type: "gaussian_unitball"
}
}
}
Layer Definition
首先定义归一化层:
进行反向传播:
推导如下:
Reformulating Softmax Loss
作者通过对权重和特征都进行归一化,直接优化余弦相似度。
但是仅仅添加归一化进行训练网络不收敛,这是因为添加归一化层后d的取值范围为[-1,1],而正常情况下为[-20,20]和[-80,80]。而在分类任务中,例如1000类,输入图片正确预测的概率为0.007,而在softmax反向传播中,梯度为1-p。因此每一次反向传播时都给较大的梯度给已经正确分类的,所以导致网络难以收敛。
解决的办法就是添加scale层放大d。
实验结果
LFW结果