ArcFace:加法角边界的判别性面部嵌入
什么是 ArcFace?
ArcFace 是一种用于人脸识别任务的高精度损失函数,由 Deng 等人在 2019 年提出。它的核心思想是在特征向量和归一化之后的权重向量之间,通过添加一个角度边距(Additive Angular Margin)来增强类间差异、缩小类内差异,从而学习出更具判别力的人脸嵌入。
与传统的 softmax 损失相比,ArcFace 直接在角度空间中施加约束,使得特征的分布更加紧凑且可分离。这一损失函数配合深度卷积神经网络(如 ResNet、MobileFaceNet 等),在 LFW、CFP-FP、AgeDB-30 等主流人脸验证基准上达到了当时的领先水平,并且至今仍是工业界和学术界广泛使用的基线方法。
核心动机:从 Softmax 到角度边际
普通人脸识别分类器通常使用 softmax 交叉熵损失:
[ L_{softmax} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{e^{W_{y_i}^T x_i + b_{y_i}}}{\sum_{j=1}^{n} e^{W_j^T x_i + b_j}} ]
其中 ( x_i ) 是第 ( i ) 个样本的深度特征,( W_j ) 是第 ( j ) 类的权重向量,( b_j ) 是偏置项。这种损失只关心分类是否正确,对类内紧致性和类间分离性没有显式约束。
为了产生更具判别性的嵌入,研究人员引入了边际(margin)的概念,迫使不同类别的特征之间保持一定的距离。ArcFace 将这一思路推进到了角度空间,并采用了加法的形式,易于优化。
从余弦空间到角度空间
对 softmax 进行归一化处理:固定偏置 ( b_j = 0 ),对特征 ( x_i ) 和权重 ( W_j ) 做 L2 归一化,得到 ( |x_i| = 1 )、( |W_j| = 1 ),并将 logit 转换为余弦形式:
[ W_j^T x_i = |W_j||x_i|\cos\theta_j = \cos\theta_j ]
此时 softmax 损失变为:
[ L_{norm} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{e^{s \cdot \cos\theta_{y_i}}}{\sum_{j=1}^{n} e^{s \cdot \cos\theta_j}} ]
其中 ( s ) 是缩放因子(通常为 64),用于补偿余弦值过小的问题。这里的 ( \theta_j ) 是特征向量与第 ( j ) 类权重向量之间的角度。
角度边距的引入
ArcFace 在目标类别(ground-truth)对应的角度 ( \theta_{y_i} ) 上添加了一个加法边距 ( m ):
[ L_{arc} = -\frac{1}{N}\sum_{i=1}^{N} \log \frac{e^{s \cdot \cos(\theta_{y_i} + m)}}{e^{s \cdot \cos(\theta_{y_i} + m)} + \sum_{j\neq y_i} e^{s \cdot \cos\theta_j}} ]
通过在目标 logit 中直接增加角度,迫使模型学习时,必须让目标类别的特征向量与对应权重向量之间的夹角比原来更小,从而拉大与非目标类别之间的角度差异。由于 ( \cos(\theta + m) < \cos\theta ),损失会更严格地惩罚那些角度不够小的样本。
算法细节与实现步骤
步骤 1:特征与权重的归一化
在网络的最后一层嵌入层后,对输出特征向量 ( x )(维度通常为 512)进行 L2 归一化。同时,分类器全连接层的权重矩阵 ( W ) 的每一列也进行 L2 归一化。
步骤 2:计算角度 ( \theta )
归一化后的 logit 就是特征向量与每个权重向量之间的余弦相似度。通过反余弦函数得到当前样本与每个类的夹角:
[ \theta_j = \arccos(W_j^T x) \quad (\text{注意:}0 \le \theta_j \le \pi) ]
在实现时,通常会使用 acos 函数,但需注意数值稳定性,将输入限制在 [-1 + eps, 1 - eps] 区间。
步骤 3:添加角度边距
对于目标类别 ( y_i ),将其角度替换为 ( \theta_{y_i} + m )。然后计算新的余弦值:( \cos(\theta_{y_i} + m) )。对于其他类别(( j \neq y_i )),保持原角度 ( \theta_j ) 不变。
步骤 4:缩放与交叉熵
将所有 logit 乘以缩放因子 ( s ) 后,输入标准的 softmax 交叉熵损失函数。
超参数选择
- 特征维度:常见为 512,部分轻量级模型使用 128 或 256。
- 缩放因子 ( s ):通常设为 64。过小会导致收敛困难,过大会使梯度过于平滑。
- 角度边距 ( m ):论文推荐 0.5(弧度),在典型数据集上表现优异。可根据任务难易程度调整,简单任务可减小,困难任务可增大。
伪代码(PyTorch 风格)
import torch
import torch.nn as nn
import torch.nn.functional as F
import math
class ArcFaceLoss(nn.Module):
def __init__(self, in_features, out_features, s=64.0, m=0.5):
super().__init__()
self.s = s
self.m = m
self.weight = nn.Parameter(torch.FloatTensor(out_features, in_features))
nn.init.xavier_uniform_(self.weight)
self.cos_m = math.cos(m)
self.sin_m = math.sin(m)
self.th = math.cos(math.pi - m) # cos(pi - m)
self.mm = math.sin(math.pi - m) * m
def forward(self, input, label):
# 归一化
x = F.normalize(input)
W = F.normalize(self.weight)
# 余弦相似度
cosine = F.linear(x, W)
# 计算角度并添加边距
sine = torch.sqrt(1.0 - torch.pow(cosine, 2).clamp(1e-7))
phi = cosine * self.cos_m - sine * self.sin_m # cos(theta + m)
# 当 cos(theta) 接近 -1 时,需要特殊处理
phi = torch.where(cosine > self.th, phi, cosine - self.mm)
# 构造 one-hot 标签
one_hot = torch.zeros_like(cosine)
one_hot.scatter_(1, label.view(-1, 1).long(), 1)
output = (one_hot * phi) + ((1.0 - one_hot) * cosine)
output *= self.s
loss = F.cross_entropy(output, label)
return loss
与其他边际损失的关系与对比
在角度边际损失家族中,ArcFace 并非唯一成员,但它的简洁性和有效性使其成为最受欢迎的一种。
- SphereFace (A-Softmax):最早将角度边际引入人脸识别,使用乘法角度边距 ( \cos(m\theta) )。这种形式较难优化,且对 ( m ) 的选择敏感。
- CosFace (AM-Softmax):使用加法余弦边距,即将目标 logit 变为 ( \cos\theta - m )。虽然稳定,但其几何意义不如角度空间直接。
- ArcFace:将边距直接加在角度上,同时具有明确的几何解释(角度距离)和稳定的优化特性。通常效果优于前两者。
ArcFace 的边际添加是在角度空间中,这使得决策边界的变化更加线性且直观,在大量实验中被证明能产生更紧致的类内分布和更清晰的类间分离。
训练技巧与注意事项
-
数据集的预处理
- 人脸对齐至关重要。使用 MTCNN 或 RetinaFace 检测人脸关键点,对齐到标准位置(如 112×112)。
- 数据清洗:去除模糊、遮挡严重或错误标注的图片,能明显提升性能。
-
骨干网络选择
- 常用 ResNet50、ResNet100 等,移除最后的 global average pooling 后的全连接层,替换为嵌入层(FC + BN + PReLU/ReLU 等)。
- 轻量级模型:MobileFaceNet、EfficientNet 等,适合移动端部署。
-
学习率与训练策略
- 使用带 warm-up 的余弦退火或阶梯下降策略。
- 批次大小尽量大(如 512 或 1024),以在 softmax 中获得更好的类中心估计。
- 采用 SGD 优化器,动量 0.9,权重衰减 5e-4。
-
评估标准
- 人脸验证:通过计算两张人脸嵌入的余弦相似度,设定阈值判断是否同一人。
- 常用指标:LFW、CFP-FP、AgeDB-30 的准确率,以及 MegaFace 的 Rank-1 识别率等。
-
工程实现优化
- 类别数量极大时(百万级),可采用部分 FC(Partial FC)减少显存消耗。
- 混合精度训练(AMP)可加速训练过程。
实际应用与效果
ArcFace 已成为人脸识别领域的基石之一。在公开评测上,仅使用 MS-Celeb-1M 清洗后的数据集,ArcFace 在 LFW 上达到 99.83%,CFP-FP 达到 98.37%,AgeDB-30 达到 98.28%。配合更大的数据(如 Glint360K)和更强的骨干网络,性能进一步提升。
工业实践中,ArcFace 广泛用于手机解锁、门禁系统、支付验证等场景。其嵌入矢量可以直接用于 1:1 验证和 1:N 搜索,无需额外度量学习损失,极大简化了人脸识别系统的训练流程。
总结
ArcFace 通过简单而优雅的加法角度边距,成功地将特征嵌入的学习推向了判别性更强的方向。它建立在归一化 softmax 损失的基础上,改动极小但效果显著。理解 ArcFace 不仅需要掌握其数学形式,更重要的是明白它为何在角度空间工作,以及如何通过边距控制类内类间距离。对于希望深入人脸识别的初学者,从 ArcFace 入手是最佳路径之一,它将为你理解和实现更先进的识别框架打下坚实的基础。