视频封面

视频元信息

  • 课程来源:吴恩达(Andrew Ng)深度学习专项课程 · 第四门课《卷积神经网络》· 第四周
  • 本讲主题:Triplet Loss(三元组损失)
  • 视频时长:约 10 分钟
  • 语言:英文讲解(官方中英字幕课程)

内容摘要(TL;DR)

本讲介绍人脸识别中训练编码网络的核心损失函数——Triplet Loss(三元组损失)。通过锚点(Anchor)、正例(Positive)、负例(Negative)三张图片,要求"锚点与正例的距离"比"锚点与负例的距离"至少小一个边界值 α(margin),从而让网络学到有区分度的编码。同时讲解了 softmax 目标函数的缺陷、margin 的作用、如何挑选难训练的三元组以及大规模数据集与预训练模型的现实考量。


一、问题引入:为什么需要三元组损失 [00:00]

吴恩达首先回顾了上一讲的内容背景:我们希望神经网络输出的编码(encoding)能让同一个人的两张照片距离很近,不同人的照片距离很远。

理解:这里的"编码"指的是神经网络把一张人脸图片映射成的一个向量(例如 128 维),这个向量就是该人脸的"数字身份证"。

核心目标:定义一个好的损失函数,让网络学到的编码满足"同类近、异类远"的性质。


二、三元组损失的形式化定义 [01:23]

2.1 三个基本概念

给定三张图片:

  • A(Anchor,锚点):基准图片
  • P(Positive,正例):与锚点同一个人的另一张图片
  • N(Negative,负例):与锚点不同人的图片

2.2 形式化目标

我们希望编码满足以下性质:

$$|f(A) - f(P)|^2 \leq |f(A) - f(N)|^2$$

即:锚点与正例的距离(记为 $d(A,P)$)要小于等于锚点与负例的距离(记为 $d(A,N)$)。

理解:$d$ 是 distance(距离)的缩写,这里用的是编码向量差的平方范数,即欧氏距离的平方。

2.3 移项整理

把右边的项移到左边:

$$|f(A) - f(P)|^2 - |f(A) - f(N)|^2 \leq 0$$


三、关键问题:平凡解(Trivial Solution) [02:34]

易错点:如果只要求上面这个式子 ≤ 0,神经网络会"偷懒"!

网络可能学到以下两种平凡解:

  1. 所有编码都输出零向量:则 $0 - 0 = 0$,不等式几乎自动满足;
  2. 所有图片编码完全相同:则任意两张图片距离都是 0,不等式同样自动满足。

这两种情况下,网络什么都没学到,但损失函数却"看起来"被满足了。

3.1 解决方案:引入 Margin(边界)α

为了防止网络输出平凡解,我们修改目标:

$$|f(A) - f(P)|^2 - |f(A) - f(N)|^2 \leq -\alpha$$

即要求左边不只是小于等于 0,而是要比 0 小得多。

按惯例,通常把负号写成加号形式:

$$|f(A) - f(P)|^2 - |f(A) - f(N)|^2 + \alpha \leq 0$$

理解:α 是一个超参数,叫做 margin(边界/间隔)。这个术语在支持向量机(SVM)的文献中也会见到。


四、Margin 的直观理解与数值例子 [04:17]

4.1 数值案例

假设 margin α = 0.2:

  • 如果 $d(A,P) = 0.5$;
  • 而 $d(A,N) = 0.51$。

虽然 0.51 > 0.5,看似满足"锚点离负例更远",但不满足 margin 要求。

因为需要:$d(A,N) - d(A,P) \geq \alpha = 0.2$,即 $d(A,N)$ 至少要达到 0.7 或更高。

4.2 Margin 的作用

考点:margin 参数的作用是"推开"锚点-正例对与锚点-负例对,让它们之间至少保持 α 的间距。

实现这个间距有两种方式:

  • 把 $d(A,P)$ 往下压(让正例更靠近锚点);
  • 把 $d(A,N)$ 往上推(让负例更远离锚点)。

五、三元组损失函数的正式定义 [05:34]

5.1 单个三元组的损失

$$L(A, P, N) = \max\left(|f(A) - f(P)|^2 - |f(A) - f(N)|^2 + \alpha,\ 0\right)$$

5.2 max 操作的含义

  • 如果括号内 ≤ 0:说明已经满足目标(间距足够),$\max$ 取 0,损失为 0;
  • 如果括号内 > 0:说明还没满足目标,$\max$ 取括号内的值,产生正的损失。

理解:只要满足要求,网络就不关心"负得更多",即一旦达标,梯度消失,不再优化。这正是 hinge loss(合页损失)的思想。

5.3 整体代价函数

$$J = \sum_{i=1}^{m} L(A^{(i)}, P^{(i)}, N^{(i)})$$

即对所有训练三元组的损失求和,用梯度下降最小化。


六、训练集构建的要求 [07:44]

6.1 数据要求

易错点:训练三元组损失,必须有"同一个人的多张照片"。

举例:如果训练集有 10,000 张图片、1,000 个人,平均每人 10 张照片,这样才能构造出 (A, P) 同人的配对。

如果每个人只有一张照片,则无法训练这个系统。

6.2 训练与应用的分离

  • 训练阶段:需要同一人多张照片来构造三元组;
  • 应用阶段:可以用于 one-shot learning(单样本学习),即只有一张目标照片也能识别。

七、如何挑选三元组:难样本挖掘 [09:19]

7.1 随机挑选的问题

如果从训练集中随机挑选 A、P、N(仅满足 A 与 P 同人、A 与 N 不同人):

  • 随机两张不同人的照片,$d(A,N)$ 通常远大于 $d(A,P)$;
  • 约束很容易满足,损失为 0,梯度下降学不到东西。

7.2 正确做法:挑选"难训练"的三元组

考点:应选择那些难以满足约束的三元组,即 $d(A,P) \approx d(A,N)$ 的样本。

这样梯度下降才"有事可做",需要努力把 $d(A,N)$ 推高、把 $d(A,P)$ 压低,从而提升学习效率和计算效率。

7.3 相关论文

这一思想来自 FaceNet 论文,作者为 Florian Schroff、Dmitry Kalenichenko、James Philbin。

拓展:吴恩达提到深度学习领域命名算法的"趣梗"——在某领域就叫"XX Net"或"Deep XX"。人脸识别领域因此有 FaceNet、DeepFace 等命名。


八、训练流程总结 [09:40]

训练三元组损失的完整流程:

  1. 准备训练集,映射为大量三元组 (A, P, N);
  2. 每个三元组中:A 与 P 同人,A 与 N 不同人;
  3. 用梯度下降最小化代价函数 $J$;
  4. 反向传播更新网络全部参数,学到良好的人脸编码。

最终效果:同一个人的两张图片编码距离小,不同人的图片编码距离大。


九、现实考量:大规模数据集与预训练模型 [09:50]

重点:商业人脸识别系统通常用超大规模数据集训练。

  • 常见规模:超过 100 万张图片;
  • 部分公司:超过 1000 万张;
  • 少数公司:超过 1 亿张。

这些数据集难以获取。因此:

  • 幸运的是,一些公司已将训练好的网络参数公开发布;
  • 由于数据量巨大,这一领域常常推荐直接下载别人的预训练模型,而非从零训练;
  • 但即便如此,理解这些算法如何训练仍然很有价值,以便在需要时自己从头应用到特定场景。

十、本讲小结与下讲预告

  • 三元组损失通过 margin α 保证编码的区分度;
  • 难样本挖掘能显著提升训练效率;
  • 大规模人脸识别依赖海量数据和预训练模型;
  • 下一讲:介绍 Siamese 网络的其他变体及训练方法。

关键标签 / 关键词

#吴恩达 #深度学习 #卷积神经网络 #人脸识别 #TripletLoss #三元组损失 #Siamese网络 #FaceNet #Margin #One-shot学习 #难样本挖掘 #编码 #梯度下降 #预训练模型


生成时间:2026-10-11 00:56:08 生成平台:VideoNote www.xygy.top