当我们谈到词向量相似度时,总会用到”余弦相似度”这个概念。但你有没有想过:为什么两个向量的点积能反映它们的夹角?这背后的数学原理是什么?
一、从投影说起:最直观的理解
投影的几何意义
看这个图:
1 | a |
a 在 b 方向上的投影长度 = |a|cos(θ)
为什么投影能反映相似度?
想象两个向量代表不同的方向:
情况1:方向完全一致(θ=0°)
1 | 你 →→→→→ |
投影 = 全部长度,cos(0°) = 1,投影最大
情况2:方向垂直(θ=90°)
1 | 你 ↑↑↑ |
投影 = 0,cos(90°) = 0,没有共同分量
情况3:方向相反(θ=180°)
1 | 你 ←←←←← |
投影为负,cos(180°) = -1,完全相反
关键洞察:
- 夹角越小 → cos(θ) 越大 → 投影越长 → 两个方向越一致
- 夹角为90° → cos(90°) = 0 → 投影为0 → 两个方向完全无关
- 夹角为180° → cos(180°) = -1 → 投影为负 → 两个方向完全相反
这就是为什么 cos(θ) 能反映方向相似性。
cos函数的性质
在 [0°, 180°] 范围内:
1 | θ = 0° → cos(0°) = 1 (完全同向) |
cos(θ) 随夹角单调递减,这是余弦函数的基本性质。
用图像理解:
1 | cos(θ) |
夹角越小 → cos值越大 → 点积越大(向量长度相同时)
二、点积的定义和几何意义
点积的代数定义
点积的原始定义(代数形式):
a · b = a₁b₁ + a₂b₂ + … + aₙbₙ
就是对应坐标相乘再求和。
点积的几何意义
点积还有一个几何解释:
a · b = |b| × (|a|cos(θ))
= b的长度 × a在b方向上的投影
或反过来:
a · b = |a| × (|b|cos(θ))
= a的长度 × b在a方向上的投影
为什么投影还要乘以b的长度?
举个例子:
1 | a = [3, 4] |
这个6怎么来的?
- a 在 x 方向的分量是 3
- b 在 x 方向的分量是 2(包含了 b 的长度)
- 两者相乘:3 × 2 = 6
如果 b 是单位向量呢?
1 | b' = [1, 0] (长度为1) |
这时候点积恰好等于 a 的投影!
本质原因:坐标分量的乘积
点积的每一项是 aᵢbᵢ,不是 aᵢ × 1。
1 | a = [a₁, a₂] |
b₁ 和 b₂ 本身就包含了 b 的长度信息。
用极坐标看更清楚:
1 | b₁ = |b|cos(β) ← 包含了|b| |
结论:
- 如果 b 是单位向量(|b|=1),点积 = a 的投影
- 如果 b 不是单位向量,点积 = a 的投影 × |b|
如果只想要投影怎么办?
如果你只想要”a 在 b 方向上的投影”,需要:
投影 = (a · b) / |b|
或者先把 b 变成单位向量:
b̂ = b / |b| (单位向量)
投影 = a · b̂ = (a · b) / |b|
余弦相似度就是这样做的——同时除以两个向量的长度。
三、为什么点积公式天然就能算出夹角?
坐标分量的乘积求和
让我们看看点积 a₁b₁ + a₂b₂ 在做什么:
假设:
1 | a = [3, 4] |
这在算什么?
b 是纯 x 方向,所以点积只保留了 a 在 x 方向的分量:
- a 的 x 分量是 3
- b 的长度是 5
- 结果 = 3×5 = 15
本质:点积的每一项 aᵢbᵢ 都在计算”两个向量在第 i 个坐标轴上的分量的乘积”,求和后就得到了”总的共同分量”。
再看两个例子
例子1:
1 | a = [1, 1] // 指向45°方向 |
例子2:
1 | a = [0, 1] // 指向90°方向 |
四、数学推导:点积 = |a||b|cos(θ)
现在严格推导,证明点积的代数定义和几何定义是等价的。
方法一:从二维开始(最直观)
第一步:用极坐标表示向量
假设两个二维向量:
1 | a = [a₁, a₂] |
用极坐标表示:
1 | a = [|a|cos(α), |a|sin(α)] // α是a与x轴的夹角 |
其中 θ = β - α 是两个向量之间的夹角。
第二步:计算点积
1 | a · b = a₁b₁ + a₂b₂ |
第三步:使用三角恒等式
关键的三角恒等式:
cos(α)cos(β) + sin(α)sin(β) = cos(β - α) = cos(θ)
所以:
a · b = |a||b|cos(θ)
这不是定义,是推导出来的结论!
方法二:用余弦定理(适用于任意维度)
考虑由原点O、向量a的终点A、向量b的终点B构成的三角形:
1 | A (向量a的终点) |
三条边的长度:
- OA = |a|
- OB = |b|
- AB = |a - b|
余弦定理:
|a - b|² = |a|² + |b|² - 2|a||b|cos(θ)
展开左边:
1 | |a - b|² = (a - b)·(a - b) |
两式相等:
1 | |a|² - 2a·b + |b|² = |a|² + |b|² - 2|a||b|cos(θ) |
这个证明对任意维度都成立!
三维和高维推广
三维:用球坐标表示向量,通过更复杂的三角恒等式,同样可以得到:
a · b = |a||b|cos(θ)
高维:用余弦定理的方法,对任意 n 维向量都有:
a · b = |a||b|cos(θ)
因此余弦相似度在任意维度都适用!
五、余弦相似度:剥离长度,只看方向
推导余弦相似度公式
现在我们知道了:
a · b = |a| |b| cos(θ)
两边同时除以 **|a||b|**:
cos(θ) = (a · b) / (|a| × |b|)
这就是余弦相似度公式!
完整推导链条
1 | 1. 向量用极坐标表示:a = |a|[cos(α), sin(α)] |
验证:用具体数字
例子1:两个向量夹角45°
1 | a = [1, 0] // 在x轴上,α = 0° |
例子2:两个向量垂直
1 | a = [1, 0] // x轴 |
例子3:两个向量同向但长度不同
1 | a = [3, 4] // 长度5 |
为什么要用余弦相似度?
在语义分析中,我们只关心方向(语义),不关心长度(词频)。
例如:
1 | "国王" = [0.2, 0.5, 0.8, ...] 长度可能是1.2 |
这两个词向量方向一致,语义应该相似:
- 原始点积:会受长度影响
- 余弦相似度:消除长度影响,只看方向
余弦相似度的标准化范围
-1 ≤ cos(θ) ≤ 1
- cos(θ) = 1:完全同向(θ = 0°)
- cos(θ) = 0:垂直(θ = 90°),语义无关
- cos(θ) = -1:完全反向(θ = 180°)
六、核心总结
为什么点积能反映夹角?
1. 数学本质
点积的代数定义(坐标分量乘积求和)和几何定义(长度×夹角余弦)是数学上等价的,这是通过三角恒等式严格推导出来的。
2. 直观理解
- 投影视角:点积 = 一个向量长度 × 另一个向量在其上的投影
- 分量视角:点积 = 各坐标轴上”共同分量”的总和
- 夹角视角:cos(θ)天然单调递减,完美编码了方向差异
3. 为什么夹角越小,点积越大?
因为:
- 点积 = |a||b|cos(θ)
- cos函数在[0°,180°]单调递减
- θ小 → cos(θ)大 → 点积大(长度不变时)
这不是人为设计,而是数学结构的必然结果。
余弦相似度的意义
cos(θ) = (a · b) / (|a| × |b|)
- 消除了向量长度的影响:同时除以两个向量的长度
- 只保留纯粹的方向信息:结果只依赖夹角 θ
- **标准化范围 [-1, 1]**:便于比较和解释
- 完美适用于语义相似度:在NLP中,我们只关心语义方向,不关心词频
所以点积用来衡量”方向一致性”是非常自然的,因为它的数学定义天然就包含了夹角信息。词向量技术只是巧妙地利用了这个数学事实。
扩展:余弦相似度的几何特性与 Transformer 实战
在深度学习中,余弦相似度(Cosine Similarity)是最常用的度量手段,但其背后的几何逻辑与实际工程应用存在关键差异。
1. 核心矛盾:方向一致性 语义完全等价
- 数学逻辑:若两个向量共线(同方向),其余弦相似度为 1。
- 物理现实:在 Embedding 空间中,即使是同义词(如“苹果”与“Apple”)也很难完全共线。模型会利用微小的夹角和向量长度来区分语境、词频或语法特征。
- 结论:余弦相似度衡量的是“主题相关性”,而非绝对的“语义等同”。
2. 余弦相似度的“盲区”
余弦相似度最大的特点是模长无关性。
- 几何直觉:它只能分辨向量“指向哪里”,无法分辨向量“走了多远”。对于处于同一条射线上的两个点,余弦相似度认为它们是完全一样的。
- 局限性:这会导致它无法捕捉语义的“强度”。例如,“好”和“非常好”在方向上可能一致,但后者在向量长度(能量)上通常更强。
3. Transformer 是只用余弦相似度吗?
这是一个常见的误解。事实上,模型在不同阶段对“长度”的态度完全不同:
- 训练阶段(内部机理):
Transformer 核心的 Attention 机制使用点积(Dot Product)而非余弦相似度。向量长度会被保留并参与运算,用以调节注意力的权重分布。此时,长度是重要的信号。 - 检索阶段(工程应用):
在向量数据库检索时,通常会先对 Embedding 进行 L2 归一化。归一化后的点积计算在数学上等价于余弦相似度。此时,长度被视为噪声而被抹除。
本节要点
- 余弦相似度擅长比较“是什么”,但在区分“程度有多深”上存在天然弱点。
- 模型内部利用长度来建模重要性,模型外部利用方向来保证检索的稳定性。