#005. 线性代数一:向量空间、矩阵与秩
#学习目标:先建立空间语言
线性代数最容易学散:一会儿是向量,一会儿是矩阵,一会儿又是秩、基、空间。面试里真正考察的不是背定义,而是你能不能把这些词连成一条线:向量是对象的坐标,矩阵是改变坐标的规则,秩表示这个规则真正保留了多少独立信息,列空间和零空间说明哪些输出可能出现、哪些输入会被丢掉。
你要能解释
为什么 embedding、资产因子暴露、样本特征都可以被看成向量;为什么“维度高”不等于“信息多”。
你要能计算
二维、三维小矩阵的矩阵乘法、线性组合、基、维度、秩、列空间和零空间。
你要能连接应用
把 attention 里的 \(Q,K,V\) 投影、LoRA 低秩更新、量化因子模型和线性代数语言对应起来。
线性代数是一门“压缩和变换信息”的语言。向量回答“对象放在哪里”,基回答“用哪套坐标轴描述它”,矩阵回答“怎么移动、拉伸、混合它”,秩回答“最后还剩几个独立方向”。
- 看到 \(x\in\mathbb{R}^d\),知道它是一个有 \(d\) 个坐标的对象。
- 看到 \(Ax\),能读出输入维度、输出维度和矩阵 \(A\) 的形状。
- 看到 \(\operatorname{rank}(A)\),能解释它和独立列、独立行、可达输出空间的关系。
- 看到 \(\operatorname{Null}(A)\),能解释哪些输入方向对输出完全没有影响。
#概念起点:向量为什么不只是箭头
高中或几何课里,向量常被画成箭头:从原点指向某个点。但在机器学习和量化里,向量更常表示“一个对象的一组数字描述”。一个 token 的 embedding、一个用户的特征、一个股票对几个因子的暴露,都可以写成向量。箭头只是帮助你想象方向和长度,真正重要的是:向量可以相加,也可以乘以一个数。
向量:\(x=(x_1,x_2,\ldots,x_d)\)。这里 \(d\) 是维度,\(x_i\) 是第 \(i\) 个坐标。
加法:\(x+y=(x_1+y_1,\ldots,x_d+y_d)\)。意思是每个坐标分别相加。
数乘:\(cx=(cx_1,\ldots,cx_d)\)。意思是把向量整体放大、缩小或反向。
例如 \(x=(2,1)\),\(y=(-1,3)\)。那么 \(x+y=(1,4)\),\(2x=(4,2)\)。如果把 \(x\) 看成“某个样本在两个特征上的值”,加法就是合并两个特征向量,数乘就是统一缩放特征强度。
小例子:embedding 的相似方向
假设有两个非常简化的词向量:\(e_{\text{cat}}=(2,1)\),\(e_{\text{dog}}=(3,1)\)。它们不完全相同,但方向接近,因为两个坐标的比例相近。再假设 \(e_{\text{car}}=(0,4)\),它主要沿第二个方向变化,和前两个词的语义方向就更远。
这里不需要先理解复杂模型。你只要知道:embedding 把离散对象变成连续向量,模型后续就可以用加法、点积、矩阵乘法去比较和变换这些对象。线性代数提供的就是这套计算语言。
#向量空间、线性组合、张成与基
向量空间是一组对象的集合,这组对象满足两个基本操作:任意两个对象可以相加,任意一个对象可以乘以数,并且结果还在这个集合里。不要把“空间”想得太神秘,它只是说:我们可以在这组对象里稳定地做线性运算。
线性组合:用若干向量加权相加,形如 \(\alpha_1v_1+\alpha_2v_2+\cdots+\alpha_kv_k\)。系数 \(\alpha_i\) 可以是任意实数。
张成:如果一组向量的所有线性组合能覆盖某个集合,就说它们张成这个空间,记作 \(\operatorname{span}(v_1,\ldots,v_k)\)。
线性无关:没有任何一个向量能由其他向量线性组合出来。等价地,\(\alpha_1v_1+\cdots+\alpha_kv_k=0\) 只有全零系数解。
基:既能张成整个空间,又线性无关的一组向量。基就是一套不重复、够用的坐标轴。
维度:一组基里向量的个数。它表示描述空间内任意对象所需的独立坐标数。
这个公式读作:向量 \(x\) 可以写成基向量 \(b_1,\ldots,b_d\) 的线性组合;\(\alpha_i\) 是 \(x\) 在第 \(i\) 个基方向上的坐标。符号 \(\sum\) 表示把 \(i=1\) 到 \(d\) 的所有项加起来。
小例子:二维标准基
在 \(\mathbb{R}^2\) 中,标准基是 \(e_1=(1,0)\),\(e_2=(0,1)\)。任何二维向量都可以写成它们的线性组合。
这说明 \(3\) 是横轴坐标,\(2\) 是纵轴坐标。标准基不是唯一的基。例如 \(b_1=(1,1)\),\(b_2=(1,-1)\) 也可以作为 \(\mathbb{R}^2\) 的一组基,因为它们方向不同,任意二维向量都可以由它们组合出来。
小例子:不是基的情况
考虑 \(u=(1,2)\),\(v=(2,4)\)。虽然有两个向量,但 \(v=2u\),所以它们其实只提供了一个方向。
\(\operatorname{span}(u,v)\) 不是整个二维平面,而只是穿过原点的一条直线。它的维度是 1,不是 2。这个例子很重要:向量数量多,不代表独立信息多。
在量化里,如果两个因子高度相关,例如“动量因子 A”和“动量因子 B”几乎总是一起变化,它们可能没有提供两个独立方向。在 LLM 里,如果 embedding 维度很高但很多方向相关,模型表示的有效维度也可能低于表面维度。
#矩阵作为线性变换
矩阵最常见的误解是“它只是一个数字表”。更有用的理解是:矩阵代表一个线性变换。给它一个输入向量 \(x\),它输出另一个向量 \(y=Ax\)。这个变换可以拉伸、压缩、旋转、投影,也可以把多个坐标混合成新的坐标。
这个矩阵把横向坐标放大 2 倍,纵向坐标不变。你可以把它想成把平面里的图形横向拉宽。
| 矩阵形式 | 几何直觉 | 机器学习直觉 |
|---|---|---|
| 对角矩阵 | 沿坐标轴缩放 | 每个特征单独调权重 |
| 非对角矩阵 | 坐标方向被混合 | 一个输出特征由多个输入特征共同决定 |
| 低秩矩阵 | 把空间压到较低维方向 | 只保留少数独立变化模式 |
| 投影矩阵 | 把点压到某个子空间 | 只保留和目标子空间相关的成分 |
矩阵 \(A\) 的形状也有含义。如果 \(A\in\mathbb{R}^{m\times n}\),输入 \(x\) 必须在 \(\mathbb{R}^n\),输出 \(Ax\) 在 \(\mathbb{R}^m\)。也就是说,矩阵把 \(n\) 维输入变成 \(m\) 维输出。
小例子:把三维特征变成二维打分
设一个样本有三维特征 \(x=(1,2,3)^T\),矩阵
则 \(A\) 把三维输入变成二维输出。
第一行表示“第 1 个输出坐标如何由输入特征加权得到”,第二行表示“第 2 个输出坐标如何由输入特征加权得到”。这就是线性层 \(y=xW\) 或 \(y=Wx\) 的本质。
#矩阵乘法:先后做两个变换
矩阵乘法不是随便把表格里的数字相乘。它表达的是“变换的复合”:先做一个线性变换,再做另一个线性变换。若 \(y=Ax\),再令 \(z=By\),那么 \(z=B(Ax)=(BA)x\)。
注意顺序:\(BA\) 表示先用 \(A\),再用 \(B\)。这和函数复合 \(g(f(x))\) 的顺序一致。很多初学者会把顺序读反。
小例子:先拉伸,再交换坐标
设
先做 \(A\):
再做 \(B\),交换两个坐标:
如果先算复合矩阵:
结果一致。这个例子也说明矩阵乘法通常不交换:\(BA\) 和 \(AB\) 往往代表不同的操作。
Transformer 中,输入 token 表示矩阵 \(X\) 会乘不同参数矩阵得到 \(Q,K,V\):
这不是三个神秘公式,而是把同一批 token 表示投影到三个不同的子空间:查询空间、键空间和值空间。后续 attention 用 \(QK^T\) 比较 token 之间的相关性,再用权重混合 \(V\)。
#秩:独立信息的维度
秩表示一个矩阵真正保留了多少个独立方向。更具体地说,矩阵的秩等于它的列空间维度,也等于它的行空间维度。虽然“列”和“行”看起来不同,但它们的独立信息数量总是相同。
计算小矩阵的秩时,最直观的方法是看有多少列向量互相不能由对方组合出来。也可以做行消元,看最后有多少个非零主元行。
小例子:秩为 1 的矩阵
第一列是 \((1,2)^T\),第二列是 \((2,4)^T\)。第二列等于第一列的 2 倍,所以两列只有一个独立方向。因此 \(\operatorname{rank}(A)=1\)。
这个矩阵把二维输入压到一条直线方向上。输入虽然有两个坐标,但输出只沿一个方向变化,所以它丢掉了一个自由度。
小例子:秩为 2 的三维到二维矩阵
三列分别是 \(c_1=(1,0)^T\),\(c_2=(0,1)^T\),\(c_3=(1,1)^T\)。其中 \(c_3=c_1+c_2\),所以第三列不是新的独立方向。但 \(c_1\) 和 \(c_2\) 独立,已经能张成整个 \(\mathbb{R}^2\)。因此 \(\operatorname{rank}(B)=2\)。
注意:\(B\) 有 3 个输入维度,但输出最多只有 2 维,所以秩不可能超过 2。一般地,若 \(A\in\mathbb{R}^{m\times n}\),则 \(\operatorname{rank}(A)\le \min(m,n)\)。
秩是“可识别自由度”的数量。在线性回归里,如果特征矩阵秩亏,说明有些参数方向无法被数据区分,参数解可能不唯一。在 LoRA 里,我们反过来主动使用低秩更新,让模型只在少数方向上改变,从而减少训练参数并控制更新自由度。
LoRA 常把一个大权重更新 \(\Delta W\) 写成两个小矩阵的乘积:
这里 \(r\) 是低秩瓶颈维度。公式读法是:虽然 \(\Delta W\) 看起来可能很大,但它的变化被限制在不超过 \(r\) 个独立方向里。这就是“低秩适配”的数学含义。
#列空间、行空间与零空间
理解矩阵 \(A\) 的最好方式,是同时看它的几个空间。设 \(A\in\mathbb{R}^{m\times n}\)。它把输入 \(x\in\mathbb{R}^n\) 变成输出 \(Ax\in\mathbb{R}^m\)。列空间在输出空间里,零空间在输入空间里。
列空间 \(\operatorname{Col}(A)\):所有可能输出 \(Ax\) 的集合,也就是 \(A\) 的列向量能张成的空间。
行空间 \(\operatorname{Row}(A)\):由 \(A\) 的行向量张成的空间,描述输入中真正会被矩阵读取的方向。
零空间 \(\operatorname{Null}(A)\):所有满足 \(Ax=0\) 的输入方向。这些方向会被矩阵完全压扁,对输出没有影响。
左零空间:所有满足 \(A^Ty=0\) 的输出侧方向。它描述哪些输出方向永远无法由 \(A\) 产生。
这个公式读作:输入空间可以分解成两部分,一部分会影响输出,即行空间;另一部分完全不影响输出,即零空间。符号 \(\oplus\) 表示直和,可以理解成“不重叠地拼起来”。
完整例题:列空间和零空间
考虑矩阵
求它的秩、列空间和零空间。
第一步,看列空间。两列是 \(c_1=(1,2)^T\),\(c_2=(2,4)^T=2c_1\)。所以列空间只有一个方向:
因此 \(\operatorname{rank}(A)=1\)。这说明所有输出都只能落在 \((1,2)^T\) 这条直线上。
第二步,求零空间。设 \(x=(x_1,x_2)^T\),要求 \(Ax=0\):
两个方程其实是同一个条件:\(x_1+2x_2=0\)。令 \(x_2=t\),则 \(x_1=-2t\)。
解释:沿着 \((-2,1)^T\) 这个输入方向移动,输出完全不变,因为这个方向会被 \(A\) 压成 0。
完整例题:三维输入里的一个不可见方向
设
求 \(\operatorname{Null}(B)\)。
令 \(x=(x_1,x_2,x_3)^T\),有
所以 \(x_1=-x_3\),\(x_2=-x_3\)。令 \(x_3=t\),得到
因此零空间是一条直线。矩阵 \(B\) 从三维输入输出到二维,秩为 2,零空间维度为 1。它正好符合秩-零度定理:
这里的 \(3\) 是输入维度。直觉上,三维输入中有两个方向会被输出看见,还有一个方向被隐藏掉。
如果 \(b\) 不在 \(A\) 的列空间中,方程 \(Ax=b\) 没有精确解。下一章的最小二乘会处理这种情况:它会在列空间里找一个离 \(b\) 最近的点,也就是把 \(b\) 投影到 \(\operatorname{Col}(A)\) 上。
#面试连接、误区与检查清单
LLM:embedding 空间
token embedding 是高维向量。模型训练会调整这个空间,让语义、句法、任务相关信息在某些方向上可分。面试里不要只说“embedding 是向量”,还要说后续层通过矩阵乘法持续变换这些表示。
LLM:attention 投影
\(W_Q,W_K,W_V\) 是三个线性变换。它们把同一个 token 表示投到不同子空间,使模型可以分别计算“我在找什么”“我拥有什么键”“我要传递什么值”。
LLM:LoRA 低秩
LoRA 把大矩阵更新限制成低秩乘积 \(\Delta W=BA\)。这不是简单少存参数,而是限制更新只发生在少数独立方向上。
Quant:因子暴露
因子模型 \(R=Bf+\epsilon\) 中,\(B\) 是资产对因子的暴露矩阵,\(f\) 是因子收益。若因子高度相关,暴露矩阵可能有效秩低,风险解释会变得不稳定。
这个量化公式读作:资产收益 \(R\) 可以分解为因子暴露 \(B\) 乘因子收益 \(f\),再加上无法由因子解释的残差 \(\epsilon\)。如果 \(B\) 的列之间接近线性相关,不同因子的贡献就难以区分,估计会不稳定。
| 常见误区 | 为什么错 | 正确说法 |
|---|---|---|
| 向量就是二维或三维箭头 | 箭头只是可视化,高维特征同样是向量 | 向量是可以加法和数乘的坐标化对象 |
| 矩阵只是数字表 | 只看数字会丢掉输入输出关系 | 矩阵是线性变换,行决定输出坐标,列决定输出方向 |
| 列多,秩就高 | 列可能互相线性相关 | 秩数的是独立列或独立行的数量 |
| 零空间是没有用的东西 | 零空间说明哪些输入变化不会影响输出 | 零空间是不可识别方向、信息丢失方向 |
| 低秩一定不好 | 低秩也可以是主动正则或参数高效设计 | LoRA、PCA、因子模型都会利用低秩结构 |
面试追问:为什么低秩可以节省参数?
假设一个权重更新 \(\Delta W\in\mathbb{R}^{1000\times 1000}\),直接训练需要 \(1000\times 1000=1{,}000{,}000\) 个参数。若用秩 \(r=8\) 的 LoRA 形式 \(\Delta W=BA\),其中 \(B\in\mathbb{R}^{1000\times 8}\),\(A\in\mathbb{R}^{8\times 1000}\)。
参数量变成 \(1000\times 8+8\times 1000=16{,}000\)。这大幅减少了可训练参数。更重要的是,它让更新只能通过 8 个中间方向组合出来,相当于假设任务适配不需要改变所有独立方向。
- 我能用一句话说明:向量是对象的坐标表示,不只是几何箭头。
- 我能解释线性组合、张成、线性无关、基、维度之间的关系。
- 我能读懂 \(A\in\mathbb{R}^{m\times n}\):它接收 \(n\) 维输入,输出 \(m\) 维向量。
- 我能说明矩阵乘法 \(BAx\) 的顺序:先做 \(A\),再做 \(B\)。
- 我能判断一个小矩阵的秩,并说明哪些列是冗余的。
- 我能求简单矩阵的零空间,并解释它代表“输出看不见的输入方向”。
- 我能说明列空间为什么决定 \(Ax=b\) 是否有解。
- 我能把 embedding、attention 投影、因子暴露和 LoRA 低秩分别对应到本章概念。