#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=\sum_{i=1}^d \alpha_i b_i \]

这个公式读作:向量 \(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)=3(1,0)+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\)。这个变换可以拉伸、压缩、旋转、投影,也可以把多个坐标混合成新的坐标。

\[ A= \begin{bmatrix} 2 & 0\\ 0 & 1 \end{bmatrix}, \qquad x= \begin{bmatrix} 3\\ 4 \end{bmatrix}, \qquad Ax= \begin{bmatrix} 6\\ 4 \end{bmatrix} \]

这个矩阵把横向坐标放大 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= \begin{bmatrix} 1 & 0 & 1\\ 0 & 2 & -1 \end{bmatrix} \]

则 \(A\) 把三维输入变成二维输出。

\[ Ax= \begin{bmatrix} 1\cdot 1+0\cdot 2+1\cdot 3\\ 0\cdot 1+2\cdot 2-1\cdot 3 \end{bmatrix} = \begin{bmatrix} 4\\ 1 \end{bmatrix} \]

第一行表示“第 1 个输出坐标如何由输入特征加权得到”,第二行表示“第 2 个输出坐标如何由输入特征加权得到”。这就是线性层 \(y=xW\) 或 \(y=Wx\) 的本质。

#矩阵乘法:先后做两个变换

矩阵乘法不是随便把表格里的数字相乘。它表达的是“变换的复合”:先做一个线性变换,再做另一个线性变换。若 \(y=Ax\),再令 \(z=By\),那么 \(z=B(Ax)=(BA)x\)。

\[ y=Ax,\qquad z=By=B(Ax)=(BA)x \]

注意顺序:\(BA\) 表示先用 \(A\),再用 \(B\)。这和函数复合 \(g(f(x))\) 的顺序一致。很多初学者会把顺序读反。

小例子:先拉伸,再交换坐标

\[ A= \begin{bmatrix} 2 & 0\\ 0 & 1 \end{bmatrix}, \qquad B= \begin{bmatrix} 0 & 1\\ 1 & 0 \end{bmatrix}, \qquad x= \begin{bmatrix} 1\\ 3 \end{bmatrix} \]

先做 \(A\):

\[ Ax= \begin{bmatrix} 2\\ 3 \end{bmatrix} \]

再做 \(B\),交换两个坐标:

\[ B(Ax)= \begin{bmatrix} 3\\ 2 \end{bmatrix} \]

如果先算复合矩阵:

\[ BA= \begin{bmatrix} 0 & 1\\ 2 & 0 \end{bmatrix}, \qquad (BA)x= \begin{bmatrix} 3\\ 2 \end{bmatrix} \]

结果一致。这个例子也说明矩阵乘法通常不交换:\(BA\) 和 \(AB\) 往往代表不同的操作。

Transformer 中,输入 token 表示矩阵 \(X\) 会乘不同参数矩阵得到 \(Q,K,V\):

\[ Q=XW_Q,\qquad K=XW_K,\qquad V=XW_V \]

这不是三个神秘公式,而是把同一批 token 表示投影到三个不同的子空间:查询空间、键空间和值空间。后续 attention 用 \(QK^T\) 比较 token 之间的相关性,再用权重混合 \(V\)。

#秩:独立信息的维度

秩表示一个矩阵真正保留了多少个独立方向。更具体地说,矩阵的秩等于它的列空间维度,也等于它的行空间维度。虽然“列”和“行”看起来不同,但它们的独立信息数量总是相同。

\[ \operatorname{rank}(A)=\dim(\operatorname{Col}(A))=\dim(\operatorname{Row}(A)) \]

计算小矩阵的秩时,最直观的方法是看有多少列向量互相不能由对方组合出来。也可以做行消元,看最后有多少个非零主元行。

小例子:秩为 1 的矩阵

\[ A= \begin{bmatrix} 1 & 2\\ 2 & 4 \end{bmatrix} \]

第一列是 \((1,2)^T\),第二列是 \((2,4)^T\)。第二列等于第一列的 2 倍,所以两列只有一个独立方向。因此 \(\operatorname{rank}(A)=1\)。

这个矩阵把二维输入压到一条直线方向上。输入虽然有两个坐标,但输出只沿一个方向变化,所以它丢掉了一个自由度。

小例子:秩为 2 的三维到二维矩阵

\[ B= \begin{bmatrix} 1 & 0 & 1\\ 0 & 1 & 1 \end{bmatrix} \]

三列分别是 \(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\) 写成两个小矩阵的乘积:

\[ \Delta W=BA,\qquad \operatorname{rank}(\Delta W)\le r \]

这里 \(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\) 产生。

\[ \mathbb{R}^n=\operatorname{Row}(A)\oplus\operatorname{Null}(A) \]

这个公式读作:输入空间可以分解成两部分,一部分会影响输出,即行空间;另一部分完全不影响输出,即零空间。符号 \(\oplus\) 表示直和,可以理解成“不重叠地拼起来”。

完整例题:列空间和零空间

考虑矩阵

\[ A= \begin{bmatrix} 1 & 2\\ 2 & 4 \end{bmatrix} \]

求它的秩、列空间和零空间。

第一步,看列空间。两列是 \(c_1=(1,2)^T\),\(c_2=(2,4)^T=2c_1\)。所以列空间只有一个方向:

\[ \operatorname{Col}(A)=\operatorname{span}\left\{ \begin{bmatrix} 1\\ 2 \end{bmatrix} \right\} \]

因此 \(\operatorname{rank}(A)=1\)。这说明所有输出都只能落在 \((1,2)^T\) 这条直线上。

第二步,求零空间。设 \(x=(x_1,x_2)^T\),要求 \(Ax=0\):

\[ \begin{bmatrix} 1 & 2\\ 2 & 4 \end{bmatrix} \begin{bmatrix} x_1\\ x_2 \end{bmatrix} = \begin{bmatrix} x_1+2x_2\\ 2x_1+4x_2 \end{bmatrix} = \begin{bmatrix} 0\\ 0 \end{bmatrix} \]

两个方程其实是同一个条件:\(x_1+2x_2=0\)。令 \(x_2=t\),则 \(x_1=-2t\)。

\[ x=t \begin{bmatrix} -2\\ 1 \end{bmatrix}, \qquad \operatorname{Null}(A)=\operatorname{span}\left\{ \begin{bmatrix} -2\\ 1 \end{bmatrix} \right\} \]

解释:沿着 \((-2,1)^T\) 这个输入方向移动,输出完全不变,因为这个方向会被 \(A\) 压成 0。

完整例题:三维输入里的一个不可见方向

\[ B= \begin{bmatrix} 1 & 0 & 1\\ 0 & 1 & 1 \end{bmatrix} \]

求 \(\operatorname{Null}(B)\)。

令 \(x=(x_1,x_2,x_3)^T\),有

\[ Bx= \begin{bmatrix} x_1+x_3\\ x_2+x_3 \end{bmatrix} = \begin{bmatrix} 0\\ 0 \end{bmatrix} \]

所以 \(x_1=-x_3\),\(x_2=-x_3\)。令 \(x_3=t\),得到

\[ x=t \begin{bmatrix} -1\\ -1\\ 1 \end{bmatrix} \]

因此零空间是一条直线。矩阵 \(B\) 从三维输入输出到二维,秩为 2,零空间维度为 1。它正好符合秩-零度定理:

\[ \operatorname{rank}(B)+\dim(\operatorname{Null}(B))=3 \]

这里的 \(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=Bf+\epsilon \]

这个量化公式读作:资产收益 \(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 低秩分别对应到本章概念。