神经网络之向量相似性
🧭 一、基本概念:为什么要计算“向量间的相似度”
当我们用向量来表示词语、句子或图像时,向量之间的几何关系就代表了它们之间的语义关系。
- 如果两个向量方向相近 ⇒ 两个词语的意义相似。
- 如果两个向量相互垂直 ⇒ 意义几乎无关。
- 如果方向相反 ⇒ 含义相反(例如 “好” vs “坏”)。
所以,“相似度”就是在数学上量化“语义相似”的方式。
🧮 二、常见的相似度衡量方式
我们主要用几种度量来比较两个向量 (a⃗)( \vec{a} )(a) 和 (b⃗)( \vec{b} )(b):
1️⃣ 余弦相似度(Cosine Similarity)
最常见、最直观的衡量语义相似度的方法。
定义:
KaTeX parse error: Expected 'EOF', got '_' at position 14:
\text{cosine_̲similarity} = \…
其中:
- (a⃗⋅b⃗)( \vec{a} \cdot \vec{b} )(a⋅b):内积(点积)
- (∣∣a⃗∣∣)( ||\vec{a}|| )(∣∣a∣∣):向量长度(模)
- 结果范围:([−1,1])([-1, 1])([−1,1])
解释:
- 值越接近 1 ⇒ 方向越接近 ⇒ 意义越相似
- 值接近 0 ⇒ 无关
- 值接近 -1 ⇒ 意义相反
直观几何图:
→ →
a b↖ 夹角 θ
cos(θ) = 相似度
举例:
| 向量 | 含义 | 相似度 |
|---|---|---|
| “猫” vs “狗” | 都是动物 | 0.8 |
| “猫” vs “车” | 无关 | 0.1 |
| “好” vs “坏” | 反义词 | -0.9 |
2️⃣ 欧几里得距离(Euclidean Distance)
衡量“距离”的绝对大小,而不是方向。
定义:
d(a⃗,b⃗)=(a1−b1)2+(a2−b2)2+…
d(\vec{a}, \vec{b}) = \sqrt{(a_1 - b_1)^2 + (a_2 - b_2)^2 + \dots}
d(a,b)=(a1−b1)2+(a2−b2)2+…
解释:
- 距离越小 ⇒ 越相似
- 距离越大 ⇒ 越不相似
不过欧氏距离受“向量长度”影响较大,不太适合高维语义空间(通常先归一化再使用)。
3️⃣ 曼哈顿距离(Manhattan Distance)
d(a⃗,b⃗)=∑i∣ai−bi∣
d(\vec{a}, \vec{b}) = \sum_i |a_i - b_i|
d(a,b)=i∑∣ai−bi∣
适合在稀疏特征空间中使用(如词袋模型),但在语义向量中不如余弦相似常用。
4️⃣ 点积(Dot Product)
a⃗⋅b⃗=∑iaibi
\vec{a} \cdot \vec{b} = \sum_i a_i b_i
a⋅b=i∑aibi
其实是余弦相似的未归一化形式,在神经网络(尤其是注意力机制中)常直接使用。
🧠 三、为什么“余弦相似度”最常用于语义分析
因为:
- 它只关注方向,忽略了长度(即词频、出现次数的规模)。
- 在高维词向量空间中,方向即语义,而长度往往代表词的重要性或频率。
举个例子:
在Word2Vec或GloVe中,“国王”“王后”“男人”“女人”这四个向量大致满足:
国王⃗−男人⃗+女人⃗≈王后⃗
\vec{国王} - \vec{男人} + \vec{女人} \approx \vec{王后}
国王−男人+女人≈王后
这个几何关系依赖的就是方向的相似性而非绝对距离。
🧩 四、简单实现(Python示例)
import numpy as npdef cosine_similarity(a, b):return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))a = np.array([1, 2, 3])
b = np.array([2, 3, 4])print(cosine_similarity(a, b))
输出大约:
0.9926
表示这两个向量方向非常相近。
🧭 五、小结
| 指标 | 含义 | 是否考虑方向 | 是否考虑长度 | 常用于 |
|---|---|---|---|---|
| 余弦相似度 | 角度相似 | ✅ | ❌ | 语义分析、词向量 |
| 欧几里得距离 | 绝对距离 | ✅ | ✅ | 聚类、空间距离 |
| 曼哈顿距离 | 坐标差 | ✅ | ✅ | 稀疏特征空间 |
| 点积 | 未归一化方向相似 | ✅ | ✅ | 神经网络内部计算 |
