← 阅读室全部精读正在排版公式与图表…
PAPER ANALYZER · P23 · 跨场景方向

PCL:姿态解耦与对比学习怎样塑造人脸表示

交换重建、正负增强与冻结线性评价的完整解释

Liu 等 · CVPR 2023 · 9717–9728 · 学术型 · 核查于2026-10-23

一句话总结

PCL 用因素交换重建与两类对比学习改善通用人脸表示;姿态不变性、代码差异和各下游任务边界必须分清。

为什么研究表情还要学习头部姿态

Pose-Disentangled Contrastive Learning for Self-Supervised Facial Representation,简称 PCL,发表于 CVPR 2023。它研究通用人脸表征的自监督学习,而不是专门的情绪分类器,也不是持续学习。目标是在不使用预训练阶段人工任务标签的情况下,学习能够支持表情识别、人脸验证、动作单元检测和姿态估计的表示。

一个人的脸向左转时,像素和几何结构变化很大,但身份与部分表情信息可能不变。如果把这些变化全部混在同一个向量中,模型可能把头部朝向当作身份或情绪的捷径。PCL 尝试把姿态相关与姿态无关的面部因素分开训练,同时保留一个通用主干表示供不同下游任务使用。

自监督不是完全没有监督信号,而是从数据变换与样本关系构造信号。同一图片的增强版本通常视为正对,不同图片视为负对;重建原图也提供像素级约束。这里最关键的问题是变换对不同因素的意义不同:翻转可能不改变身份,却会改变面部朝向,因此不能对所有分支使用完全相同的正负关系。

Figure 1 说明姿态混杂问题,Figure 2 给出整体框架,Figure 3 展示解耦重建。初学者可以先把一张人脸和它的水平翻转并排画出,问哪些信息应该共享、哪些应该变化,再理解两个分支的职责。不要一开始就把“姿态无关”理解为统计上已证明完全独立,论文使用的是训练约束而非可识别性定理。

PDD:交换两个因素,再要求把图像重建回来

主干 B 先提取通用特征 Fs,两个分支分别输出面部因素 Ff 与姿态因素 Fp。输入原图 s 和翻转图 ŝ 后,得到两组因素。解码器既重建原始组合,也重建交换组合:原图的面部因素加翻转图的姿态因素,应形成翻转图;反过来则应形成原图。这个交换约束给两个分支分工的压力。

如果解码器只接受一组不交换的向量,它可能任意分配信息,甚至一个分支包办全部重建。交叉组合迫使被交换的部分携带能够改变朝向的信息,另一个部分尽量保留共享面部内容。不过神经网络仍可能找到其他编码方式,因此交换重建成功是有用证据,不是数学意义上唯一解耦的证明。

正交约束进一步减少两分支重叠信息。原文以两种表示的内积约束说明思想,公开代码实际对批量中心化、逐样本归一化后的特征计算跨维相关矩阵平方均值。二者相关但不完全相同;精确复现应报告采用论文公式还是当前公开实现,不能把这种差异悄悄抹去。

训练后下游通常使用主干 Fs,而不是仅使用被称为姿态无关的 Ff。原因是四类任务需要的信息不同:姿态估计恰好需要姿态信息。论文 Table 7 比较不同特征,主干对表情和身份表现较好,而拼接分支在 AU 上可能更好。解耦训练是改善通用表示的手段,不是要求所有任务都扔掉姿态。

flowchart TD
 S[原图与翻转图] --> B[共享主干Fs]
 B --> F[面部因素分支Ff]
 B --> P[姿态因素分支Fp]
 F --> D[原组合与交换组合解码]
 P --> D
 D --> R[四项重建约束]
 F --> FC[面部对比学习]
 P --> PC[姿态对比学习]
 R --> L[联合优化与动态权重]
 FC --> L
 PC --> L
 B --> E[冻结主干 后训练下游线性头]

公式:正负样本关系比损失名称更重要

$$D(F_f,F_p)\approx s,\quad D(F_f,\widehat F_p)\approx\widehat s$$

原文 Eq.1 的前两种组合。D 是解码器。面部因素固定而换姿态因素,目标图像的朝向随之变化。另两种组合使用翻转图的面部因素,分别与两种姿态因素配合。四种约束一起限制信息分工。

$$\mathcal L_{dis}=\sum_{a,b\in\{0,1\}}\|D(F_f^{(a)},F_p^{(b)})-s^{(b)}\|_1$$

原文 Eq.2 的紧凑重写。上标零与一代表原图和翻转图,目标由姿态分支的来源决定。L1 是各像素绝对差的汇总,不是情绪分类误差;重建清晰也不必然意味着情绪表示更好,所以还需要下游评价。

$$\mathcal L_{orth}\propto (F_f^\top F_p)^2+(\widehat F_f^\top\widehat F_p)^2$$

原文 Eq.3 的思想表示。使两个因素的线性重叠变小。向量正交只能限制某种线性关系,不能保证统计独立;两个变量可能内积很小却仍有非线性依赖。源码的批量跨维版本见后文,不能与此简式完全等同。

$$\ell_i=-\log\frac{\exp(\operatorname{sim}(z_i,z_i^+)/\tau)}{\sum_{j\ne i}\exp(\operatorname{sim}(z_i,z_j)/\tau)}$$

面部对比分支 Eq.6 的常见形式。正对是同一图片的两种增强,其余非自身样本参与分母。温度 τ 控制相似度差异被放大的程度。这个式子与姿态分支的样本构造要一起读;仅写出 InfoNCE 名称并不能说明模型学到了哪种不变性。

$$\mathcal L_{PDD}=\mathcal L_{dis}+\mathcal L_{orth}$$

原文 Eq.4。像素重建要求信息足够,正交约束要求分支不要过度重复。只最小化正交项可以通过退化表示轻易做到,重建约束用于阻止这种无用解;两项互相制约,不能孤立地评价其中一项。

$$\mathcal L=\mathcal L_{PDD}+\alpha_p\mathcal L_{pose}+\alpha_f\mathcal L_{face}$$

原文 Eq.7。姿态对比与面部对比采用动态权重平衡。若某项训练速度或尺度与其他项差异很大,固定等权可能使一个任务主导。动态权重并不是保证最优的魔法参数,仍需通过固定权重消融检查贡献。

姿态分支把保留朝向的增强作为正关系,把改变朝向的翻转或旋转作为负关系;面部分支则强调同一人脸增强间的一致。三个原文关键词“disentangled”“contrastive”“pose”对应分工、关系约束和被单独建模的因素。学习时要为每种增强写清“对哪一个分支保持什么”,避免把所有增强一律视为正样本。

原文姿态损失的分母写法与常见包含正项的交叉熵形式存在差异。当前源码先拼接正相似度与负相似度,再用交叉熵处理,因此实际归一化包含正项;还出现负特征混合操作。这些细节说明当前仓库不能只按论文公式逐字推测,复现时应固定提交并记录偏差。

实验:通用性要看多个下游任务

原文 Tables 1–4:冻结表征后的下游评价,姿态误差越低越好
任务SimCLRPCL
FER2013准确率49.5156.81
RAF-DB准确率71.0674.47
LFW验证准确率75.9779.72
CPLFW验证准确率62.2564.61
DISFA平均AU F149.454.8
AFLW2000姿态MAE/度14.3812.36

同一预训练表示在四类任务上改善,支持通用人脸表征的目标。但不能把所有数字加起来求一个没有单位意义的总分:准确率、AU F1 和角度误差衡量不同对象。部分监督方法在表情识别上仍高于 PCL,说明自监督收益不等于全面超过使用标签的方法。

原文 Table 5:RAF-DB 线性评价消融
设置准确率
SimCLR基线71.06
加入重建71.47
继续加入正交72.39
继续加入姿态对比73.73
完整动态权重74.47

这张逐步消融表表明每个环节在该设置下有增益,但不能证明模块之间没有交互。Table 6 还显示仅给 SimCLR 增加姿态相关策略已到七十三点一七,接近不使用动态权重的七十三点七三。也就是说,增强与正负对设计贡献很大,不能把全部收益都归于复杂的解码结构。

AU 平均提升也不是每个动作单元都提升:Table 3 中 AU2、AU12 和 AU26 相对 SimCLR 出现下降。细粒度研究应该查看每个 AU 的样本数、可见度与误差,而不是只展示平均 F1。对姿态角度也应分别查看俯仰、偏航和翻滚,避免平均误差掩盖大角度侧脸的困难。

论文预训练使用 VoxCeleb 大量片段、每秒六帧、六十四像素人脸与千轮级训练,批量二百五十六。下游冻结主干训练线性头约三百轮,不同任务图像尺寸不同。这里的“线性评价”不是端到端微调,因此与一个全网络微调结果直接比较会改变监督预算与可训练容量。

源码:最有价值的是发现公式与实现的距离

源码:Models/exppose.py,L17–33(固定提交 6e71d4110873)

    def forward(self, input1, input2):
        # Zero mean
        input1_mean = torch.mean(input1, dim=0, keepdims=True)
        input2_mean = torch.mean(input2, dim=0, keepdims=True)
        input1 = input1 - input1_mean
        input2 = input2 - input2_mean

        input1_l2_norm = torch.norm(input1, p=2, dim=1, keepdim=True).detach()
        input1_l2 = input1.div(input1_l2_norm.expand_as(input1) + 1e-6)

        input2_l2_norm = torch.norm(input2, p=2, dim=1, keepdim=True).detach()
        input2_l2 = input2.div(input2_l2_norm.expand_as(input2) + 1e-6)

        diff_loss = torch.mean((input1_l2.t().mm(input2_l2)).pow(2))
        #diff_loss = torch.mean((input1_l2 * input2_l2).sum(dim=1).pow(2))

        return diff_loss

这段 DiffLoss 对特征先按批量中心化,再逐样本归一化,最终计算维度间相关矩阵平方均值。归一化分母使用 detach,使梯度路径也与完全可微的标准归一化不同。初学者无需立即判断哪种更好,先用小张量比较“每样本点积”和“批量跨维相关”数值为何不同即可。

源码:Models/exppose.py,L371–383(固定提交 6e71d4110873)

        pos = torch.cat(
            [torch.einsum('nc,nc->n', [q, k]).unsqueeze(-1), torch.einsum('nc,nc->n', [k, q]).unsqueeze(-1)], dim=0)

        fea_neg_tensor = fea_neg_tensor.transpose(2, 1)
        neg = torch.bmm(features.view(b, 1, -1), fea_neg_tensor).view(b, -1)

        logits = torch.cat([pos, neg], dim=1)
        labels = torch.zeros(logits.shape[0], dtype=torch.long).cuda()

        logits = logits / self.temperature
        # print('cost time: {}'.format(time.time() - time_start))

        return logits, labels

正相似度放在 logits 第一列,标签全为零,随后交给交叉熵。这意味着分母包含第一列正项。配置 remote_PCL_vox.yaml 的 epochs 为六千,而论文描述千轮级训练;当前配置还含负样本混合参数。这些差异需要在实验记录中说明,不能直接运行仓库默认值后宣称严格对应论文主表。

学习与复现:先做交换实验,再考虑大规模预训练

第一步取十张有权限的人脸图片,生成水平翻转、轻微旋转、裁剪与颜色扰动,为每一种变换写一张表:身份、表情和姿态分别是否应该保持。验收是至少找到一个“同一增强对不同任务意义不同”的例子,解释为什么翻转对身份可作正对,对姿态却可能需要负关系。

第二步用随机小向量实现四种因素组合与 L1 重建目标,检查目标图由姿态因素来源决定。先不要追求重建漂亮;打印每个分支梯度,确认面部与姿态编码器都收到信号。验收是交换一个分支时对应目标正确,且没有把原图与翻转图的目标顺序写反。

第三步在很小的数据子集上验证正交项与对比项数值,画出特征范数和两分支相关性随训练变化。若相关性下降但全部特征也趋近零,属于退化而非成功解耦。验收必须同时有重建误差、特征方差和简单下游读出,不能只看一个损失曲线下降。

第四步优先使用有来源记录的预训练权重做冻结线性评价,建立与随机初始化主干相同的分类头和划分。只在验证集选择超参数,测试集最后评估一次。若使用与论文不同的脸部裁剪、输入尺寸或身份划分,明确称为本地兼容实验;这些变化会影响结论,不能被一个相近准确率掩盖。

细粒度扩展可以研究局部 AU 与姿态分支是否仍混杂:按头部角度分组报告每个 AU 的 F1,检查侧脸时哪一类局部动作退化最明显。跨场景扩展可以固定主干,在不同拍摄条件下训练相同线性头,观察表示是否依赖场景或身份。先控制任务与监督量,才有资格解释迁移能力。

作者后续方向与独立判断

作者提出进一步考虑年龄、化妆、遮挡等因素。当前只针对姿态进行特定解耦,不能据此声称所有无关因素都已消除。水平翻转也不是完整的真实三维头部旋转;它保留很多镜像结构,与遮挡变化和大角度转头的物理过程仍有差异。

本文独立判断是:PCL 很适合作为“表示如何被训练关系塑造”的学习案例,但负样本默认互异的假设仍可能排斥语义相似的人脸。两个不同样本可能具有相同姿态或相近表情,却被一起推开。这正是后续 PCFRL 讨论样本凝聚与假负样本的自然入口,学习顺序是概念延伸,并非把两个模型串成推理流水线。

把机制变成可以复查的实验记录

阅读线性评价时,要分清预训练、冻结与分类头训练三段。自监督主干先使用无任务标签的人脸数据学习,再固定参数,只用下游标签训练一个简单读出层。这样测试的是已有表示中信息是否容易被读取。若随后允许整个主干更新,结果回答的是微调能力,不能继续沿用同一线性评价标题。

身份泄漏尤其容易影响人脸研究。同一个人的不同视频如果出现在训练与测试两侧,模型可能利用身份或拍摄条件,而不是目标表情。应按数据集官方协议核对划分,并记录预训练与下游数据是否存在身份重叠。不能仅凭文件路径不一样判断样本独立,更不能把相邻视频帧随机划分当作跨场景泛化。

交换重建的可视化应做成四格:原面部配原姿态、原面部配翻转姿态、翻转面部配原姿态、翻转面部配翻转姿态。每格标出目标图与重建图,单独计算误差。这样能看出模型是否真正按姿态来源改变图像,而不是只重建一张模糊平均脸来降低总体像素损失。

正交约束的反例也值得手算。两个向量在某个样本上内积为零,不代表两个随机变量独立;一个分支可能通过非线性方式编码另一个分支的信息。可以训练一个小预测器,用面部因素预测姿态角度,作为残留信息探针。探针失败也受容量限制,因此应解释为当前探针未读出,而非绝对无信息。

批量大小改变会影响对比学习中的负样本数量与难度。若为了显存把二百五十六降到十六,不能认为只改变了训练速度;目标函数看到的关系集合也变了。可以用梯度累积扩大有效优化批量,但它并不自动把跨累积步骤的特征放入同一个对比分母,二者在机制上并不完全等价。

公开代码中的负特征混合意味着负样本不一定对应一张真实图片,而可能是两个特征的组合。分析错误时不能只回看一个负样本文件就解释该梯度来源。应先固定是否启用混合,再与不混合版本比较,并记录混合系数的分布;这些工程选择可能对复现结果有实质影响。

最终验收报告应至少展示一个重建交换例、一个正负增强表和一个冻结读出结果。若只做完随机张量检查,结论应是机制实现通过基本检查;若完成小数据训练,结论是小规模验证;只有满足原始数据与协议并取得可比结果,才讨论论文复现程度。这样的分层能让每一步进展真实且可积累。

原文与核验边界

论文原文及出版信息。本篇依据全文、附录和表格编写;文中的教学计算与研究建议均不冒充作者实验证据。核验日期:2026-10-23。

自己的解释与验收记录

写出一条输入到输出的链路、一个关键公式的含义,以及你完成的最小检查。笔记仅保存在当前浏览器,可从主站「我的学习笔记」导出。