从零开始理解:点积为什么能反映向量夹角?
当我们谈到词向量相似度时,总会用到"余弦相似度"这个概念。但你有没有想过:为什么两个向量的点积能反映它们的夹角?这背后的数学原理是什么?
让我们抛开公式,从最直观的图像开始,一步步揭开这个数学之美。
一、从投影说起:最直观的理解
投影的几何意义
看这个图:
a
/|
/ |
/ | |a|cos(θ)
/ |
/_)θ |
b————————————→
a 在 b 方向上的投影长度 = |a|cos(θ)
这个投影告诉我们什么?
为什么投影能反映相似度?
想象两个向量代表不同的方向:
情况1:方向完全一致(θ=0°)
你 →→→→→
→→→→→
你的"前进"在对方方向上的投影 = 你的全部前进 cos(0°) = 1,投影最大
情况2:方向垂直(θ=90°)
你 ↑↑↑
→→→
你的"前进"在对方方向上的投影 = 0 cos(90°) = 0,没有共同分量
情况3:方向相反(θ=180°)
你 ←←←←←
→→→→→
你的"前进"在对方方向上的投影 = 负的 cos(180°) = -1,完全相反
关键洞察:
- 夹角越小 → cos(θ) 越大 → 投影越长 → 两个方向越一致
- 夹角为90° → cos(90°) = 0 → 投影为0 → 两个方向完全无关
- 夹角为180° → cos(180°) = -1 → 投影为负 → 两个方向完全相反
这就是为什么 cos(θ) 能反映方向相似性的根本原因。
cos函数的性质
在 [0°, 180°] 范围内:
θ = 0° → cos(0°) = 1 (完全同向)
θ = 45° → cos(45°) ≈ 0.707
θ = 90° → cos(90°) = 0 (垂直)
θ = 135° → cos(135°) ≈ -0.707
θ = 180° → cos(180°) = -1 (完全反向)
cos(θ) 随夹角单调递减,这是余弦函数的基本性质。
用图像理解:
cos(θ)
1 | ●
| /
0 |___/__________ θ
| /
-1 | ●
0° 90° 180°
夹角越小 → cos值越大 → 点积越大(向量长度相同时)
二、点积的定义和几何意义
点积的代数定义
点积的原始定义(代数形式)其实非常简单:
a · b = a₁b₁ + a₂b₂ + ... + aₙbₙ
就是对应坐标相乘再求和。这个定义里,每一项都包含了 b 的分量信息。
点积的几何意义
点积还有一个几何解释:
a · b = |b| × (|a|cos(θ)) = b的长度 × a在b方向上的投影
或反过来:
a · b = |a| × (|b|cos(θ)) = a的长度 × b在a方向上的投影
为什么投影还要乘以b的长度?
举个例子:
a = [3, 4]
b = [2, 0] (纯x方向,长度为2)
点积 = 3×2 + 4×0 = 6
这个6怎么来的?
- a 在 x 方向的分量是 3
- b 在 x 方向的分量是 2(包含了 b 的长度)
- 两者相乘:3 × 2 = 6
如果 b 是单位向量呢?
b' = [1, 0] (长度为1)
点积 = 3×1 + 4×0 = 3
这时候点积恰好等于 a 的投影!
本质原因:坐标分量的乘积
点积的每一项是 aᵢbᵢ,不是 aᵢ × 1。
a = [a₁, a₂]
b = [b₁, b₂]
点积 = a₁b₁ + a₂b₂
b₁ 和 b₂ 本身就包含了 b 的长度信息。
用极坐标看更清楚:
b₁ = |b|cos(β) ← 包含了|b|
b₂ = |b|sin(β) ← 包含了|b|
点积 = a₁(|b|cos(β)) + a₂(|b|sin(β))
= |b|(a₁cos(β) + a₂sin(β))
↑
这就是|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₂ 在做什么:
假设:
a = [3, 4]
b = [5, 0] (纯x方向)
点积 = 3×5 + 4×0 = 15
这在算什么?
b 是纯 x 方向,所以点积只保留了 a 在 x 方向的分量:
- a 的 x 分量是 3
- b 的长度是 5
- 结果 = 3×5 = 15
本质:点积的每一项 aᵢbᵢ 都在计算"两个向量在第 i 个坐标轴上的分量的乘积",求和后就得到了"总的共同分量"。
再看一个例子
例子1:
a = [1, 1] // 指向45°方向
b = [1, 0] // 指向0°方向
θ = 45°
点积 = 1×1 + 1×0 = 1
|a| = √2
|b| = 1
公式验证:|a||b|cos(45°) = √2 × 1 × 0.707 ≈ 1 ✓
例子2:
a = [0, 1] // 指向90°方向
b = [1, 0] // 指向0°方向
θ = 90°
点积 = 0×1 + 1×0 = 0
验证:|a||b|cos(90°) = 1 × 1 × 0 = 0 ✓
四、数学推导:点积 = |a||b|cos(θ)
现在让我们严格推导,证明点积的代数定义和几何定义是等价的。
方法一:从二维开始(最直观)
第一步:用极坐标表示向量
假设两个二维向量:
a = [a₁, a₂]
b = [b₁, b₂]
我们可以用极坐标表示它们:
a = [|a|cos(α), |a|sin(α)] // α是a与x轴的夹角
b = [|b|cos(β), |b|sin(β)] // β是b与x轴的夹角
其中 θ = β - α 是两个向量之间的夹角。
第二步:计算点积
a · b = a₁b₁ + a₂b₂
= |a|cos(α) × |b|cos(β) + |a|sin(α) × |b|sin(β)
= |a||b| [cos(α)cos(β) + sin(α)sin(β)]
第三步:使用三角恒等式
关键来了!用三角恒等式:
cos(α)cos(β) + sin(α)sin(β) = cos(β - α) = cos(θ)
所以:
a · b = |a||b|cos(θ)
这不是定义,是推导出来的结论!
方法二:用余弦定理(适用于任意维度)
考虑由原点O、向量a的终点A、向量b的终点B构成的三角形:
A (向量a的终点)
/|
/ |
/ |θ
/ |
O————|————B (向量b的终点)
三条边的长度:
- OA = |a|
- OB = |b|
- AB = |a - b|
余弦定理:
|a - b|² = |a|² + |b|² - 2|a||b|cos(θ)
展开左边:
|a - b|² = (a - b)·(a - b)
= a·a - 2a·b + b·b
= |a|² - 2a·b + |b|²
两式相等:
|a|² - 2a·b + |b|² = |a|² + |b|² - 2|a||b|cos(θ)
⇒ -2a·b = -2|a||b|cos(θ)
⇒ a·b = |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. 向量用极坐标表示:a = |a|[cos(α), sin(α)]
2. 计算点积:a·b = |a||b|[cos(α)cos(β) + sin(α)sin(β)]
3. 三角恒等式:cos(α)cos(β) + sin(α)sin(β) = cos(β-α) = cos(θ)
4. 得到:a·b = |a||b|cos(θ)
5. 移项:cos(θ) = (a·b)/(|a||b|)
验证:用具体数字
例子1:两个向量夹角45°
a = [1, 0] // 在x轴上,α = 0°
b = [1, 1] // 在45°方向,β = 45°
θ = 45°
计算:
|a| = √(1² + 0²) = 1
|b| = √(1² + 1²) = √2
a · b = 1×1 + 0×1 = 1
余弦相似度 = 1 / (1 × √2) = 1/√2 ≈ 0.707
验证:cos(45°) = √2/2 ≈ 0.707 ✓
例子2:两个向量垂直
a = [1, 0] // x轴
b = [0, 1] // y轴
θ = 90°
计算:
|a| = 1
|b| = 1
a · b = 1×0 + 0×1 = 0
余弦相似度 = 0 / (1 × 1) = 0
验证:cos(90°) = 0 ✓
例子3:两个向量同向但长度不同
a = [3, 4] // 长度5
b = [6, 8] // 长度10,方向相同
θ = 0°
计算:
|a| = √(3² + 4²) = 5
|b| = √(6² + 8²) = 10
a · b = 3×6 + 4×8 = 18 + 32 = 50
余弦相似度 = 50 / (5 × 10) = 1
验证:cos(0°) = 1 ✓
为什么要用余弦相似度?
在语义分析中,我们只关心方向(语义),不关心长度(词频)。
例如:
"国王" = [0.2, 0.5, 0.8, ...] 长度可能是1.2
"王后" = [0.3, 0.6, 0.9, ...] 长度可能是1.5
我们只关心方向(语义),不关心长度(词频)。所以用余弦相似度!
这两个词向量方向一致,语义应该相似:
- 原始点积:会受长度影响
- 余弦相似度:消除长度影响,只看方向
余弦相似度的标准化范围
-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中,我们只关心语义方向,不关心词频
点积用来衡量方向一致性是自然的,因为它的数学定义天然包含了夹角信息。词向量技术利用了这一数学事实。
向量相似度的标准范围是有界的:-1 ≤ cos(θ) ≤ 1,便于比较和跨模型复用。
延伸阅读
- 从 One-hot 到 Embedding:词的分布式表示 — Embedding 如何用向量表示词的语义
- Attention 机制 — 点积在 Attention 中用于计算 Query 与 Key 的相似度