线性组合与张成
上一章结尾留了个问题:只有两支箭头,只许用「缩放」和「相加」,你能到达平面上的哪些地方?这一章给出答案,而答案大方到令人起疑:只要两支箭不共线,你能到达每一个地方。两个元素,生成一整个世界——这个动作在线性代数里叫「张成」(span),它是本书书名的出处,也是理解「坐标」「基」「维度」乃至「模型的表达能力」的第一块基石。
线性组合:一份配方
把上一章的两种合法动作连起来用——先各自缩放,再相加——得到的东西叫线性组合(linear combination):
最好的读法是把它读成一份配方:a 份 v,加 b 份 w。a = 2, b = 1 是「两份 v 兑一份 w」;a = 1, b = −3 是「一份 v,倒扣三份 w」;份数可以是任何实数,包括负数、零和 3.14159。上一章的 lerp (1−t)·v + t·w 就是一族特殊配方——两个系数恰好凑成 1 的那些。
几何上,这份配方对应一条两段式路径:从原点出发,先沿 v 的方向走 a 倍的 v 长(a 为负就倒着走),再沿 w 的方向走 b 倍的 w 长,落点就是组合的结果。下面 Demo 里的两段浅色粗线画的就是这条路径,值得盯着它看:改 a,第一段伸缩;改 b,第二段伸缩;落点被这两个旋钮完全操纵。
坐标,原来一直是配方
现在兑现上一章那个「不起眼的改写」。向量 v = (2, 1) 可以写成:
左边是「坐标」,右边是「以 î 和 ĵ 为原料的配方」。它们不是恰好相等,而是同一句话的两种写法:所谓坐标 (2, 1),本来的含义就是「2 份 î,1 份 ĵ」。你从小学画到现在的直角坐标系,本质是一套约定俗成的配方系统,原料是那两支单位箭头。
这个视角一旦装进脑子,会连续引爆好几章的内容:既然坐标只是「以 î、ĵ 为原料」的配方,那换一组原料行不行?行——这就是基变换(第 13 章);某组原料是不是「够用又不浪费」?这就是基与线性无关(第 11 章);而「矩阵」将在第 06 章登场,它的真实身份是:一张写着「新原料长什么样」的说明书。卷一到卷三的主线剧情,全部从「坐标 = 配方」这句话里长出来。
张成:配方能做出的所有菜
固定原料 v 和 w,让配方 (a, b) 跑遍所有可能的实数对,所有落点组成的集合,叫 v 与 w 的张成:
它回答的问题正是本章开头那个:「这两支箭,到底能带我去哪儿?」注意张成是一个集合——一片领土,而不是某个具体的向量。用下面的 Demo 亲眼看看这片领土的形状:
推荐的玩法顺序:① 先拉 a、b 两个滑杆,感受紫色落点被配方操纵;② 点「撒点」,画布上撒出几百个不同配方的落点——它们铺满整个视野,没有空隙、没有禁区,这就是「张成 ℝ²」的直观含义;③ 点「把 w 变成 v 的倍数」,再看撒出的点:全部挤在一条过原点的直线上。原料共线,领土塌缩。拖动 v 或 w,观察 readout 里的共线检测什么时候报警。还有个隐藏玩法:把 w 拖得非常接近共线但不完全共线,再撒点——点还是能铺满平面,但分布被拉成瘦长的斜条,想凑出「垂直于 v」方向的目标,配方系数会大得吓人。这个「理论上可达、数值上勉强」的灰色地带,是第 21 章数值稳定性问题的第一次预演。
领土的三种命运
在二维平面上,两支向量的张成只有三种可能,一种比一种穷:
- 整个平面 ℝ²:v、w 不共线。哪怕夹角只有 0.1°,哪怕长度悬殊,只要方向不同,配方就能凑出任何目标——数学不嫌弃原料寒酸,只要求它们「提供了不同的方向」。
- 一条过原点的直线:v、w 共线(其中一支是另一支的倍数)。第二支箭没有提供任何新方向,配方再怎么调,都只能在同一条线上滑动。这时我们说 w 对张成的贡献是冗余的。
- 只有原点:v、w 都是零向量。巧妇难为无米之炊。
到三维空间里,剧本同样上演,只是多一幕:一支非零向量张成一条直线;两支不共线向量张成一张过原点的平面——想象两支箭撑起的一块无限大的玻璃板,斜插在三维空间里;三支「不共面」的向量才能张成整个 ℝ³。规律已经浮出水面:每添一支「真正带来新方向」的向量,领土升一维;添的是冗余向量,领土原地不动。「维度」这个词的严格定义(第 11 章)就藏在这句话里。
还有一条反向的规律同样重要:原料数量少于空间维度时,永远张不满。两支向量在 ℝ³ 里再怎么摆,顶多张成一张平面,总有整片空间够不着;k 支向量在 ℝⁿ 里(k < n)顶多张成 k 维子空间。这给了「表达能力」一个冰冷的上限:如果一个模型内部某处只允许 k 个自由度流通,它能表达的东西就被压在 k 维子空间里,再多训练也无济于事——第 12 章讲「秩」和第 23 章讲 LoRA 的瓶颈维度时,这条规律会反复回来敲门。
Demo 里那个「共线检测」是什么
Demo 的读数栏有一项 v×w = v₁w₂ − v₂w₁。这个小表达式是二维世界里的「共线报警器」:它等于 0,当且仅当两支向量共线。为什么?几何解释最痛快——v₁w₂ − v₂w₁ 恰好是两支箭张开的平行四边形的有向面积:不共线,平行四边形有面积,非零;共线,四边形被压扁成线段,面积为零。这个「面积检测器」你将在第 08 章隆重地重逢,它的大名叫行列式。本书的一个写作习惯是像这样提前埋线:很多「新」概念其实是旧朋友换了正装。
为什么张成的领土总是「过原点」的直线、平面?因为配方 a = b = 0 永远合法,它做出来的菜就是零向量——原点必在领土之内。这个小事实有工程后果:线性模型的拟合直线/平面永远过原点,想让它「平移」得额外加一个偏置项 b。神经网络每层的 Wx + b 里那个 +b,存在的理由正是把「过原点」这条枷锁解开。
两个易混点。其一:张成对系数没有范围限制,a、b 可以取到 ±∞,所以领土是无限延伸的——Demo 撒点只撒了 [−4, 4] 的窗口,别把「屏幕边缘」当成「领土边界」。其二:「span{v, w} = ℝ²」不代表「v、w 有什么特殊身份」,任何不共线的两支箭都行;坐标系选 î、ĵ 只是文明社会的默认习惯,不是数学的要求。这个「人人皆可为基」的民主性,第 13 章会变成主角。
领土的正式名字:子空间
「过原点的直线」「过原点的平面」「整个空间」——张成出来的领土,数学上有个统一的名字:子空间(subspace)。它的定义抓的是一种「封闭性」:一个向量集合是子空间,要求集合里任意两个向量相加、任意向量数乘,结果都还留在集合里。进得去,出不来——像一间对「加法和数乘」上了锁的房间。
用这个标准可以秒杀几个例子:过原点的直线是子空间(线上两支箭相加还在线上,缩放也在);不过原点的直线不是(线上两支箭相加会离开这条线,而且它连零向量都不包含);第一象限不是(乘以 −1 就跑出去了)。而任何一组向量的张成,天生满足封闭性——配方加配方还是配方,配方翻倍还是配方——所以张成永远是子空间;反过来,每个子空间也都能由某组向量张成。两个概念互为表里。
现在多认识这个词很划算,因为卷三开始它会高频出镜:矩阵的「列空间」是它所有列张成的子空间(第 12 章),「零空间」是被矩阵压到原点的向量组成的子空间,PCA 找的是「数据最贴身的低维子空间」(第 18 章)。每次读到「某某空间」,你都可以用今天的钥匙开锁:它是谁张成的?它几维?
组合家族的三个户口:线性、仿射、凸
给系数加不同的限制,线性组合会分化出三个常见变种。它们在 AI 文献里频繁出没,一次性认清能省很多困惑:
| 名字 | 系数限制 | 几何领土(两支向量时) | 典型出场 |
|---|---|---|---|
| 线性组合 | 无限制 | 整个平面(或直线) | 矩阵乘法、神经网络层 |
| 仿射组合 | a + b = 1 | 过两箭尖的整条直线 | lerp 及其外推 |
| 凸组合 | a + b = 1 且 a, b ≥ 0 | 两箭尖之间的线段 | 概率加权、注意力输出 |
凸组合值得多看一眼,因为它有一个温柔的性质:结果永远落在原料「围出来的范围」之内,不会跑飞。三个点的凸组合填满三角形,n 个点的凸组合填满它们围成的凸包。一组和为 1 的非负权重,数学上就是一个概率分布——所以「按概率混合」与「凸组合」是同一件事。第 22 章 Attention 的 softmax 权重恰好非负、恰好和为 1,于是注意力的输出是各个 V 向量的凸组合:模型再怎么分配注意力,输出也逃不出原料围成的凸包。这既是稳定性的来源,也是一种表达力的约束——一句你读完本书就能对着论文说出口的话。
写成代码,只有一行
线性组合的 NumPy 面孔朴素到几乎让人失望:
import numpy as np v = np.array([2.0, 0.6]) w = np.array([-0.8, 1.6]) combo = 1.5 * v + 1.0 * w # 一份配方,一行代码 # 同一件事的「批量版」:把 v、w 竖着拼成矩阵,配方写成向量 M = np.column_stack([v, w]) # shape (2, 2),每列一支原料 coef = np.array([1.5, 1.0]) combo2 = M @ coef # 与 combo 完全相等
注意第二种写法:把原料按列拼进矩阵 M,配方写成向量 coef,则 M @ coef 就是线性组合。这行代码提前泄露了第 06、09 章的天机——矩阵乘向量,本质就是「按配方组合矩阵的各列」。现在不必深究,只请记住这个画面:@ 符号的右边是配方,左边是原料仓库。
你手机屏幕上的张成
张成不是黑板上的玄学,你现在盯着的屏幕就是一个活例子。屏幕上每个像素的颜色由三个数控制:红、绿、蓝的强度。换句话说,每种颜色都是三支「原料向量」的线性组合:
粉色是「多红 + 少绿 + 中蓝」的配方,白色是三份全满,黑色是三份全空。整个可显示色域,就是三支原料的张成(系数被限制在 [0,1],所以是张成里的一块立方体区域)。设计师调色板上滑来滑去的三个滑杆,就是线性组合的系数 a、b、c。而印刷行业用青、品红、黄、黑四种原料——同一片颜色领土,不同的原料组,这已经是「换基」的雏形了。
ColorMatrix 是这一章的完美工程标本:一个 4×5 的矩阵,把每个像素的 (R, G, B, A) 重新线性组合成新的 (R', G', B', A')。做黑白滤镜,本质是让三个输出通道都变成同一份「0.213R + 0.715G + 0.072B」的配方;调饱和度、色温,全是改配方系数。你调用 setSaturation(0f) 时,框架在背后替你写的就是一份线性组合。
AI 里的张成思维
「这组向量能张成什么」在 AI 语境下有一个更响亮的名字:表达能力。几个例子,由浅入深:
推荐系统的口味空间。经典的矩阵分解推荐算法(第 17 章会遇到)把每部电影表示成几十维向量,而每个用户的口味是这些维度上的一份配方。系统认为你会喜欢的电影,就是「落在你的配方附近」的那些。当产品经理说「这个用户的兴趣可以分解为 60% 科幻 + 30% 悬疑 + 10% 纪录片」,他在不自知地描述一个线性组合。
生成模型的隐空间漫游。图像生成模型内部有一个「隐空间」,每个点解码出一张图。研究者发现其中存在有语义的方向:沿某个方向走,人脸逐渐变老;沿另一个方向,逐渐戴上眼镜。「让这张脸老十岁再戴上眼镜」,就是 z + 1.0·老化方向 + 0.8·眼镜方向——在隐空间里做一次线性组合。这些「语义方向」张成的子空间,某种意义上就是模型学会的「概念版图」。
Transformer 的残差流,是一本流水账。现代大模型的每一层并不是「加工后替换」输入,而是「算出一点修正,加回去」:x ← x + 层的输出。于是一个 token 的最终表示,等于初始 embedding 加上几十层各自贡献的向量之和——一个不折不扣的线性组合,可解释性研究者管这条不断累加的主干叫「残差流」(residual stream)。他们分析模型行为的标准动作,就是把残差流拆回各层贡献,看「女王」的含义里哪一层加进了「王室」方向、哪一层加进了「女性」方向。没有本章的语言,这类研究连问题都表述不出来。
注意力的输出,是一份动态配方。剧透第 22 章:Transformer 里每个词的新表示,是全句所有词的 V 向量的线性组合,而配方系数(注意力权重)是模型当场根据语境算出来的。「追」这个动词的输出里,可能是 0.4 份「猫」+ 0.35 份「激光点」+ 0.25 份其他——Attention 机制的本质,就是学会针对每个位置写配方。你现在已经能读懂这句话的一半,读完卷二会懂全部。
① 在 Demo 里把 v 拖到 (2, 1)、w 拖到 (−1, 2),用滑杆凑出落点 (0, 5)——需要几份 v、几份 w?(算一算再动手验证);
② span{(1,0), (2,0), (3,0)} 是什么?三支向量为什么没比一支强?
③ 「lerp 的 t 取 1.5」还在两点之间吗?它属于线性/仿射/凸组合中的哪一档?
④ 为什么 Attention 权重经过 softmax 后,输出一定逃不出各 V 向量围成的凸包?
小结
线性组合是「缩放再相加」的配方,坐标是以 î、ĵ 为原料的特殊配方;张成是配方能到达的全部领土,这片领土永远是一个过原点、对加法数乘封闭的子空间,它的维度取决于原料里有多少「真正不同的方向」——冗余的原料不添领土,不足的原料封死上限。给系数上不同的枷锁,又分化出仿射组合(和为 1)与凸组合(概率配方)两个变种。RGB 调色、ColorMatrix 滤镜、推荐系统的口味分解、残差流的逐层累加、Attention 的加权求和,全是同一份配方思维——这一章的词汇表(组合、张成、子空间、凸包)会是你读模型论文时最常撞见的一批。你可能注意到一个悬而未决的问题:Demo 里判断「共不共线」用了一个叫 v×w 的读数,而「两支向量像不像」这件事,似乎该有个正经的度量——下一章就造这把尺子,它叫点积,并且它顺手就是十亿级向量检索引擎的核心运算。