一串齿轮:大轮转一点,小轮动多少
大齿轮转一圈带动中齿轮转 3 圈,中齿轮再带动小齿轮转 4 圈。大轮转一点点,小轮动多少?3 × 4 = 12 倍。传动比是乘起来的,不是加起来的。
🧠 一句话结论
链式法则就是"传动比连乘":一串环节串起来,最前面动一点点,最后面动多少,等于每一级传动比乘起来。反向传播就是把这条链倒着走一遍——从最后的罚分出发,一级级把传动比乘回去,算出每个参数该往哪调、调多少。而连乘一串小于 1 的数会指数级衰减,连乘大于 1 的会指数级放大,这就是梯度消失和爆炸。
场景问题
科技课上做了个传动装置:三个齿轮串在一起。
- 大轮转 1 圈,中轮转 3 圈
- 中轮转 1 圈,小轮转 4 圈
老师问:大轮转一点点,小轮动多少?
同学甲说:3 + 4 = 7 倍。
不对。大轮转 1 圈 → 中轮转 3 圈 → 每圈又带动小轮 4 圈 → 小轮转 3 × 4 = 12 圈。传动比是乘起来的。
现在把这件事挪到模型上。前两篇讲过:模型要顺着坡往下走,就得知道每个参数变一点点,最后的罚分会变多少——也就是罚分对这个参数的坡度。
麻烦在于,一个参数藏在第三层,而罚分是在第二十层之后才算出来的。它俩中间隔着十七层。这个参数动一点点,罚分动多少?
这跟齿轮问题是同一道题,只是齿轮多了十七个。
实现方案
串起来的传动比要乘起来
先把齿轮那件事说透,因为它就是全部。
每一级传动比,就是第二十篇的坡度——"这一级的输入动一点,输出动多少"。
这条规矩就叫链式法则:
这行的意思是:一串环节串起来,最前面动一点点导致最后面动多少,等于把每一级的传动比全乘起来。
为什么是乘不是加?想想那句话就明白了:大轮转一圈,中轮转 3 圈;而中轮每转一圈小轮转 4 圈——所以中轮转的那 3 圈,每一圈都带来 4 圈。是"每一份里又有几份",这天然就是乘法。
反向传播:从罚分开始,倒着乘回去
现在回到模型。一个二十层的网络,一个参数藏在第三层。
从前往后算(正向):数据从第一层进去,一层层往后算,最后得出罚分。
从后往前算(反向):从罚分出发,把每一级的传动比一级级往回乘。乘到第三层,就知道那个参数的坡度了。
盯住那块紫色色块:它从最右边的罚分出发,一层层往左传,每过一层就被乘上那一层的传动比——有的层把它放大(乘 1.2),有的层把它缩小(乘 0.6)。传到第一层时,它已经小了一大圈。
这个"从罚分出发倒着乘回去"的过程,就叫反向传播。
这里要澄清一件常被误会的事:反向传播不是另一套算法。 它就是前向那条链倒着乘一遍,用的还是链式法则那条规矩。前向算的是"输入变成什么输出",反向算的是"输出的偏差该分摊给谁多少",走的是同一条链,方向相反而已。
按贡献分,不是平均分
反向传播分摊"该改多少"时,不是每层分一样多。
传动比大的那一层,一点点改动就能让罚分变很多——它责任大,分到的调整也大。传动比接近 0 的那一层,怎么改罚分都几乎不动——它几乎没责任,分到的调整也就微乎其微。
这很公平:谁的影响大,谁就多担责。 平均分反而不合理——一个几乎不起作用的参数,凭什么和一个举足轻重的参数改得一样多?
连乘的代价:要么消失,要么爆炸
链式法则的"连乘"是它最强的地方,也是它最脆弱的地方。
连乘一串小于 1 的数,衰减得极快:
| 层数 | 每层都乘 0.5,传到最前面还剩 |
|---|---|
| 5 层 | 0.03 |
| 10 层 | 0.001 |
| 20 层 | 0.000001 |
| 50 层 | 小到基本等于 0 |
传到最前面几乎什么都不剩了,前面几层的参数收到的调整近乎为 0——它们等于没在学。这就是梯度消失。
反过来,连乘一串大于 1 的数,涨得同样凶:
每层乘 1.5,20 层之后是 3300 多倍,50 层之后是天文数字。调整量大到离谱,参数被一脚踹飞,训练直接崩掉。这就是梯度爆炸。
两条曲线说明了一切:连乘几乎没有"中庸"这个选项。每层的传动比只要稳定地略小于 1,几十层下来必然趴到 0;只要稳定地略大于 1,几十层下来必然冲上天。
这就是"深层网络难训练"的数学根源——不是层数本身有问题,是连乘这个动作对偏差极其敏感。
对付它的思路也很直接:别让链条那么长。给网络加一条"抄近路"的通道,让罚分能绕过中间几层直接传回前面——传动比不用连乘那么多次,自然就不容易消失或爆炸。这就是残差连接干的事。
为什么这么做
为什么传动比是乘起来的,不是加起来的?
因为每一级放大的是上一级的结果,不是原始输入。大轮转 1 圈让中轮转 3 圈,中轮每转一圈又让小轮转 4 圈——所以那 3 圈里每一圈都带来 4 圈。"每一份里又有几份",这天然就是乘法。
为什么要倒着传,不能从前往后算每个参数的坡度?
能算,但贵得离谱。从前往后算,每个参数都得单独走一遍全程;模型有几十亿个参数,就得走几十亿遍。
倒着传只需要从罚分出发走一遍,路过每一层时顺手把那一层所有参数的调整量都算出来了。一遍抵几十亿遍——这才是它能用在大模型上的根本原因。
为什么按传动比分摊,而不是平均分?
因为谁的影响大,谁就该多担责。传动比大的层,一点改动就能让罚分变很多;传动比接近 0 的层,怎么改都没用。给后者和前者分一样多的调整,纯属浪费。
为什么别的选择不行
错误直觉一:以为反向传播是把误差平均分给每一层
不是平均分,是按传动比分。
传动比大的层分得多,传动比接近 0 的层几乎分不到。这不是偏心,是按实际影响力分配——一个几乎不起作用的参数,改多改少罚分都不动,给它分调整量纯属浪费。
按"平均分"来理解的后果是:你会想不通为什么有些层训练时几乎纹丝不动。它们不是被忽略了,是它们的传动比确实接近 0。
错误直觉二:以为层数越多梯度自然越大
正好相反,通常是越传越小。
每层的传动比往往小于 1,连乘之下是指数级衰减:每层乘 0.5,20 层之后只剩百万分之一。传到最前面几乎什么都不剩,前几层等于没在学。
"层数多 = 信号强"这个直觉在这里彻底失效。连乘不是累加:累加是层数越多总量越大,连乘是层数越多越容易走极端——要么趴到 0,要么冲上天。
错误直觉三:以为反向传播是另一套算法
它就是前向那条链倒着乘一遍,用的还是链式法则那条规矩,没有第二套东西。
- 前向:输入 → 一层层算 → 罚分
- 反向:罚分 → 一层层乘回传动比 → 每个参数该改多少
同一条链,同一条规矩,只是方向相反。 把它当成两套独立的东西,就会去找那些根本不存在的"反向传播的特殊公式"——其实就是齿轮传动比乘一遍而已。
沉淀结论
- 链式法则 = 传动比连乘:一串环节串起来,最前面动一点导致最后面动多少,等于每级传动比全乘起来(不是加起来)
- 每一级的传动比,就是第二十篇的坡度——这一级输入动一点,输出动多少
- 反向传播 = 从罚分出发,倒着把传动比一级级乘回去,得出每个参数该往哪调、调多少
- 按传动比分摊,不是平均分——影响大的层担的责任大;而且倒着传一遍就能算出所有参数,比正着算便宜几十亿倍
- 连乘没有中庸:一串小于 1 的数连乘会指数级衰减(梯度消失),一串大于 1 的会指数级放大(梯度爆炸)——这是深层网络难训练的数学根源
记忆口诀
链式法则 = 传动比连乘,不是相加。
每一级的传动比,就是那一级的坡度。
反向传播 = 从罚分出发,倒着乘回去。
按影响力分摊责任,不是平均分。
连乘没有中庸:要么趴到零,要么冲上天。
延伸阅读
- 梯度消失与爆炸,以及残差连接为什么有用:残差连接给罚分开了一条"抄近路"的通道,绕过中间几层直接传回前面——链条短了,连乘的次数少了,自然不容易消失或爆炸。详见大模型核心原理。
自测:合上资料能说清楚吗?
- 大轮带中轮 3 倍、中轮带小轮 4 倍。大轮转一点点,小轮动多少?
参考答案
12 倍(3 × 4),不是 7 倍。
因为每一级放大的是上一级的结果:大轮转 1 圈让中轮转 3 圈,而中轮每转一圈又让小轮转 4 圈——那 3 圈里每一圈都带来 4 圈。"每一份里又有几份",天然就是乘法。
- 反向传播是一套独立于前向计算的算法吗?
参考答案
不是。 它就是前向那条链倒着乘一遍,用的还是链式法则那条规矩。
前向:输入 → 一层层算 → 罚分。反向:罚分 → 一层层乘回传动比 → 每个参数该改多少。同一条链、同一条规矩,只是方向相反。
- 反向传播是把误差平均分给每一层吗?
参考答案
不是,是按传动比分。 传动比大的层分得多,传动比接近 0 的层几乎分不到。
这不是偏心,是按实际影响力分配责任——一个改多改少罚分都不动的参数,给它分调整量纯属浪费。这也解释了为什么有些层训练时几乎纹丝不动:不是被忽略了,是它们的传动比确实接近 0。
- 为什么层数一多,前面几层就"学不动"了?
参考答案
因为连乘会指数级衰减。每层传动比往往小于 1,每层乘 0.5 的话:10 层剩千分之一,20 层剩百万分之一,50 层基本等于 0。
传到最前面几乎什么都不剩,前几层收到的调整近乎为 0,等于没在学——这就是梯度消失。反过来传动比都大于 1 就会爆炸。连乘没有中庸。
- 为什么要从后往前传,不从前往后逐个算每个参数的坡度?
参考答案
从前往后算贵得离谱。 每个参数都得单独走一遍全程,模型有几十亿参数就得走几十亿遍。
倒着传只需要从罚分出发走一遍,路过每层时顺手把那一层所有参数的调整量都算出来——一遍抵几十亿遍。这才是它能用在大模型上的根本原因。