1.线性代数:向量、点积与线性变换

配套视频

重点

  • 向量 = 一组有序数字,在大模型里代表"一个词 / 一个 token 的意思"

  • 点积 = 相似度——这一条直接支撑了注意力机制和向量检索(RAG)

  • 矩阵 = 线性变换,"把向量变成另一个向量";模型的一层就是一次变换

  • 矩阵乘法 = 复合变换,先 A 后 B 等于一次性做 BA

  • 大模型里到处都是矩阵:embedding 表、QKV 投影、输出层、LoRA 增量

1.1 向量:从"箭头"到"词的意思"

  • 几何视角:空间里一带箭头的线段,方向 + 长度

  • 坐标视角:一列数 [3, 4],可以直接参与运算

大模型用的是坐标视角,但意义来自几何视角——两个向量的"几何接近"就是"语义相似"。

💎 大模型里的向量:GPT 把每个 token 变成一个 d_model 维向量(Llama-3-8B 是 4096 维)。"猫"和"小猫"的向量在 4096 维空间里距离很近,"猫"和"汽车"离得很远。这就是词嵌入(embedding)。

1.2 点积:大模型最核心的一个运算

两个向量的点积,对应元素相乘再求和:

点积的代数定义

\mathbf{a} \cdot \mathbf{b}=a_1 b_1+a_2 b_2+\cdots+a_n b_n

几何上,它等于"一个向量在另一个上的投影长度 × 另一个的长度":

点积的几何定义

\mathbf{a} \cdot \mathbf{b} = \|\mathbf{a}\| \, \|\mathbf{b}\| \cos\theta

两边同时除以 ,就得到余弦相似度——这正是 RAG 向量检索和注意力机制的数学基础:

余弦相似度

\cos\theta = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \, \|\mathbf{b}\|}, \qquad \cos\theta \in [-1, 1]

⭐ 点积在大模型里的两个用武之地

① 注意力机制: 就是"每个 query 和每个 key 做点积",点积大 = 这个 token 该关注那个 token; ② 向量检索(RAG):把问题编码成向量,和知识库里所有向量做点积,取最大的几条作为参考资料。

1.3 范数:向量的"长度"

最常用的是 L2 范数(欧氏长度):

L2 范数

\|\mathbf{a}\|_2 = \sqrt{a_1^2 + a_2^2 + \cdots + a_n^2}
  • L2 范数:深度学习里用于权重正则化(weight decay),防止权重过大

  • L1 范数:绝对值之和,倾向于产生稀疏解

  • 归一化:把向量除以自己的范数,得到单位向量——这样点积就等于余弦相似度了

1.4 矩阵乘法:一次"线性变换"

矩阵 A(m×n)乘向量 x(n×1)得到 y(m×1),理解为"A 把 x 变换成 y":

线性变换(神经网络一层的核心)

\mathbf{y} = W\mathbf{x} + \mathbf{b}

W:权重矩阵 b:偏置向量

所有"保持直线仍是直线、原点不动"的变换都叫线性变换:旋转、缩放、剪切、投影。

矩阵

几何效果

大模型里的对应

[[2,0], [0,1]]

x 方向拉伸 2 倍

放大某个特征维度的重要性

[[cosθ, -sinθ], [sinθ, cosθ]]

旋转 θ 角

位置编码(RoPE)就是旋转

[[1,1], [0,1]]

剪切(斜向拉伸)

特征混合

[[1,0], [0,0]]

投影到 x 轴(降维)

降维、池化

1.5 转置 / 逆 / 行列式 / 秩(速览)

概念

一句话

大模型里的用途

转置 Aᵀ

行变列、列变行

里的 T;维度对齐

逆 A⁻¹

还原变换的矩阵(AA⁻¹ = I)

解方程;实际训练中很少直接求逆

行列式 det(A)

变换后面积/体积的缩放倍数

det = 0 表示不可逆(空间被压扁)

秩 rank(A)

变换后"还剩几个独立方向"

LoRA 的核心:用低秩矩阵近似权重增量

特征值 λ

某方向上只缩放不旋转,λ 是倍数

PCA、协方差分析

⚠️ 秩(rank)要特别记住:一个 m×n 矩阵的秩最多是 min(m,n)。如果一个 4096×4096 矩阵的精确秩是 8,它可以精确写成 4096×8 与 8×4096 两个矩阵的乘积;如果只是有效秩约为 8,则只能近似表示。LoRA 使用同样的低秩参数化,但假设低秩的是微调增量,而不是原权重。

1.6 在大模型里的完整链路

把上面所有概念串起来,一个 Transformer 层做的事就是:

用 NumPy 亲手验证"点积 = 相似度"

import numpy as np

# 假设我们已经有了 4 个词的 3 维 embedding(真实模型是 4096 维)
emb = {
    "猫":    np.array([0.9,  0.8,  0.1]),
    "小猫":  np.array([0.85, 0.75, 0.15]),
    "狗":    np.array([0.88, 0.70, 0.20]),
    "汽车":  np.array([0.05, 0.15, 0.95]),
}

def cos_sim(a, b):
    # 余弦相似度 = 点积 / (模长 × 模长)
    return (a @ b) / (np.linalg.norm(a) * np.linalg.norm(b))

base = "猫"
for w in emb:
    if w == base: continue
    print(f"{base} vs {w}: {cos_sim(emb[base], emb[w]):.4f}")

# 输出(余弦相似度,越接近 1 越像):
#   猫 vs 小猫: 0.9997   ← 极像
#   猫 vs 狗:   0.9959   ← 很像(都是动物)
#   猫 vs 汽车: 0.1496   ← 完全不像

# 这就是 RAG 检索的全部原理:把 query 和所有文档向量算余弦相似度,取 top-k。
# 也是注意力机制的雏形:query 和每个 key 算相似度,再用来加权 value。