1.引入
人脸识别(Human Face Recognition)是使用应用软件中鉴别软件的操作者是不是期待的操作者的一种普遍的技术,用户通过用户名和密码的方法正在逐渐被人脸识别的方法所取代。操作者通过摄像头获取使用软件者的面部信息,与存在数据库中面部基础信息进行比对,然后判断软件的操作者是不是期待的操作者。类似于这样的技术还有声音识别(通过声音鉴别发声者是不是你),视频识别(通过视频寻找你是不是在这个视频中)等。这些应用在人工智能深度学习中都属于向量搜索的技术范畴,现在给大家简单介绍一下向量搜索。
2.人脸识别的案例
一般而言基础信息中的图像、音频、视频信息通过向量化存储在数据库中。比如一张面部照片存储在数据库中是一个经过向量化处理过的数据,而且这个向量化数据高达上千维,比如A=[1.34,5.43,9.12,2.11,323.80,…,43.01,711.20];在使用这个软件的时候,获取的实时脸部图像信息也通过相同的向量化算法转为一个向量数据。比如是B=[2.56,7.43,6.43,2.28,78.68,…,120.04,11.37];然后获得向量A与向量B的余弦相似度进行辨别,如果余弦相似度接近1,表明人脸识别成功;否则认为识别失败。下面分别来介绍一项向量化和余弦相似度两个概念。
3.向量化
向量化是把图像、音频、视频信息转换为向量的方法。向量化的方法主要分为基于特征的向量化方法和基于卷积神经网络的向量化两种方法。
基于特征的向量化方法主要是通过提取图像的色彩、纹理、形状等特征,然后将这些特征转化为向量。由于基于特征的向量化方法在处理复杂、模糊的图像时效果不太理想,所以一般不使用。
基于卷积神经网络的向量化可以自动学习从原始像素到高级语义特征的映射关系,从而提取出更加复杂和抽象的特征。这些特征向量不仅包含了图像的底层信息,还包含了高级的语义信息,因此可以更好地表示图像的内容。
深入了解基于特征的向量化和基于卷积神经网络的向量化需要具备高等数学的知识,在这里不进行介绍,有兴趣的同学可以寻找相关资料学习。
4.余弦相似度
4.1余弦相似度与余弦相似度公式
余弦相似度即计算向量A与向量B夹角的余弦值,如果这个值接近1,表明被识别两个对象相似;否则认为识别两个对象不相似。余弦相似度公式为:
对于向量A与B,cos(θ)=A·B/|A|*|B|。
假设一个二维向量A与B:
向量A(x1,y1,…,m1);
向量B(x2,y2,…,m2);
向量A(x1,y1,…,m1)与向量B(x2,y2,…,m2)夹角为θ。
那么:
cos(θ)=A·B/|A|*|B|=(x1x2 y1y2 … m1m2)/(x12 y12 … m12)1/2*(x22 y22 … m22)1/2
4.2 一个例子
比如向量A[1,2,3],向量B[4,5,6],那么
代码语言:javascript复制cosθ=A·B/|A|*|B|
由于:
代码语言:javascript复制A·B=1*4 2*5 3*6=4 10 18=32
|A|*|B|=(1*1 2*2 3*3)1/2*(4*4 5*5 6*6)1/2
=(1 4 9)1/2*(16 25 36)1/2
=141/2*771/2
=3.74*8.77
=32.8
那么:
代码语言:javascript复制cosθ=A·B/|A|*|B|=32/32.8=0.98
所以向量A[1,2,3]与向量B[4,5,6]余弦相似度接近于1,这两个向量相似。
4.3余弦相似度公式的证明
下面分别通过平面几何和解析几何的方法来证明两个二维向量的余弦相似度公式。
4.3.1平面几何方法来证明
构造如下图形:
通过长边,得知:
代码语言:javascript复制cos(α-β)=cos(θ)=cos(α)cos(β) sin(α)sin(β)
对于向量A(x1,y1)夹角为α
所以
代码语言:javascript复制cos(α)=x1/|A|; sin(α)=y1/|A|
对于向量B(x2,y2)夹角为β
所以:
代码语言:javascript复制cos(β)=x2/|B|; sin(β)=y2/|B|
因此:
代码语言:javascript复制cos(α)cos(β) = x1/|A|*x2/|B|=x1x2/|A||B|
sin(α)sin(β) =y1/|A|*y2/|B|=y1y2/|A||B|
cos(θ)=cos(α)cos(β) sin(α)sin(β)
=x1x2/|A||B| y1y2/|A||B|
=(x1x2 y1y2)/|A||B|
=A·B/|A||B|
4.3.2解析几何方法来证明
如下图所示:
对于向量A(x1,y1)夹角为α,对于向量B(x2,y2)夹角为β。
现在让向量A(x1,y1)与向量B(x2,y2)逆时针旋转β(由于β是逆时针方向的。现在顺时针方向旋转β角度,所以为逆时针旋转-β角度),使得向量B与X轴重合。
A(x1,y1) 顺时针旋转β后得到:
代码语言:javascript复制A′(x1cos(-β)-y1sin(-β),x1sin(-β) y1cos(-β))
B′(|B|,0)
由于
代码语言:javascript复制cos(-β)= cos(β);sin(-β)=- sin(β)
所以
代码语言:javascript复制A′(x1cos(β) y1sin(β),-x1sin(β) y1cos(β))
B′(|B|,0)
A′与B′的夹角为α-β即θ。
所以
代码语言:javascript复制cos(θ)=(x1cos(β) y1sin(β))/|A|
由于
代码语言:javascript复制cos(β)= x2/|B|
sin(β)= y2/|B|
cos(θ)=(x1cos(β) y1sin(β))/|A|
=(x1x2/|B| y1y2/|B|)/|A|
=(x1x2 y1y2)/|A||B|
= A·B/|A||B|