特点
- Engaging:(优胜,better)
ArcFace directly optimises the geodesic distance margin by virtue of the exact correspondence between
the angle and arc in the normalised hypersphere
ArcFace通过归一化超球面中角度和弧线之间的精确对应关系
直接优化了测地距离裕度
(margin) 都没懂到底是说的啥。
特征和权重之间就是有角度。
-
Effective
就是说SOTA performance -
Easy 简单 容易实现
容易实现,在算法1
的图里好像就只是需要几行代码。 -
Effcient
计算复杂性现在的硬件还能支撑住。
Absract
在新建立的Loss里面合着并入margins
来让face class
更加可分。 于是提出了加性角度margin
的loss让特征更加地discriminative
.
1. Introduction
他这个文章还分析了基于softmax方法和基于triplet方法的各自的问题:
他们还分析了CosFace的问题,
他对他们方法的优势的描述还没吃透,结合图来看看。什么回事?
特征和最后全连接层的dot product
在feature
和weight
归一化以后就等于余弦距离。
怎么看出来的?
上图是对Arcface所有精髓的描述。
我们利用反余弦函数
来计算当前特征
和目标权重
之间的角度。(纸上推导过)
当前特征和目标权重怎么有的角度 怎么看
之后,我们向目标角度
添加一个附加的角余量
,然后通过余弦函数再次获得回来target logits
。
这说的是对 ( θ + m ) (\theta+m) (θ+m)取cos得到 c o s ( θ + m ) cos(\theta+m) cos(θ+m)
这就得到:
l o g i t s = c o s ( θ + m ) logits=cos(\theta+m) logits=cos(θ+m)
然后,我们按照固定的特征范数
(怎么个固定法)?重新缩放所有logits
,
就是
l o g i t s = s ∗ c o s ( θ + m ) logits=s*cos(\theta+m) logits=s∗cos(θ+m)
随后的步骤与softmax损失中的步骤完全相同. 这是他们实现arcface loss的所有程序实现依托。
这个fc7
在程序的哪块???
就是程序中的:cos_t = tf.matmul(embds, weights, name='cos_t')
现在最需要弄懂的就是到底这个mx.sym.pick
是什么意思?
看我的实现和这个pick
的实现是否一致?
pick
网上的说明:
根据沿给定轴的输入索引(不是沿着整个軸,而是确定軸以后,还确定了根据那个軸的输入索引。)从输入数组中选择元素。说白了就是,告诉你按行来还是按列来,然后再告诉你行或者列上要取的数的具体的位置。确实会先告知按行取还是按列取,但不是指定具体的列或者行。
Given an input array of shape (d0, d1) and indices of shape (i0,), the result will be an output array of shape (i0,) with:
这块的意思只是:
如果要取出来的表示索引的数据张成什么形状,然后取出来的数据就长成什么样子。
就和上图的描述一样,索引长成[0,1,0]然后取出来也是
1
×
3
1×3
1×3的列表[1., 4., 5]。
在MXnet框架同样是0-代表列,1-代表行.
截至到图片中的第6
步,我都是清楚的。清楚pick
到底在做什么,但没找到pick
对应我程序的哪里?
2. Proposed Approach
真的去说理论部分了。
2.1 ArcFace
可以读着的时候,顺着我自己的,然后去更新tex文件。
我们知道:
x
i
x_i
xi代表的是特征向量,但是
R
d
R^d
Rd的
d
d
d是不是就是512
或者1024
?
38 Center Loss 原始文章
46 Range Loss 原始文章
18 SphereFace 原始文章
37 CosFace 原始文章
所以,我所有试验这个维度就设置D=512
。
传统softmax的问题:
传统的softmax损失函数并未明确优化特征嵌入,以使类内样本的相似性更高,而类间样本的多样性更高。尤其是1. 在大的类内外观变化时候(比如:同一类的样本存在pose variations
, age gaps
的时候)。或者2. 是在大型测试场景的时候。也就是million(百万)
或者trillion(兆)
pairs. 而我目前测试的都只是6000 pairs
.
然后:
2D-feature
? 不是说这个embedding的维度只是2
吧???? 太少了吧?
这个图说的就是,softmax loss会产生noticeable ambiguity
在decision boundaries
, 但arcface
就会有更加evident
的gap在nearest classes之间.
是因为基于了feature normalisation
, 然后所有的特征all face features
才以固定的radius
被push到arc space
。 但是这个,feature normalisation
也不是第一次被arcface用啊,arcface也是用的别人的啊。
得详细看那个彩色流程图以及伪代码流程图
2.2 Comparison with SphereFace and CosFace
2.2.1 Numerical Similarity
Numerical Similarity 数值相似度
指的就是:在数学乃至数字大小上,两者相差不大。
三种不同的margin penalty
,
SphereFace(m1): multiplicative angular margin
乘性角度ArcFace(m2): additive angular margin
加性角度CosFace(m3): additive cosine margin
加性余弦
在数学分析上,无论哪种惩罚项,无论在角度还是在cosine
空间,他们干的事都是一个,通过通过penalising the target logit
来让类内更紧凑,类间更可分。得深入理解这句话:
by penalising the target logit
怎么画这个the target logit curves
?
横轴是特征和目标中心的角度,纵軸是目标logit.
在这个图里的话,可以看出来,是越靠近左下角的曲线,就越好。ArcFace
的紫色(注意是紫色,不是玫红色
)基本和结合CM1
的蓝色重合了。文中有描述,说结合,结合的有better performance.
只画20到100, 这个我还不太确定,到底权重和向量之间怎么具体化这个角度。
此外,因为是随机初始化random initialisation
的,所以这个角度是从90度
左右开始的.
然后随着训练,这个角度的变化是这样的,刚开始是90度,然后在中间是40-50-60度,然后最后的最后end是30度. 也就是随着训练角度在变小,为什么是变小,肯定是变小意味着网络更好了。
目标logit曲线,
ArcFace的作者还把之前的SphereFace
, CosFace
里的margin
还有自己提出的全部结合到一起,说这样得到的target logits(获得更好的target logits)
可以有更好的表现。
2.2.2 Geometric Difference
说加性角度margin
有更好的geometric attribute
因为角度margin
和测地距离有着精确的对应。
为什么角度margin
和测地距离
有着精确的对应???
我们知道,sphereface
也是角度,为啥没提它的这个角度
和测地距离有着精确的对应。?
然后就是同样拿二分类来做图说明:
提出的
ArcFace
具有恒定的线性角度margin
,对比的话,Sphereface
和cosface
只有非线性角度margin
.nonlinear angular margin
在margin
设计上的细小差距在模型训练的时候会产生butterfly effect(蝴蝶效应)
。
这可能是为啥我的sphereface不工作的原因:
Sphereface采用退火优化,
- 我应该就是开始时候就发散了
- 我好像也没按照人家这样,去进行来自
softmax
的监督 - 来自
softmax
的监督可以来弱化multiplicative margin penalty
.
====
在没有对
margin
的整数integer
的要求下,他们实现了一个新版本的sphereface
, 通过利用arc-cosine反余弦函数
去代替使用复杂的双角度公式。得看看这是具体怎么做到的
. 他们这个版本在使用m=1.35
时候能没有任何收敛问题的情况下和original sphereface相当。
那我也设置这个,相当于sphereface.
2.3 Comparison with Other Losses
基于特征和权重向量的角度表达可以设计其他loss functions
.
和另外的三种进行了对比:
Intra-Loss
Inter-Loss
Triplet-Loss
Intra-Loss
通过减少the angle/arc
between 样本
和the ground truth centre
. 数学公式如下:
实验部分
之前2019年的ArcFace
程序没有验证部分:
训练30epoch
的training accuracy
:
只有0.2多,不到0.3
现在的2021年的CosFace
程序有验证和测试部分:
训练0.1并且30epoch
的Cosface
的training accuracy
和validation accuracy
:
两者在数值上也只是只有0.1多,不到0.2
这能说明30epoch是肯定不行的。
看看用0.05
和0.1
初始化的两个版本:
为啥没有0.05的30epoch
版本?
因为0.05的90epoch版本都因为训练太少还欠拟合着呢,因为截止到LR=0.0005训练精度只达到0.444
。
图示如下:
没错,下面的图已经证实了0.1的90epoch都不行的话,0.1的30epoch肯定也不行啊
下面是30
的:
下面是90
的:
综上,0.1训练90
还欠拟合呢,0.1训练30肯定不行
。 同理,0.05训30
就没必要再训练了,因为训练90的那个才到0.44多不到0.5。
如果不放心,可以提交一个试试。
0.1初始的版本(30epoch)
:Train
和Validation
的Accuracy
都只有0.2
左右。0.1初始的版本(90epoch)
:Train
和Validation
的Accuracy
都只有0.36
左右。0.05初始的版本(不测30epoch只测90epoch,因为david官方是90)
:Train
和Validation
的Accuracy
都只有0.44
左右。
感觉这种情形是最高的,但是要看曲线,还是把曲线都画出来。然后根据曲线趋势再调整。曲线全都画完了
。
得出的结论就是Arcface可能loss的实现是没问题的,只是单纯训练的epoch太少
37文献是: