换空间是一种数学肌肉记忆:从 LLM 到顶级数学家的思考方式
你刚刚抓到一个很重要的东西:
很多数学公式不是为了炫技,而是在把问题搬到另一个更好处理的表达空间。
比如交叉熵里的 log:
p1 * p2 * ... * pN
这是概率空间里的连乘。它很符合“整段文本每一步都要押中”的事实,但工程上不好算、容易下溢、也不好按 token 平均。
于是我们换到 log 空间:
log(p1) + log(p2) + ... + log(pN)
乘法变加法,极小数变成可控数,整段概率变成平均 loss。最后再用:
PPL = exp(cross_entropy)
把 log 空间里的交叉熵翻译回人能读懂的“平均有效岔路数”。
这不是一个孤例。大模型里到处都是这种操作:
文本 -> token id
token id -> embedding 向量
logits -> probability
概率连乘 -> log loss
位置编号 -> RoPE 旋转相位
FP16 权重 -> int4 量化空间
大矩阵更新 -> LoRA 低秩子空间
这篇想讲的不是某一个公式,而是背后的脑回路:
当前空间哪里别扭?
有没有另一个空间让关键操作变简单?
换过去以后,保留了什么,牺牲了什么?
结果怎么换回来,或者怎么被下游继续使用?
这就是“换空间”的数学肌肉记忆。
1. 先定义:什么叫“空间”
这里的“空间”不一定是三维空间。它更像一种表达方式,一套坐标系,一种让对象能够被比较、计算、优化、压缩或组合的表示。
同一件事可以放在不同空间里看。
一段文字,在人眼里是:
“今天继续学习 AI Infra”
在 tokenizer 眼里是:
token 片段序列
在模型输入层是:
token id 序列
在 embedding 层是:
一串高维向量
在 attention 里是:
Q/K/V 三组向量
在采样前是:
logits 分数
在 softmax 后是:
概率分布
这些不是“换了名字”。每换一次空间,能做的操作都变了。
文本空间里,你很难做矩阵乘。token id 空间里,你可以查表。embedding 空间里,你可以算相似度和线性变换。logits 空间里,你可以自由加减分数。概率空间里,你可以解释不确定性。log 空间里,你可以稳定累加整段文本的 likelihood。
所以换空间的本质是:
不是改变对象本身,而是改变对象的表达方式,让某些操作变便宜、稳定、清楚。
2. 为什么顶级数学家和工程师会反复换空间
他们不是天生喜欢抽象。他们是长期被具体问题逼出来的。
一个问题在原空间里通常会有几种痛点:
1. 太难算
2. 太不稳定
3. 太高维
4. 结构看不见
5. 不方便比较
6. 不方便优化
7. 不方便存储或传输
所谓“高级数学脑回路”,很多时候就是对这些痛点形成了反射:
如果乘法太麻烦,能不能取 log?
如果离散符号不能算,能不能嵌入向量空间?
如果一堆变量缠在一起,能不能换一组基底?
如果时域里看不清,能不能去频域?
如果大矩阵太贵,能不能低秩分解?
如果连续数太占带宽,能不能量化?
如果绝对位置不好用,能不能编码成相对相位?
这不是背公式,而是一种提问习惯。
3. 一个朴素例子:地图就是换空间
真实城市是三维的,有道路、楼、高架、红绿灯、人流。
你要去一个地方,直接在真实世界里思考很复杂。地图把城市换到二维平面:
真实城市 -> 地图空间
地图牺牲了很多东西:楼的高度、建筑材质、路边店铺、空气温度。
但它保留了你当前最关心的结构:
道路连通性
相对位置
距离
方向
所以在地图空间里,路径规划变简单了。
这就是换空间的第一条原则:
好空间不是信息最多的空间,而是让当前任务最容易的空间。
模型里也是一样。FP16 权重信息比 int4 多,但 int4 在 decode 时带宽更省。原始文本信息比 token id 更贴近人类,但 token id 才能进入 embedding。完整大矩阵更新表达能力强,但 LoRA 低秩更新更便宜。
换空间永远有取舍。
4. 换空间的五种核心动机
4.1 难算变好算:乘法变加法
这是 log 的故事。
原空间:
P(text) = p1 * p2 * ... * pN
问题:
很多小概率相乘会极小,容易下溢;
乘法结构也不好按 token 平均。
换到 log 空间:
log(P(text)) = log(p1) + log(p2) + ... + log(pN)
好处:
可加
可平均
数值稳定
可作为 loss 优化
这是大模型训练里最典型的换空间。
4.2 离散变连续:token id 变 embedding
文字和 token id 本质是离散符号。
token id = 12345
token id = 67890
这些编号本身没有连续意义。67890 不比 12345 “大”出某种语义。编号只是查表索引。
模型要做的是语义计算,所以必须换到连续向量空间:
token id -> embedding vector
向量空间里可以做:
加权求和
矩阵乘
点积相似度
梯度更新
聚类和插值
这就是为什么 embedding 是 LLM 的入口。它把离散符号搬进一个可以微分、可以优化、可以组合的空间。
4.3 混乱变解耦:换一组基底
很多问题难,不是因为信息不够,而是因为变量缠在一起。
想象二维平面里有一团斜着拉长的数据。用普通 x/y 坐标看,它两个方向都在变。但如果你把坐标轴旋转一下,让一根轴对准数据最长的方向,结构就清楚了:
原始坐标 -> 主方向坐标
这类思想在数学里到处都是:
特征向量
PCA
SVD
低秩分解
LoRA
LoRA 可以这样理解:
不要在完整大矩阵空间里更新所有参数;
把更新限制在一个低秩子空间里。
它牺牲了一部分自由度,但换来了训练参数少、显存省、部署方便。
这背后的问题是:
真正有用的变化,是不是集中在少数几个方向上?
如果是,就不必在全空间里乱跑。
4.4 看不见变看得见:位置变相位
RoPE 是一个特别好的例子。
token 的位置本来只是整数:
0, 1, 2, 3, ...
整数位置本身很难直接进入 attention 的 Q/K 点积。模型需要的不是“这是第 37 个 token”这种绝对标签,而是:
两个 token 相隔多远?
这个距离如何影响 attention?
RoPE 的做法是把位置换成旋转角度:
position -> angle -> rotate Q/K vector
这样 Q 和 K 做点积时,相对位置信息会自然进入结果。
这就是换空间的一个高阶动机:
把原本不好参与计算的结构,编码进后续操作天然会读取的形式里。
位置编号不好直接用,但旋转后的向量可以通过点积被 attention 使用。
4.5 昂贵变便宜:连续权重变量化整数
模型权重可以用 FP16 或 FP32 表示。
但 decode 时,每生成一个 token 都要读大量权重。带宽很贵,所以我们换空间:
FP16/FP32 权重 -> int8/int4 量化表示
量化不是免费午餐。它会牺牲精度,还要付出反量化开销。
但如果模型主要被内存带宽限制,那么少读字节通常很划算。
这就是工程里很常见的换空间:
用一点精度损失,换存储、带宽和吞吐。
这里的关键判断不是“int4 一定好”,而是:
当前瓶颈是不是带宽?
质量损失是否可接受?
反量化开销是否小于带宽收益?
顶级工程师的脑回路不是崇拜某个空间,而是知道每个空间的代价。
5. LLM 里的换空间总览
| 场景 | 原空间 | 目标空间 | 解决的问题 | 代价 |
|---|---|---|---|---|
| Tokenizer | 人类文本 | token id | 文本变成模型可处理的离散序列 | 切分会丢失人类直觉里的字/词边界 |
| Embedding | token id | 连续向量 | 离散符号可微、可矩阵乘 | 语义被压进训练得到的坐标 |
| Q/K/V 投影 | hidden 向量 | 查询/匹配/内容子空间 | 同一表示拆成不同职责 | 增加参数和计算 |
| Attention softmax | 相似度分数 | 权重分布 | 分数变成“看谁多少” | 分布可能过尖或过平 |
| Cross entropy | 概率连乘 | log 加法 | 稳定、可平均、可优化 | 数字不如概率直觉好读 |
| PPL | log loss | 平均有效岔路数 | 人能理解模型不确定性 | 容易被误读成“错误率” |
| RoPE | 位置整数 | 旋转相位 | 相对位置进入 Q/K 点积 | 长上下文外推需要额外处理 |
| RMSNorm | 原始激活 | 归一化尺度 | 控制尺度,稳定训练/推理 | 抹掉部分幅值信息 |
| Quantization | FP16/FP32 | int8/int4 | 降低存储和带宽 | 精度损失、反量化成本 |
| LoRA | 全矩阵更新 | 低秩子空间 | 低成本微调 | 表达能力受低秩限制 |
这张表的重点不是背术语,而是看每一行的共同格式:
原空间有什么痛点?
目标空间让什么操作变简单?
换过去牺牲了什么?
6. 顶级数学家的脑回路:不是聪明,而是反射问题不同
普通人看到公式,经常问:
这个公式怎么背?
更强的人会问:
这个公式从哪里来?
它解决了原问题里的哪个别扭点?
顶级数学家或工程师的反射更像这样:
1. 当前对象是什么?
2. 当前操作是什么?
3. 当前空间下,哪个操作最贵、最乱、最不稳定?
4. 有没有一个变换能保留关键结构,同时让这个操作变简单?
5. 换过去以后,是否还能回到原问题?
6. 如果不能完全回来,损失是否可接受?
这就是他们的“肌肉记忆”。
他们不是脑子里装着无限公式,而是对“问题形状”敏感。
看到连乘,他们想到 log。
看到周期,他们想到角度、相位、傅里叶。
看到高维相关变量,他们想到换基、主成分、低秩。
看到离散对象要学习,他们想到 embedding。
看到大矩阵太贵,他们想到分解、稀疏、量化。
看到全局重算太贵,他们想到缓存、增量更新、动态规划。
公式只是最后写下来的东西。真正高级的是前面的判断:
我现在不应该硬算,我应该换一种表示。
7. 用“十大思维”检查换空间是不是靠谱
你说想参考“十大思维”的质量。可以把它们变成一套换空间检查表。
7.1 第一性原理:原问题到底是什么
不要一上来问:
该用什么公式?
先问:
我真正要保留的事实是什么?
交叉熵的第一性原理不是 log,而是:
整段文本概率等于每一步真实 token 概率的连乘。
log 是后来的工具。
7.2 复利:这个空间以后能不能反复用
一个好的表达空间会成为长期资产。
embedding 不是只服务一个任务。它一旦建立,attention、FFN、分类头、检索、聚类都能复用。
log likelihood 也不是只服务 PPL。它服务训练 loss、模型比较、信息论解释和很多评估指标。
如果一个空间只能解决一次性小问题,它可能不值得引入。
7.3 长期主义:半年后这个解释还成立吗
不要只为当前模型版本找补。
比如:
PPL 低不等于模型一定会聊天。
这句话半年后仍然成立,因为 PPL 测的是 next-token prediction,不是完整产品能力。
好的换空间解释要经得起模型、硬件和框架变化。
7.4 杠杆:让后续操作更便宜
换空间的价值不是“看起来高级”,而是让后续步骤省力。
log 让连乘变求和
embedding 让符号能矩阵乘
RoPE 让位置进入点积
quantization 让权重读取变便宜
LoRA 让微调参数变少
如果换完空间后,后续操作没有更便宜、更稳定或更清楚,那就是无效抽象。
7.5 系统思维:看下游怎么使用
空间不是孤立存在的。
RoPE 之所以有用,是因为下游 attention 正好做 Q/K 点积。
量化是否划算,要看下游瓶颈是不是带宽。
PPL 是否有意义,要看下游是不是要比较同一评测设置下的语言建模质量。
所以每次问:
这个空间的输出,被下游哪个模块消费?
下游真的因此变简单了吗?
7.6 概率思维:不要绝对化
换空间通常不是“对或错”,而是概率和条件。
int4 可能更快,但质量可能掉。
LoRA 可能够用,但复杂任务可能表达力不足。
PPL 可能反映语言建模质量,但不等于指令跟随质量。
顶级判断不是说“某个空间永远最好”,而是说:
在这个条件下,它大概率更合适。
7.7 机会成本:不要为了优雅牺牲主线
有些变换很漂亮,但不一定值得。
学习时尤其要警惕:
我是不是为了理解一个支线数学,把主任务拖没了?
比如 Day 10 的目标是理解 PPL,不是深入实分析。你需要知道 ln 和 exp 为什么自然,不需要把自然底数的所有极限定理都啃完。
7.8 灰度思维:空间会保留一些东西,也会丢掉一些东西
地图保留道路,丢掉建筑细节。
tokenizer 保留可建模片段,丢掉人类字词边界。
量化保留近似权重,丢掉部分精度。
PPL 保留 next-token prediction 质量,丢掉对齐、工具调用、真实交互体验。
每个空间都要问:
它保留了什么?
它丢掉了什么?
丢掉的东西对当前任务重要吗?
7.9 绿灯思维:困惑是入口,不是失败
你这次问“为什么是 log”,其实是一个很好的信号。
当你觉得某个公式突兀时,不要急着判定自己数学差。更好的反应是:
这里一定有一个原空间的痛点,我还没看见。
把困惑当成入口,追问:
如果不用这个公式,会发生什么坏事?
很多数学动机就是这样被挖出来的。
7.10 反向思维:不用这个空间会怎样
检验一个空间是否必要,最好的办法是反过来:
如果不用 log,会怎样?
答案:
概率连乘会下溢,loss 不好平均,训练不稳定。
如果不用 embedding,会怎样?
token id 只是编号,不能表达语义相似度,也不能被梯度优化成连续结构。
如果不用 KV cache,会怎样?
decode 每步都要重算历史 token 的 K/V。
这个反向问题非常强。它能逼你看见公式背后的必要性,而不是只记住表面形式。
8. 怎么把这种脑回路练成肌肉记忆
不要靠“多看公式”硬堆。你需要固定练习动作。
每次遇到一个新公式、新算子、新优化技巧,写下这五问:
1. 原空间是什么?
2. 目标空间是什么?
3. 原空间里最别扭的操作是什么?
4. 换过去以后,哪个操作变简单?
5. 换空间的代价是什么?结果如何还原或被下游使用?
拿交叉熵练一遍:
原空间:概率空间,整段文本概率是连乘
目标空间:log 空间
痛点:小概率连乘会下溢,不好平均
收益:乘法变加法,可平均,可优化
代价:log 数字不直观,所以用 exp 得到 PPL
拿 embedding 练一遍:
原空间:token id 离散编号
目标空间:连续向量空间
痛点:编号不能表达语义,也不能直接做神经网络计算
收益:可矩阵乘、可点积、可梯度更新
代价:语义被压缩到训练出来的坐标里,不再是人类字典意义
拿 RoPE 练一遍:
原空间:整数位置
目标空间:旋转相位空间
痛点:整数位置不容易直接进入 Q/K 点积
收益:相对位置通过旋转后的点积自然出现
代价:长上下文外推需要处理频率和缩放问题
每天这样练 3 个公式,比泛泛看 30 页材料更有效。
9. 看论文和源码时怎么用
以后读 AI Infra 论文或源码,可以先不急着推公式。先在旁边写一个小表:
| 组件 | 原空间 | 目标空间 | 痛点 | 收益 | 代价 |
|---|---|---|---|---|---|
| softmax | logits | probability | 分数不能解释为概率 | 得到分布 | 可能过尖或过平 |
| RoPE | position id | rotation phase | 位置难进点积 | 相对距离进 attention | 外推复杂 |
| quantization | FP16 | int4/int8 | 带宽和存储贵 | 更小更快 | 精度损失 |
如果这张表填不出来,说明你还没真正理解这个机制。
这比背“RoPE 是旋转位置编码”更有用。因为面试官或论文作者真正关心的是:
为什么这样设计?
它解决了什么问题?
它的边界在哪里?
10. 最后一句:公式是变换的痕迹,不是思考的起点
很多人学数学和模型,会被公式吓住,是因为他把公式当成起点。
更好的顺序是:
先看原问题
再看痛点
再看需要保留的结构
再找一个更合适的空间
最后才写公式
公式只是这条路径留下的痕迹。
log 不是从天而降的符号。它是“概率连乘太难处理”这个痛点逼出来的坐标变换。
embedding 不是神秘向量魔法。它是“离散 token 不能做连续优化”这个痛点逼出来的表示空间。
RoPE 不是为了把三角函数塞进模型。它是“位置关系需要进入 Q/K 点积”这个痛点逼出来的相位空间。
量化不是单纯压缩。它是“decode 读权重太耗带宽”这个痛点逼出来的低比特空间。
所以你可以把这句话放进自己的学习方法里:
每当我看见一个公式,我先问:
它是不是在换空间?
如果是,原空间的问题是什么?
目标空间让什么变简单?
它丢掉了什么?
这个问题问久了,数学不再是一堆符号,而是一种工程判断力。
自检
- 为什么说“好空间不是信息最多的空间,而是让当前任务最容易的空间”?
- 交叉熵、embedding、RoPE、量化分别是在解决哪个原空间痛点?
- 一个空间变换必须问哪五个问题?
- 如果不用 log 计算整段文本概率,会遇到什么问题?
- 下次看到一个新公式,你准备先问什么?