1. 假如深度学习模型已经有了 1000 万个人脸向量,如何通过查询来找到新的人脸?
这个问题是关于深度学习算法在实践中的应用,这个问题的关键是数据的索引方法。这是将 One Shot learning 应用于人脸识别问题的最后一步,但这一步是在实践中进行部署的最重要的一步。
基本上,回答这个问题,你应该先描述一下 One Shot learning 来进行人脸识别的方法一般性方法。它可以简单地理解为将每个人脸转换成一个向量,而新的人脸识别是寻找与输入人脸最接近(最相似)的向量。通常,人们会使用 triplet loss 损失函数的深度学习模型来实现这一点。然而,随着图像数量的增加,在每次识别中计算到 1000 万个向量的距离并不是一个明智的解决方案,这使得系统的速度慢了很多。为了使查询更加方便,我们需要考虑在实向量空间上索引数据的方法。这些方法的主要思想是将数据划分为便于查询新数据的结构(可能类似于树结构)。当有新数据可用时,在树中进行查询有助于快速找到距离最近的向量。有好几种方法可以用于这种目的,比如Locality Sensitive Hashing—LSH,Approximate Nearest Neighbors — Annoy Indexing等等。
2. 对于分类问题,精度指标是否完全可靠?你通常使用哪些度量来评估你的模型?
对于一个类问题,有许多不同的评估方法。在准确性方面,该公式简单地用正确预测数据点的个数除以总数据。这听起来很合理,但在现实中,对于不平衡的数据问题,这个数量还不够显著。假设我们正在构建一个网络攻击的预测模型(假设攻击请求占请求总数的 1/100000)。如果模型预测所有请求都是正常的,那么准确率也达到 99.9999%,而这个数字在分类模型中通常是不可靠的。上面的精度计算通常向我们展示了有多少百分比的数据是正确预测的,但并没有详细说明如何对每个类进行分类。相反,我们可以使用混淆矩阵。基本上,混淆矩阵显示了有多少数据点实际上属于一个类,并且被预测属于一个类。其形式如下:
除了表示真阳性和假阳性指标对应于定义分类的每个阈值的变化外,我们还有一个 ROC 图。根据 ROC 曲线,我们可以知道模型是否有效。理想的 ROC 曲线是最接近左上角的橙色线。真阳性比较高,假阳性比较低。
3. 激活函数是什么意思?激活函数的饱和区间是多少?
激活函数的意义
激活函数的产生是为了打破神经网络的线性特性。这些函数可以简单地理解为用一个滤波器来决定信息是否通过神经元。在神经网络训练中,激活函数在调节导数斜率中起着重要的作用。一些激活函数,如 sigmoid、fishy 或 ReLU,将在下面几节中进一步讨论。然而,我们需要理解的是,这些非线性函数的性质使得神经网络能够学习比仅仅使用线性函数更复杂的函数的表示。大多数激活函数是连续可微函数。
这些函数是连续函数,也就是说,如果输入的变量很小且可微(在其定义域内的每一点都有导数),那么输出就会有一个小的变化。当然,如上所述,导数的计算是非常重要的,它是决定我们的神经元能否被训练的决定性因素。提几个常用的激活函数,如 Sigmoid, Softmax, ReLU。
激活函数的饱和区间
Tanh、Sigmoid、ReLU 等非线性激活函数都有饱和区间。可以很容易理解的是,激活函数的饱和区间是指即使输入值改变,函数的输出值也不改变的区间。变化区间存在两个问题,即在神经网络的正向传播中,该层的数值逐渐落入激活函数的饱和区间,将逐渐出现多个相同的输出。
这将在整个模型中产生相同的数据流。这种现象就是协方差移位现象。第二个问题是,在反向传播中,导数在饱和区域为零,因此网络几乎什么都学不到。这就是我们需要将值范围设置为均值为 0 的原因.