向量的点积 -- 从投影到相乘
点积(Dot Product)是 AI 中使用频率最高的向量运算。
全连接层的计算、注意力机制的相似度匹配——它们的核心都是点积。
点积有 两种等价的视角,理解它们之间的桥梁是本章的核心收获。
视角一:代数计算
对应位置的元素相乘,然后求和。
\( \mathbf{a} \cdot \mathbf{b} = \sum a_i b_i \)
例如:(2,3) · (4,1) = 2×4 + 3×1 = 11
视角二:几何直觉
将一个向量投影到另一个向量上,然后两段长度相乘。
\( \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta \)
夹角 θ 越小,点积越大
两种算法得出的是同一个值——这是数学中一个极其优雅的等式。
点积的正负号揭示了方向关系
生活例子
购物账单:数量 × 单价
你买了 2 瓶可乐(每瓶 3 元)、3 包薯片(每包 5 元)、1 桶泡面(每桶 4 元)。
数量向量 (2, 3, 1) 和价格向量 (3, 5, 4) 的点积就是总价:2×3 + 3×5 + 1×4 = 25 元。
推购物车:力 × 位移
你推购物车的力是一个向量(有大小和方向),车的位移是另一个向量。
物理学中,功 = 力在位移方向上的分量 × 位移大小 = 力向量与位移向量的点积。
如果你向侧面推(垂直方向),完全不做功——点积为零。
数学定义
代数定义
\[ \mathbf{a} \cdot \mathbf{b} = \sum_{i=1}^{n} a_i b_i = a_1 b_1 + a_2 b_2 + \cdots + a_n b_n \]几何定义
\[ \mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \|\mathbf{b}\| \cos\theta \]两个定义的桥梁:求夹角
\[ \cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \|\mathbf{b}\|} \]这意味着:给定两个向量的坐标,就能算出它们之间的夹角,不需要量角器。
运算性质
| 性质 | 公式 | 说明 |
|---|---|---|
| 交换律 | \( \mathbf{a} \cdot \mathbf{b} = \mathbf{b} \cdot \mathbf{a} \) | 顺序不影响 |
| 分配律 | \( \mathbf{a} \cdot (\mathbf{b} + \mathbf{c}) = \mathbf{a}\cdot\mathbf{b} + \mathbf{a}\cdot\mathbf{c} \) | 可先加再点积 |
| 自身点积 | \( \mathbf{a} \cdot \mathbf{a} = \|\mathbf{a}\|^2 \) | 向量与自己的点积 = 长度的平方 |
Python 动手实践
实例
a_runoob = np.array([2, 3, 1])
b_runoob = np.array([4, 1, 2])
# 方法1:np.dot()
dot1 = np.dot(a_runoob, b_runoob)
# 方法2:@ 运算符(推荐)
dot2 = a_runoob @ b_runoob
# 方法3:手写验证
dot3 = sum(a_runoob[i] * b_runoob[i] for i in range(len(a_runoob)))
print("a · b =", dot1) # 13
print("三种方法结果一致:", dot1 == dot2 == dot3)
# 用几何定义反推夹角
norm_a = np.linalg.norm(a_runoob)
norm_b = np.linalg.norm(b_runoob)
cos_theta = dot1 / (norm_a * norm_b)
theta_deg = np.degrees(np.arccos(cos_theta))
print(f"||a||={norm_a:.2f}, ||b||={norm_b:.2f}, cosθ={cos_theta:.4f}")
print(f"夹角 = {theta_deg:.1f}°")
# 验证几何公式
verify = norm_a * norm_b * cos_theta
print(f"||a||·||b||·cosθ = {verify:.4f} (与点积一致)")
# 不同夹角的演示
print("\n[1,0] · [0.8,0.6] =", np.array([1,0]) @ np.array([0.8,0.6]), " (锐角,正)")
print("[1,0] · [0,1] =", np.array([1,0]) @ np.array([0,1]), " (直角,零)")
print("[1,0] · [-1,0] =", np.array([1,0]) @ np.array([-1,0]), " (钝角,负)")
a · b = 13 三种方法结果一致: True ||a||=3.74, ||b||=4.58, cosθ=0.7580 夹角 = 40.7° [1,0] · [0.8,0.6] = 0.8 (锐角,正) [1,0] · [0,1] = 0 (直角,零) [1,0] · [-1,0] = -1.0 (钝角,负)
交互式点积演示
拖动向量 a 和 b 的端点,观察点积值和夹角如何变化。点积的正负决定了锐角/钝角/直角:
AI 中的应用场景
全连接层 = 点积的批量计算
一个神经元计算 \( y = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b \)。加和部分就是权重向量 w 和输入向量 x 的 点积。
当你看到一个全连接层 nn.Linear(784, 256),它在数学上做的事就是:256 个神经元,每个神经元拿自己的权重向量(784 维)与输入向量做点积,再加上偏置。256 个点积并行计算 = 矩阵乘法。
注意力机制 = 点积 + Softmax
Transformer 的核心操作:Query 向量与 Key 向量做点积,结果越大表示两者越「相关」。
\[ \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V \]\( QK^T \) 是 seq_len × d_k 矩阵与 d_k × seq_len 矩阵的乘法,结果矩阵中位置 (i, j) 的值 = 第 i 个 Query 与第 j 个 Key 的点积。这个值越大,表示第 i 个位置对第 j 个位置的「注意力」越高。
除以 \( \sqrt{d_k} \) 是为了防止点积值过大导致 Softmax 梯度消失。GPT、BERT、Claude 等所有现代大语言模型都基于这个点积注意力机制。
推荐系统中的相似度计算
用户向量与物品向量做点积,得到用户对该物品的「偏好分数」。这就是矩阵分解推荐算法的核心——评分矩阵 ≈ 用户隐向量矩阵 × 物品隐向量矩阵的转置。
