你想要神经网络学习这样一个用𝑑表示的函数,𝑑(𝑖𝑚𝑔1,𝑖𝑚𝑔2) =𝑑𝑒𝑔𝑟𝑒𝑒 𝑜𝑓 𝑑𝑖𝑓𝑓𝑒𝑟𝑒𝑛𝑐𝑒 𝑏𝑒𝑡𝑤𝑒𝑒𝑛 𝑖𝑚𝑎𝑔𝑒𝑠,它以两张图片作为输入,然后输出这两张图片的差异值。如果你放进同一个人的两张照片,你希望它能输出一个很小的值,如果放进两个长相差别很大的人的照片,它就输出一个很大的值。所以在识别过程中,如果这两张图片的差异值小于某个阈值𝜏,它是一个超参数,那么这时就能预测这两张图片是同一个人,如果差异值大于 τ,就能预测这是不同的两个人,这就是解决人脸验证问题的一个可行办法。
因为这两张照片是同一个人,所以我们希望会输出一个很小的数。然后你再用它与数据库中的其他图片(编号 3、4)进行比较,通过这样的计算,最终你能够知道,这个人确实是 Danielle。 如果之后有新人加入了你的团队(编号 5),你只需将他的照片加入你的数据库,系统依然能照常工作。
最后如果你相信这些编码很好地代表了这两个图片,你要做的就是定义𝑑,将𝑥(1)和𝑥(2)的距离定义为这两幅图片的编码之差的范数: 这两个网络有相同的参数,所以你实际要做的就是训练一个网络,它计算得到的编码可以用于函数𝑑,它可以告诉你两张图片是否是同一个人。
要想通过学习神经网络的参数来得到优质的人脸图片编码,方法之一就是定义三元组损失函数然后应用梯度下降。
用三元组损失的术语来说,你要做的通常是看一个 Anchor 图片,你想让 Anchor 图片和 Positive 图片(Positive 意味着是同一个人)的距离很接近。然而,当 Anchor 图片与 Negative图片(Negative 意味着是非同一个人)对比时,你会想让他们的距离离得更远一点。 总结一下,训练这个三元组损失你需要取你的训练集,然后把它做成很多三元组。
总结一下,把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,而是成对的图片,目标标签是 1 表示一对图片是一个人,目标标签是 0 表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练神经网络,训练 Siamese 神经网络。
𝐽content(𝐶, 𝐺) 第一部分被称作内容代价,这是一个关于内容图片和生成图片的函数,它是用来度量生成图片𝐺的内容与内容图片𝐶的内容有多相似。
𝐽style(𝑆, 𝐺) 然后我们会把结果加上一个风格代价函数,也就是关于𝑆和𝐺的函数,用来度量图片𝐺的风格和图片𝑆的风格的相似度。
𝐽(𝐺) = 𝑎𝐽content(𝐶, 𝐺) + 𝛽𝐽style(𝑆, 𝐺) 最后我们用两个超参数𝑎和𝛽来来确定内容代价和风格代价。
现在你需要衡量假如有一个内容图片和一个生成图片他们在内容上的相似度,我们令这个𝑎[𝑙][𝐶]和𝑎[𝑙][𝐺],代表这两个图片𝐶和𝐺的𝑙层的激活函数值。如果这两个激活值相似,那么就意味着两个图片的内容相似。
现在我们来证实这种说法,对于这两个图像,也就是风格图像与生成图像,你需要计算一个风格矩阵,说得更具体一点就是用𝑙层来测量风格。 这就是输入的风格图像所构成的风格矩阵,然后,我们再对生成图像做同样的操作: 因为这里有𝑛𝑐个通道,所以矩阵的大小是𝑛𝑐 × 𝑛𝑐。以便计算每一对激活项的相关系数,所以𝐺kk′ [𝑙] 可以用来测量𝑘通道与𝑘′通道中的激活项之间的相关系数,𝑘和 𝑘′会在 1 到𝑛𝑐之间取值,𝑛𝑐就是𝑙层中通道的总数量。
最后,如果我们将𝑆和𝐺代入到风格代价函数中去计算,这将得到这两个矩阵之间的误差,因为它们是矩阵,所以在这里加一个𝐹(Frobenius 范数,编号 1 所示),这实际上是计算两个矩阵对应元素相减的平方的和,使用了一个归一化常数,也就是 1/(2𝑛𝐻[𝑙]𝑙𝑛W[𝑙]𝑙𝑛C[𝑙]𝑙),再在外面加一个平方。