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

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

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

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

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

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

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

一串齿轮:大轮转一点,小轮动多少

大齿轮转一圈带动中齿轮转 3 圈,中齿轮再带动小齿轮转 4 圈。大轮转一点点,小轮动多少?3 × 4 = 12 倍。传动比是乘起来的,不是加起来的。

🧠 一句话结论

链式法则就是"传动比连乘":一串环节串起来,最前面动一点点,最后面动多少,等于每一级传动比乘起来。反向传播就是把这条链倒着走一遍——从最后的罚分出发,一级级把传动比乘回去,算出每个参数该往哪调、调多少。而连乘一串小于 1 的数会指数级衰减,连乘大于 1 的会指数级放大,这就是梯度消失和爆炸。


场景问题

科技课上做了个传动装置:三个齿轮串在一起。

  • 大轮转 1 圈,中轮转 3 圈
  • 中轮转 1 圈,小轮转 4 圈

老师问:大轮转一点点,小轮动多少?

同学甲说:3 + 4 = 7 倍。

不对。大轮转 1 圈 → 中轮转 3 圈 → 每圈又带动小轮 4 圈 → 小轮转 3 × 4 = 12 圈。传动比是乘起来的。

现在把这件事挪到模型上。前两篇讲过:模型要顺着坡往下走,就得知道每个参数变一点点,最后的罚分会变多少——也就是罚分对这个参数的坡度。

麻烦在于,一个参数藏在第三层,而罚分是在第二十层之后才算出来的。它俩中间隔着十七层。这个参数动一点点,罚分动多少?

这跟齿轮问题是同一道题,只是齿轮多了十七个。

实现方案

串起来的传动比要乘起来

先把齿轮那件事说透,因为它就是全部。

每一级传动比,就是第二十篇的坡度——"这一级的输入动一点,输出动多少"。

大轮中轮小轮×3×4三个齿轮串起来大轮 → 小轮的总传动比 = 3 × 4 = 12不是 3 + 4 = 7每一级的"传动比",就是那一级的坡度

这条规矩就叫链式法则:

总传动比=第一级×第二级×⋯×最后一级\text{总传动比} = \text{第一级} \times \text{第二级} \times \cdots \times \text{最后一级} 总传动比=第一级×第二级×⋯×最后一级

这行的意思是:一串环节串起来,最前面动一点点导致最后面动多少,等于把每一级的传动比全乘起来。

为什么是乘不是加?想想那句话就明白了:大轮转一圈,中轮转 3 圈;而中轮每转一圈小轮转 4 圈——所以中轮转的那 3 圈,每一圈都带来 4 圈。是"每一份里又有几份",这天然就是乘法。

反向传播:从罚分开始,倒着乘回去

现在回到模型。一个二十层的网络,一个参数藏在第三层。

从前往后算(正向):数据从第一层进去,一层层往后算,最后得出罚分。

从后往前算(反向):从罚分出发,把每一级的传动比一级级往回乘。乘到第三层,就知道那个参数的坡度了。

第 1 层第 2 层第 3 层第 4 层×1.2×0.6×0.6紫色色块 = 从罚分传回来的"该改多少"淡蓝细线:正向算一遍,从左往右橙色箭头:反向传回来,从右往左,每层乘一个传动比有的层把它放大,有的层把它缩小 —— 越往回传越小罚分

盯住那块紫色色块:它从最右边的罚分出发,一层层往左传,每过一层就被乘上那一层的传动比——有的层把它放大(乘 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 层之后是天文数字。调整量大到离谱,参数被一脚踹飞,训练直接崩掉。这就是梯度爆炸。

同样是连乘,方向差一点点,结果天差地别每层乘 0.5 → 迅速贴到 0(梯度消失)每层乘 1.5 → 冲出图外(梯度爆炸)往右 = 层数越来越多连乘没有中庸:不是趴到零,就是冲上天

两条曲线说明了一切:连乘几乎没有"中庸"这个选项。每层的传动比只要稳定地略小于 1,几十层下来必然趴到 0;只要稳定地略大于 1,几十层下来必然冲上天。

这就是"深层网络难训练"的数学根源——不是层数本身有问题,是连乘这个动作对偏差极其敏感。

对付它的思路也很直接:别让链条那么长。给网络加一条"抄近路"的通道,让罚分能绕过中间几层直接传回前面——传动比不用连乘那么多次,自然就不容易消失或爆炸。这就是残差连接干的事。

为什么这么做

为什么传动比是乘起来的,不是加起来的?

因为每一级放大的是上一级的结果,不是原始输入。大轮转 1 圈让中轮转 3 圈,中轮每转一圈又让小轮转 4 圈——所以那 3 圈里每一圈都带来 4 圈。"每一份里又有几份",这天然就是乘法。

为什么要倒着传,不能从前往后算每个参数的坡度?

能算,但贵得离谱。从前往后算,每个参数都得单独走一遍全程;模型有几十亿个参数,就得走几十亿遍。

倒着传只需要从罚分出发走一遍,路过每一层时顺手把那一层所有参数的调整量都算出来了。一遍抵几十亿遍——这才是它能用在大模型上的根本原因。

为什么按传动比分摊,而不是平均分?

因为谁的影响大,谁就该多担责。传动比大的层,一点改动就能让罚分变很多;传动比接近 0 的层,怎么改都没用。给后者和前者分一样多的调整,纯属浪费。

为什么别的选择不行

错误直觉一:以为反向传播是把误差平均分给每一层

不是平均分,是按传动比分。

传动比大的层分得多,传动比接近 0 的层几乎分不到。这不是偏心,是按实际影响力分配——一个几乎不起作用的参数,改多改少罚分都不动,给它分调整量纯属浪费。

按"平均分"来理解的后果是:你会想不通为什么有些层训练时几乎纹丝不动。它们不是被忽略了,是它们的传动比确实接近 0。

错误直觉二:以为层数越多梯度自然越大

正好相反,通常是越传越小。

每层的传动比往往小于 1,连乘之下是指数级衰减:每层乘 0.5,20 层之后只剩百万分之一。传到最前面几乎什么都不剩,前几层等于没在学。

"层数多 = 信号强"这个直觉在这里彻底失效。连乘不是累加:累加是层数越多总量越大,连乘是层数越多越容易走极端——要么趴到 0,要么冲上天。

错误直觉三:以为反向传播是另一套算法

它就是前向那条链倒着乘一遍,用的还是链式法则那条规矩,没有第二套东西。

  • 前向:输入 → 一层层算 → 罚分
  • 反向:罚分 → 一层层乘回传动比 → 每个参数该改多少

同一条链,同一条规矩,只是方向相反。 把它当成两套独立的东西,就会去找那些根本不存在的"反向传播的特殊公式"——其实就是齿轮传动比乘一遍而已。

沉淀结论

  1. 链式法则 = 传动比连乘:一串环节串起来,最前面动一点导致最后面动多少,等于每级传动比全乘起来(不是加起来)
  2. 每一级的传动比,就是第二十篇的坡度——这一级输入动一点,输出动多少
  3. 反向传播 = 从罚分出发,倒着把传动比一级级乘回去,得出每个参数该往哪调、调多少
  4. 按传动比分摊,不是平均分——影响大的层担的责任大;而且倒着传一遍就能算出所有参数,比正着算便宜几十亿倍
  5. 连乘没有中庸:一串小于 1 的数连乘会指数级衰减(梯度消失),一串大于 1 的会指数级放大(梯度爆炸)——这是深层网络难训练的数学根源

记忆口诀

链式法则 = 传动比连乘,不是相加。
每一级的传动比,就是那一级的坡度。
反向传播 = 从罚分出发,倒着乘回去。
按影响力分摊责任,不是平均分。
连乘没有中庸:要么趴到零,要么冲上天。

延伸阅读

  • 梯度消失与爆炸,以及残差连接为什么有用:残差连接给罚分开了一条"抄近路"的通道,绕过中间几层直接传回前面——链条短了,连乘的次数少了,自然不容易消失或爆炸。详见大模型核心原理。

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

  1. 大轮带中轮 3 倍、中轮带小轮 4 倍。大轮转一点点,小轮动多少?
参考答案

12 倍(3 × 4),不是 7 倍。

因为每一级放大的是上一级的结果:大轮转 1 圈让中轮转 3 圈,而中轮每转一圈又让小轮转 4 圈——那 3 圈里每一圈都带来 4 圈。"每一份里又有几份",天然就是乘法。

  1. 反向传播是一套独立于前向计算的算法吗?
参考答案

不是。 它就是前向那条链倒着乘一遍,用的还是链式法则那条规矩。

前向:输入 → 一层层算 → 罚分。反向:罚分 → 一层层乘回传动比 → 每个参数该改多少。同一条链、同一条规矩,只是方向相反。

  1. 反向传播是把误差平均分给每一层吗?
参考答案

不是,是按传动比分。 传动比大的层分得多,传动比接近 0 的层几乎分不到。

这不是偏心,是按实际影响力分配责任——一个改多改少罚分都不动的参数,给它分调整量纯属浪费。这也解释了为什么有些层训练时几乎纹丝不动:不是被忽略了,是它们的传动比确实接近 0。

  1. 为什么层数一多,前面几层就"学不动"了?
参考答案

因为连乘会指数级衰减。每层传动比往往小于 1,每层乘 0.5 的话:10 层剩千分之一,20 层剩百万分之一,50 层基本等于 0。

传到最前面几乎什么都不剩,前几层收到的调整近乎为 0,等于没在学——这就是梯度消失。反过来传动比都大于 1 就会爆炸。连乘没有中庸。

  1. 为什么要从后往前传,不从前往后逐个算每个参数的坡度?
参考答案

从前往后算贵得离谱。 每个参数都得单独走一遍全程,模型有几十亿参数就得走几十亿遍。

倒着传只需要从罚分出发走一遍,路过每层时顺手把那一层所有参数的调整量都算出来——一遍抵几十亿遍。这才是它能用在大模型上的根本原因。

最近更新: 2026/9/10 11:38
Prev
梯度下降