4-4 面部验证与二分类
面部验证与二分类 (Face verification and binary classification)
另一个训练神经网络的方法是选取一对神经网络,选取 Siamese 网络,使其同时计算这些嵌入,比如说 128 维的嵌入,或者更高维,然后将其输入到逻辑回归单元,然后进行预测,如果是相同的人,那么输出是 1,若是不同的人,输出是 0。这就把人脸识别问题转换为一个二分类问题,训练这种系统时可以替换 Triplet loss 的方法。
输出${\hat y}$会变成,比如说 sigmoid 函数应用到某些特征上,相比起直接放入这些编码$(f({x^{(i)}}),f({x^{(j)}}))$ ,你可以利用编码之间的不同。
$\hat y = \sigma (\sum\limits_{k = 1}^{128} {{w_i}} \left| {f{{({x^{(i)}})}_k} - f{{({x^{(j)}})}_k}} \right| + b)$
符号${f{{({x^{(i)}})}_k}}$代表图片${x^{(j)}}$ 的编码,下标k代表选择这个向量中的第k个元素,$\left| {f{{({x^{(i)}})}_k} - f{{({x^{(j)}})}_k}} \right|$对这两个编码取元素差的绝对值。你可能想,把这 128 个元素当作特征,然后把他们放入逻辑回归中,最后的逻辑回归可以增加参数${{w_i}}$和b,就像普通的逻辑回归一样。你将在这 128 个单元上训练合适的权重,用来预测两张图片是否是一个人,这是一个很合理的方法来学习预测 0 或者 1,即是否是同一个人。
还有其他不同的形式来计算,例如:
$\hat y = \sigma (\sum\limits_{k = 1}^{128} {{w_i}} \frac{{{{(f{{({x^{(i)}})}_k} - f{{({x^{(j)}})}_k})}^2}}}{{f{{({x^{(i)}})}_k} + f{{({x^{(j)}})}_k}}} + b)$
这个公式也被叫做${\chi ^2}$。
但是在这个学习公式中,输入是一对图片,这是你的训练输入x(编号 1、 2),输出y是 0 或者 1,取决于你的输入是相似图片还是非相似图片。与之前类似,你正在训练一个Siamese 网络,意味着上面这个神经网络拥有的参数和下面神经网络的相同,两组参数是绑定的,这样的系统效果很好。
之前提到一个计算技巧可以帮你显著提高部署效果,如果这是一张新图片(编号 1),当员工走进门时,希望门可以自动为他们打开,这个(编号 2)是在数据库中的图片,不需要每次都计算这些特征(编号 6),不需要每次都计算这个嵌入,你可以提前计算好,那么当一个新员工走近时,你可以使用上方的卷积网络来计算这些编码(编号 5),然后使用它,和预先计算好的编码进行比较,然后输出预测值${\hat y}$。
因为不需要存储原始图像,如果你有一个很大的员工数据库,你不需要为每个员工每次都计算这些编码。这个预先计算的思想,可以节省大量的计算,这个预训练的工作可以用在Siamese 网路结构中,将人脸识别当作一个二分类问题,也可以用在学习和使用 Triplet loss函数上,我在之前的视频中描述过。
总结一下,把人脸验证当作一个监督学习,创建一个只有成对图片的训练集,不是三个一组,而是成对的图片,目标标签是 1 表示一对图片是一个人,目标标签是 0 表示图片中是不同的人。利用不同的成对图片,使用反向传播算法去训练神经网络,训练 Siamese 神经网络。