1.视频网站:mooc慕课https://mooc.study.163.com/university/deeplearning_ai#/c
2.详细笔记网站(中文):http://www.ai-start.com/dl2017/
3.github课件+作业+答案:https://github.com/stormstone/deeplearning.ai
4.4 Triplet 损失 Triplet loss
要想通过学习NN的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。
我们看下这是什么意思。
为了应用三元组损失函数,你需要比较成对的图像,为了学习网络的参数,你需要同时看几幅图片,比如
- 上图左边这对图片,你想要它们的编码相似,因为这是同一个人。
- 然而假如是上图右边这对图片,你会想要它们的编码差异大一些,因为这是不同的人。
用三元组损失的术语来说,你要做的通常是看一个 Anchor 图片,
- 你想让Anchor图片和Positive图片(Positive意味着是同一个人)的距离很接近。
- 然而,当Anchor图片与Negative图片(Negative意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。
这就是为什么叫做三元组损失,它代表你通常会同时看三张图片,你需要看Anchor图片、Postive图片,还有Negative图片,我要把Anchor图片、Positive图片和Negative图片简写成A、P、N。把这些写成公式的话,你想要的是网络的参数或者编码能够满足以下特性:
也就是说你想要 ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 ||f(A)-f(P)||^2 ∣∣f(A)−f(P)∣∣2,你希望这个数值很小,准确地说,你想让它小于等于 f ( A ) f(A) f(A)和 f ( N ) f(N) f(N)之间的距离,或者说是它们的范数的平方(即: ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 ≤ ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 ||f(A)-f(P)||^2\leq||f(A)-f(N)||^2 ∣∣f(A)−f(P)∣∣2≤∣∣f(A)−f(N)∣∣2)。
- ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 ||f(A)-f(P)||^2 ∣∣f(A)−f(P)∣∣2当然这就是 d ( A , P ) d(A,P) d(A,P),
- ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 ||f(A)-f(N)||^2 ∣∣f(A)−f(N)∣∣2这是 d ( A , N ) d(A,N) d(A,N)
你可以把 d d d 看作是距离(distance)函数,这也是为什么我们把它命名为 d d d。
现在如果我把方程右边项移到左边,最终就得到:
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 ≤ 0 ||f(A)-f(P)||^2-||f(A)-f(N)||^2 \leq 0 ∣∣f(A)−f(P)∣∣2−∣∣f(A)−f(N)∣∣2≤0
现在我要对这个表达式做一些小的改变。
有一种情况满足这个表达式,但是没有用处,就是把所有的东西都学成0。如果 f f f总是输出0,即0-0≤0,这就是0减去0还等于0,如果所有图像的 f f f都是一个零向量,那么总能满足这个方程。
所以为了确保网络对于所有的编码不会总是输出0,也为了确保它不会把所有的编码都设成互相相等的,另一种方法能让网络得到这种没用的输出,就是如果每个图片的编码和其他图片一样,这种情况,你还是得到0-0。
为了阻止网络出现这种情况,我们需要修改这个目标&#x