首发于矩阵之源

向量搜索的简明数学基础

(在知乎编辑这么多公式,简直要吐!)

虽然 Milvus 开源向量搜索引擎可以为用户隔离下面这些头疼的细节,不过多学一点向量数据的知识总是没坏处的。

L2正则化(归一化)

n 维原始向量空间:\Re^{n}, n \in \aleph\Re 表示实数, \aleph 表示非零自然数)

原始向量:X=(x_{1}, x_{2}, ..., x_{n}), X \in \Re^{n}

向量 X 的 L2 范数(模长): \left| X \right|=\sqrt{\sum_{1}^{n}{x_{i}^2}}

归一化后的向量: X'=(x'_{1}, x'_{2}, ..., x'_{n}), X' \in \Re^{n}

其中每一维的 L2 正则化算法: x'_{i}=\frac{x_{i}}{\left| X \right|}=\frac{x_{i}}{\sqrt{\sum_{1}^{n}{x_{i}^2}}}

归一化后,向量模长等于1: \left| X' \right|=1

计算向量相似度

近似最近邻搜索(approximate nearest neighbor searching, ANNS)是目前针对向量搜索的主流思路。其核心理念是只在原始向量空间的子集中进行计算和搜索,从而加快整体搜索速度。

假设搜索空间(即原始向量空间的子集): \gamma, \gamma\subset \Re^n

内积(点积)

向量 A,B 的内积: p(A,B)=A \cdot B=\sum_{1}^{n}{(a_{i} \times b_{i})}

余弦相似度

向量 A,B 的余弦相似度: cos(A,B)=\frac{A \cdot B}{\left|A\right|\left|B\right|}

通过余弦判断相似度:余弦值越大,相似度越高。即

TopK(A)=\underset{B \in \gamma}{\operatorname{argmax}} cos(A,B)

假设向量 A,B 归一化后的向量分别是 A',B' ,则 cos(A,B)=\frac{A \cdot B}{\left|A\right|\left|B\right|}=\frac{\sum_{1}^{n}{(a_{i} \times b_{i})}}{\left|A\right|\left|B\right|}=\sum_{1}^{n}(\frac{a_{i}}{\left|A\right|} \times \frac{b_{i}}{\left|B\right|})=cos(A',B')

因此,归一化后,两个向量之间的余弦相似度不变。特别的,

cos(A',B')=\sum_{1}^{n}(\frac{a_{i}}{\left|A\right|} \times \frac{b_{i}}{\left|B\right|})=A' \cdot B'=p(A',B')

因此,归一化后,内积与余弦相似度计算公式等价

欧氏距离

向量 A,B 的欧式距离: d(A,B)=\sqrt{\sum_{1}^{n}(a_{i}-b_{i})^2}

通过欧氏距离判断相似度:欧式距离越小,相似度越高。即

TopK(A)=\underset{B \in \gamma}{\operatorname{argmin}} d(A,B)

假设向量 A,B 经过归一化,那么进一步展开上面的公式:

d(A,B)=\sqrt{\sum_{1}^{n}(a_{i}-b_{i})^2} =\sqrt{\sum_{1}^{n}(a_{i}^2-2a_{i}b{i}+b_{i}^2)} =\sqrt{\sum_{1}^{n}a_{i}^2-2\sum_{1}^{n}a_{i}b{i}+\sum_{1}^{n}b_{i}^2} =\sqrt{2-2 \times p(A,B)}

所以, d(A,B)^2=-2 \times p(A,B)+2

因此,欧氏距离的平方与内积负相关。而欧式距离是非负实数,两个非负实数之间的大小关系与他们自身平方之间的大小关系相同。 即

\left\{ a,b,c \right\}   \subset \left\{ x \in \Re | x \geq 0 \right\}

a<b<c \Leftrightarrow a^2<b^2<c^2

所以,归一化后,针对同一个向量,在同等搜索空间的条件下,欧氏距离返回的前K个距离最近的向量结果集与内积返回的前K个相似度最大的向量结果集是等价的。

编辑于 2019-10-23

文章被以下专栏收录