笃行
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
首页
个人 & 心法
互联网/硬件后台
游戏基础架构
UE 引擎
游戏业务
AI / 大模型
数据结构与算法
机器学习数学
通用基础
GitHub
  • 向量入门

    • 看得见的机器学习数学
    • 向量是什么
    • 向量的加减与数乘
    • 线性组合与张成
  • 矩阵与变换

    • 矩阵是一次变换
    • 矩阵乘法
  • 度量与求解

    • 行列式与面积
    • 解方程组就是倒着走回去
    • 特征向量的直觉
    • 点积与相似度
  • 高维与结构

    • 高维空间的直觉
    • 正交基与投影
    • 秩与低秩
    • 长度与归一化
    • 线性与非线性
  • 概率与信息

    • 概率分布与采样
    • 期望与方差
    • 指数与 softmax
    • 对数与信息量
    • 交叉熵
  • 学习与优化

    • 导数就是坡度
    • 梯度下降
    • 链式法则与反向传播

叠一百层还是一层:折一下,才能造出弯的

一张照片,你放大、拉宽、旋转、再拉斜……折腾一百次。照片里那些笔直的电线杆,永远还是笔直的。想让它弯,光靠这些动作永远做不到——你得把纸真的折一下。

🧠 一句话结论

矩阵变换有个跑不掉的脾气:直线永远还是直线。所以连着做一百次矩阵变换,效果跟做一次完全一样(第五篇结合律的直接推论)。想造出弯曲的关系,中间必须插一个"不是矩阵"的动作——哪怕只是简单折一下。这就是激活函数存在的全部理由。


场景问题

你在修图软件里折腾一张照片。

工具栏里有放大、缩小、拉宽、压扁、旋转、拉斜——你把它们一通乱按,按了一百下。照片被折腾得面目全非,但你盯着看了半天,发现一件事:

照片里那根电线杆,从头到尾都是直的。

不管你怎么按,直的还是直的,平行的还是平行的。想把电线杆弄弯——弯成一个弧、拧成一个 S——你在这个工具栏里找不到任何一个按钮能办到。

这不是软件做得不好。这是这一类工具天生做不到的事。

那问题来了:要是所有工具都有这个毛病,怎么才能造出"弯"的东西?加更多按钮行不行?按更多下行不行?

实现方案

矩阵变换的三条铁律

第四篇讲过:矩阵就是把整张方格纸搬一次家。搬完之后,网格会有三条雷打不动的性质:

  1. 直线还是直线——搬家之后不会拐弯
  2. 平行还是平行——原来平行的格线,搬完还平行
  3. 原点不动——(0,0) 搬完还在 (0,0)

这三条就是"线性"这个词的全部含义。线性 = 老老实实的搬家:可以拉长、压扁、旋转、拉斜,但不许弯、不许折、不许撕。

修图工具栏里那些按钮,全都是矩阵变换。所以电线杆怎么按都是直的——不是你没找对按钮,是整个工具栏都做不到这件事。

叠一百层,还是一层

那多按几下呢?按一百下总该攒出点弯的吧?

不行,而且理由干脆得让人有点意外。

第五篇讲过:连着做两次矩阵变换,效果等于做一次——把两个矩阵乘起来,得到的还是一个矩阵。

那三次呢?先把前两次合成一个,再和第三次合成一个,还是一个矩阵。一百次呢?合到最后还是一个矩阵。

A100⋯A2A1=A合A_{100} \cdots A_2 A_1 = A_{\text{合}} A100​⋯A2​A1​=A合​

这行的意思是:一百个矩阵连着乘,乘出来的还是一个矩阵,跟只做一次没有任何区别。

连做三次矩阵变换:拉伸、压扁、旋转拉斜格线一直是直的、一直是平行的 —— 一次都没弯过

盯住这个动画:网格被拉、被压、被拧,形状变了好几轮,但格线从头到尾都是笔直的、平行的。叠再多次也一样。

这件事说得再直白一点:纯线性的一百层,和纯线性的一层,能表达的东西一模一样。 层数在这里一分钱的作用都没有。

插一个折弯的动作

要造出弯的,必须在中间插一个不是矩阵的动作——一个会破坏"直线还是直线"的动作。

这个动作可以简单到让人失望。比如就一条规矩:

负数一律压成 0,正数原样通过。

就这么一句话。它甚至连乘法都没有。但它足以把"直线还是直线"这条铁律打破:

纯矩阵变换一条直线,从头直到尾插入「负数压成 0」出现折角,不再是一条直线折点

左边是纯矩阵变换:一条直线,从头直到尾。右边插了那条规矩:负的那半边被压平了,出现一个折角——它不再是一条直线。

只要有了折角,情况就完全不同了:

  • 一个折角能拼出一个"拐弯"
  • 十个折角能拼出一段粗糙的弧
  • 几千个折角拼起来,看上去就跟真正的曲线没区别了

这就是"矩阵 → 折一下 → 矩阵 → 折一下 → ……"这种夹心结构存在的理由。 中间那些折弯动作,才是让层数真正开始起作用的东西。这类专门用来"折一下"的动作,有个名字叫激活函数——就是"负责把直线掰弯的那一步"。

层数这时候才开始值钱

现在回头看"层数"这件事,意思完全变了:

纯矩阵,一百层矩阵 + 折弯,交替一百层
合起来是什么还是一个矩阵一个能拼出各种弯曲形状的东西
能表达的关系只有直的直的、弯的、拐来拐去的都行
加层数有用吗一点用都没有每加一层都能多几个折角,表达力更强

层数本身不产生表达力,"层与层之间那个折弯"才产生表达力。 没有折弯,堆一千层等于堆一层;有了折弯,每一层才算数。

为什么这么做

为什么"直线还是直线"是矩阵变换跑不掉的脾气?

因为矩阵干的事就是"整张网格一起搬家",第四篇讲过:它只规定了几根量尺搬到哪儿,剩下的点全按同样的比例跟着走。既然大家都按同一套比例走,原来在一条线上的点,走完还在一条线上。这是"整齐划一地搬"必然带来的结果,不是设计时忘了考虑弯曲。

为什么折弯的动作可以这么简单?

因为要打破的只是"直线永远是直线"这一条。一个折角就足够了——剩下的复杂形状交给层数去堆。用一个简单动作重复很多次,比用一个复杂动作做一次更省事,也更好算。修个折角比修条曲线容易得多。

为什么不干脆发明一种"能弯的矩阵"?

因为矩阵之所以好用,全靠它那份整齐:能相乘合并、能求逆倒着走、能算面积缩放倍数。这些好处都建在"整齐划一地搬"上面。让它能弯,等于把这些好处全丢了。更划算的做法是保住矩阵的整齐,把弯曲的活儿交给中间那个又简单又便宜的折弯动作。

为什么别的选择不行

错误直觉一:以为层数够多,纯线性也能表达复杂关系

"一百层怎么也比一层强吧?"

一点也不强,是完全一样。一百个矩阵连着乘,乘出来还是一个矩阵——不是"差不多等于",是严格等于。你花一百层的计算量,买到的表达力和一层分毫不差。

这件事的后果很具体:如果哪天有人搭了一个很深的网络却忘了加折弯动作,那它无论训练多久、参数多少,能学会的关系永远只是直的。参数在动,能力却一步没涨。

错误直觉二:以为非线性必须是很复杂的函数

"要造出复杂的曲线,那个函数肯定得很花哨吧?"

恰恰相反。最常用的那个折弯动作,规矩就一句话:负数压成 0,正数原样通过。没有乘方、没有三角函数,连乘法都没有。

一个简单折角 + 很多层,就足以拼出各种弯曲形状。复杂度来自"重复很多次",不来自"单次动作有多花哨"——而且简单动作算起来快得多,这在几千亿次计算面前是决定性的。

错误直觉三:以为激活函数是为了防止数值爆炸

有些折弯动作确实顺带把数值压在一定范围里,看起来像在防爆炸。但那是副作用,不是本职。

本职只有一个:打破"直线永远是直线"。如果只是想控制数值大小,第十三篇的归一化更对口,而且归一化并不能让网络学会弯曲的关系。

把副作用当成本职的后果是:你会以为"数值稳住了就可以省掉激活函数",然后搭出一个再深也只会画直线的网络。

沉淀结论

  1. 矩阵变换有三条铁律:直线还是直线、平行还是平行、原点不动——这就是"线性"的全部含义
  2. 纯矩阵叠一百层,严格等于一层(第五篇结合律的直接推论),层数一分钱作用都没有
  3. 中间插一个"不是矩阵"的折弯动作,才能造出弯曲的关系——这类动作叫激活函数
  4. 折弯动作可以简单到只有一句规矩(负数压成 0),复杂度来自重复很多次,不来自单次动作有多花哨
  5. 层数本身不产生表达力,层与层之间那个折弯才产生表达力

记忆口诀

线性三条铁律:直的还是直的、平行还是平行、原点不动。
纯矩阵叠一百层,严格等于一层。
想要弯的,中间必须折一下。
折弯的动作可以极简单,复杂度靠层数堆。
折弯才让层数值钱。

那模型是怎么知道该在哪里折的

到这里,你已经能看懂一个模型算一遍是怎么回事了:

箭头进来 → 矩阵搬一次家(第四篇)→ 折一下 → 再搬一次 → 再折一下 → …… → 出结果。 中间要比"像不像"就做点积(第九篇),要换个角度看就换组量尺(第十一篇),要把尺子拉齐就归一化(第十三篇)。

但有一件事,前面十四篇一个字都没提:

那些矩阵里的数,到底是从哪儿来的?该在哪里折、折多陡,谁定的?

答案是:没人定,是模型自己一点点试出来的。

而"怎么试"这件事,需要另外一套完全不同的数学——不再是箭头和网格,而是怎么衡量"这次猜得有多离谱",以及知道离谱之后该往哪个方向改。

那正是接下来两组专题要讲的:先讲怎么给一堆可能性分蛋糕、怎么给猜错打分,再讲怎么顺着坡往下走、一步步把参数改好。

前十四篇讲的是模型算一遍;后八篇讲的是模型怎么学会。


自测:合上资料能说清楚吗?

  1. 在修图软件里只用放大、旋转、拉斜这些工具,能把一根笔直的电线杆弄弯吗?为什么?
参考答案

不能。 这些工具全都是矩阵变换,而矩阵变换有条铁律:直线永远还是直线。原因是矩阵干的事是"整张网格按同一套比例一起搬家",大家都按同样的比例走,原来在一条线上的点走完还在一条线上。这不是软件做得不好,是这类工具天生做不到。

  1. 纯矩阵变换叠一百层,和只做一层,表达力差多少?
参考答案

分毫不差,完全一样。 一百个矩阵连着乘,乘出来还是一个矩阵(矩阵乘法结合律的直接推论),不是"差不多等于"而是"严格等于"。

后果很具体:一个很深但忘了加折弯动作的网络,无论训练多久、参数多少,能学会的关系永远只是直的——参数在动,能力一步没涨。

  1. 要造出弯曲的关系,中间插的那个动作必须很复杂吗?
参考答案

恰恰相反,可以极简单。 最常用的那个规矩就一句话:负数压成 0,正数原样通过——没有乘方、没有三角函数、连乘法都没有。

一个简单折角加上很多层,就足以拼出各种弯曲形状。复杂度来自"重复很多次",不来自单次动作有多花哨——而且简单动作算得快得多,这在几千亿次计算面前是决定性的。

  1. 激活函数的本职工作是防止数值爆炸吗?
参考答案

不是,那是副作用。 本职只有一个:打破"直线永远是直线",让网络能表达弯曲的关系。

有些折弯动作顺带把数值压在一定范围里,看着像在防爆炸,但如果只是想控制数值大小,归一化更对口——而且归一化并不能让网络学会弯曲的关系。把副作用当本职,就会以为"数值稳住了就能省掉激活函数",然后搭出一个再深也只会画直线的网络。

  1. 既然要表达弯曲的关系,为什么不干脆发明一种"能弯的矩阵"?
参考答案

因为矩阵好用全靠它那份整齐:能相乘合并、能求逆倒着走、能算面积缩放倍数。这些好处全都建在"整齐划一地搬"上面,让它能弯就等于把这些好处全丢了。

更划算的做法是保住矩阵的整齐,把弯曲的活儿交给中间那个又简单又便宜的折弯动作——各司其职,两边的优点都留住了。

最近更新: 2026/9/10 11:38
Prev
长度与归一化