叠一百层还是一层:折一下,才能造出弯的
一张照片,你放大、拉宽、旋转、再拉斜……折腾一百次。照片里那些笔直的电线杆,永远还是笔直的。想让它弯,光靠这些动作永远做不到——你得把纸真的折一下。
🧠 一句话结论
矩阵变换有个跑不掉的脾气:直线永远还是直线。所以连着做一百次矩阵变换,效果跟做一次完全一样(第五篇结合律的直接推论)。想造出弯曲的关系,中间必须插一个"不是矩阵"的动作——哪怕只是简单折一下。这就是激活函数存在的全部理由。
场景问题
你在修图软件里折腾一张照片。
工具栏里有放大、缩小、拉宽、压扁、旋转、拉斜——你把它们一通乱按,按了一百下。照片被折腾得面目全非,但你盯着看了半天,发现一件事:
照片里那根电线杆,从头到尾都是直的。
不管你怎么按,直的还是直的,平行的还是平行的。想把电线杆弄弯——弯成一个弧、拧成一个 S——你在这个工具栏里找不到任何一个按钮能办到。
这不是软件做得不好。这是这一类工具天生做不到的事。
那问题来了:要是所有工具都有这个毛病,怎么才能造出"弯"的东西?加更多按钮行不行?按更多下行不行?
实现方案
矩阵变换的三条铁律
第四篇讲过:矩阵就是把整张方格纸搬一次家。搬完之后,网格会有三条雷打不动的性质:
- 直线还是直线——搬家之后不会拐弯
- 平行还是平行——原来平行的格线,搬完还平行
- 原点不动——(0,0) 搬完还在 (0,0)
这三条就是"线性"这个词的全部含义。线性 = 老老实实的搬家:可以拉长、压扁、旋转、拉斜,但不许弯、不许折、不许撕。
修图工具栏里那些按钮,全都是矩阵变换。所以电线杆怎么按都是直的——不是你没找对按钮,是整个工具栏都做不到这件事。
叠一百层,还是一层
那多按几下呢?按一百下总该攒出点弯的吧?
不行,而且理由干脆得让人有点意外。
第五篇讲过:连着做两次矩阵变换,效果等于做一次——把两个矩阵乘起来,得到的还是一个矩阵。
那三次呢?先把前两次合成一个,再和第三次合成一个,还是一个矩阵。一百次呢?合到最后还是一个矩阵。
这行的意思是:一百个矩阵连着乘,乘出来的还是一个矩阵,跟只做一次没有任何区别。
盯住这个动画:网格被拉、被压、被拧,形状变了好几轮,但格线从头到尾都是笔直的、平行的。叠再多次也一样。
这件事说得再直白一点:纯线性的一百层,和纯线性的一层,能表达的东西一模一样。 层数在这里一分钱的作用都没有。
插一个折弯的动作
要造出弯的,必须在中间插一个不是矩阵的动作——一个会破坏"直线还是直线"的动作。
这个动作可以简单到让人失望。比如就一条规矩:
负数一律压成 0,正数原样通过。
就这么一句话。它甚至连乘法都没有。但它足以把"直线还是直线"这条铁律打破:
左边是纯矩阵变换:一条直线,从头直到尾。右边插了那条规矩:负的那半边被压平了,出现一个折角——它不再是一条直线。
只要有了折角,情况就完全不同了:
- 一个折角能拼出一个"拐弯"
- 十个折角能拼出一段粗糙的弧
- 几千个折角拼起来,看上去就跟真正的曲线没区别了
这就是"矩阵 → 折一下 → 矩阵 → 折一下 → ……"这种夹心结构存在的理由。 中间那些折弯动作,才是让层数真正开始起作用的东西。这类专门用来"折一下"的动作,有个名字叫激活函数——就是"负责把直线掰弯的那一步"。
层数这时候才开始值钱
现在回头看"层数"这件事,意思完全变了:
| 纯矩阵,一百层 | 矩阵 + 折弯,交替一百层 | |
|---|---|---|
| 合起来是什么 | 还是一个矩阵 | 一个能拼出各种弯曲形状的东西 |
| 能表达的关系 | 只有直的 | 直的、弯的、拐来拐去的都行 |
| 加层数有用吗 | 一点用都没有 | 每加一层都能多几个折角,表达力更强 |
层数本身不产生表达力,"层与层之间那个折弯"才产生表达力。 没有折弯,堆一千层等于堆一层;有了折弯,每一层才算数。
为什么这么做
为什么"直线还是直线"是矩阵变换跑不掉的脾气?
因为矩阵干的事就是"整张网格一起搬家",第四篇讲过:它只规定了几根量尺搬到哪儿,剩下的点全按同样的比例跟着走。既然大家都按同一套比例走,原来在一条线上的点,走完还在一条线上。这是"整齐划一地搬"必然带来的结果,不是设计时忘了考虑弯曲。
为什么折弯的动作可以这么简单?
因为要打破的只是"直线永远是直线"这一条。一个折角就足够了——剩下的复杂形状交给层数去堆。用一个简单动作重复很多次,比用一个复杂动作做一次更省事,也更好算。修个折角比修条曲线容易得多。
为什么不干脆发明一种"能弯的矩阵"?
因为矩阵之所以好用,全靠它那份整齐:能相乘合并、能求逆倒着走、能算面积缩放倍数。这些好处都建在"整齐划一地搬"上面。让它能弯,等于把这些好处全丢了。更划算的做法是保住矩阵的整齐,把弯曲的活儿交给中间那个又简单又便宜的折弯动作。
为什么别的选择不行
错误直觉一:以为层数够多,纯线性也能表达复杂关系
"一百层怎么也比一层强吧?"
一点也不强,是完全一样。一百个矩阵连着乘,乘出来还是一个矩阵——不是"差不多等于",是严格等于。你花一百层的计算量,买到的表达力和一层分毫不差。
这件事的后果很具体:如果哪天有人搭了一个很深的网络却忘了加折弯动作,那它无论训练多久、参数多少,能学会的关系永远只是直的。参数在动,能力却一步没涨。
错误直觉二:以为非线性必须是很复杂的函数
"要造出复杂的曲线,那个函数肯定得很花哨吧?"
恰恰相反。最常用的那个折弯动作,规矩就一句话:负数压成 0,正数原样通过。没有乘方、没有三角函数,连乘法都没有。
一个简单折角 + 很多层,就足以拼出各种弯曲形状。复杂度来自"重复很多次",不来自"单次动作有多花哨"——而且简单动作算起来快得多,这在几千亿次计算面前是决定性的。
错误直觉三:以为激活函数是为了防止数值爆炸
有些折弯动作确实顺带把数值压在一定范围里,看起来像在防爆炸。但那是副作用,不是本职。
本职只有一个:打破"直线永远是直线"。如果只是想控制数值大小,第十三篇的归一化更对口,而且归一化并不能让网络学会弯曲的关系。
把副作用当成本职的后果是:你会以为"数值稳住了就可以省掉激活函数",然后搭出一个再深也只会画直线的网络。
沉淀结论
- 矩阵变换有三条铁律:直线还是直线、平行还是平行、原点不动——这就是"线性"的全部含义
- 纯矩阵叠一百层,严格等于一层(第五篇结合律的直接推论),层数一分钱作用都没有
- 中间插一个"不是矩阵"的折弯动作,才能造出弯曲的关系——这类动作叫激活函数
- 折弯动作可以简单到只有一句规矩(负数压成 0),复杂度来自重复很多次,不来自单次动作有多花哨
- 层数本身不产生表达力,层与层之间那个折弯才产生表达力
记忆口诀
线性三条铁律:直的还是直的、平行还是平行、原点不动。
纯矩阵叠一百层,严格等于一层。
想要弯的,中间必须折一下。
折弯的动作可以极简单,复杂度靠层数堆。
折弯才让层数值钱。
那模型是怎么知道该在哪里折的
到这里,你已经能看懂一个模型算一遍是怎么回事了:
箭头进来 → 矩阵搬一次家(第四篇)→ 折一下 → 再搬一次 → 再折一下 → …… → 出结果。 中间要比"像不像"就做点积(第九篇),要换个角度看就换组量尺(第十一篇),要把尺子拉齐就归一化(第十三篇)。
但有一件事,前面十四篇一个字都没提:
那些矩阵里的数,到底是从哪儿来的?该在哪里折、折多陡,谁定的?
答案是:没人定,是模型自己一点点试出来的。
而"怎么试"这件事,需要另外一套完全不同的数学——不再是箭头和网格,而是怎么衡量"这次猜得有多离谱",以及知道离谱之后该往哪个方向改。
那正是接下来两组专题要讲的:先讲怎么给一堆可能性分蛋糕、怎么给猜错打分,再讲怎么顺着坡往下走、一步步把参数改好。
前十四篇讲的是模型算一遍;后八篇讲的是模型怎么学会。
自测:合上资料能说清楚吗?
- 在修图软件里只用放大、旋转、拉斜这些工具,能把一根笔直的电线杆弄弯吗?为什么?
参考答案
不能。 这些工具全都是矩阵变换,而矩阵变换有条铁律:直线永远还是直线。原因是矩阵干的事是"整张网格按同一套比例一起搬家",大家都按同样的比例走,原来在一条线上的点走完还在一条线上。这不是软件做得不好,是这类工具天生做不到。
- 纯矩阵变换叠一百层,和只做一层,表达力差多少?
参考答案
分毫不差,完全一样。 一百个矩阵连着乘,乘出来还是一个矩阵(矩阵乘法结合律的直接推论),不是"差不多等于"而是"严格等于"。
后果很具体:一个很深但忘了加折弯动作的网络,无论训练多久、参数多少,能学会的关系永远只是直的——参数在动,能力一步没涨。
- 要造出弯曲的关系,中间插的那个动作必须很复杂吗?
参考答案
恰恰相反,可以极简单。 最常用的那个规矩就一句话:负数压成 0,正数原样通过——没有乘方、没有三角函数、连乘法都没有。
一个简单折角加上很多层,就足以拼出各种弯曲形状。复杂度来自"重复很多次",不来自单次动作有多花哨——而且简单动作算得快得多,这在几千亿次计算面前是决定性的。
- 激活函数的本职工作是防止数值爆炸吗?
参考答案
不是,那是副作用。 本职只有一个:打破"直线永远是直线",让网络能表达弯曲的关系。
有些折弯动作顺带把数值压在一定范围里,看着像在防爆炸,但如果只是想控制数值大小,归一化更对口——而且归一化并不能让网络学会弯曲的关系。把副作用当本职,就会以为"数值稳住了就能省掉激活函数",然后搭出一个再深也只会画直线的网络。
- 既然要表达弯曲的关系,为什么不干脆发明一种"能弯的矩阵"?
参考答案
因为矩阵好用全靠它那份整齐:能相乘合并、能求逆倒着走、能算面积缩放倍数。这些好处全都建在"整齐划一地搬"上面,让它能弯就等于把这些好处全丢了。
更划算的做法是保住矩阵的整齐,把弯曲的活儿交给中间那个又简单又便宜的折弯动作——各司其职,两边的优点都留住了。