从向量到嵌入:相似度背后的几何学

直观理解向量、点积、余弦相似度,以及嵌入为何能把含义转换成几何关系。

分享这篇文章

嵌入把一个对象——单词、图像、用户或文档——表示成一串数字。这串数字就是一个向量:

x=[x1,x2,,xn].\mathbf{x} = [x_1, x_2, \ldots, x_n].

单个坐标很少有简单的人类标签。重要的是许多向量共同创造出的几何结构。

从方向开始

假设两个向量几乎指向同一个方向。它们的坐标大小可能不同,但仍然表达相似的模式。余弦相似度衡量这种方向上的一致性:

cos(x,y)=xyx2y2.\operatorname{cos}(\mathbf{x}, \mathbf{y}) = \frac{\mathbf{x} \cdot \mathbf{y}} {\lVert \mathbf{x} \rVert_2\,\lVert \mathbf{y} \rVert_2}.

分子是点积。分母消除了长度的影响。

一个小型示例

x=[1,2]\mathbf{x} = [1, 2]y=[2,4]\mathbf{y} = [2, 4]。由于 y=2x\mathbf{y} = 2\mathbf{x},两个向量指向完全相同的方向,它们的余弦相似度是 11

function dot(left, right) {
  return left.reduce((sum, value, index) => sum + value * right[index], 0);
}

这段代码对应数学定义 xy=ixiyi\mathbf{x}\cdot\mathbf{y}=\sum_i x_i y_i

嵌入为何有用

训练会排列向量,使有用的关系变成几何关系。因此,搜索系统可以检索相近的文档;推荐系统可以比较用户与商品;分类器可以在不同区域之间画出边界。

核心思想很简单:当距离或方向保留了我们关心的关系时,嵌入才有用。