现在位置: 首页 > AI 数学基础 > 正文

向量的点积 -- 从投影到相乘

点积(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 \)

夹角 θ 越小,点积越大

两种算法得出的是同一个值——这是数学中一个极其优雅的等式。

点积的正负号揭示了方向关系

<90°
点积 > 0
方向大致相同
=90°
点积 = 0
方向垂直(正交)
>90°
点积 < 0
方向大致相反

生活例子

购物账单:数量 × 单价

你买了 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 动手实践

实例

import numpy as np

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 等所有现代大语言模型都基于这个点积注意力机制。

推荐系统中的相似度计算

用户向量与物品向量做点积,得到用户对该物品的「偏好分数」。这就是矩阵分解推荐算法的核心——评分矩阵 ≈ 用户隐向量矩阵 × 物品隐向量矩阵的转置。