AI 术语通俗词典:链式法测
链式法则是微积分、机器学习、深度学习、自动微分和人工智能中非常基础的一个术语。它用来描述:当一个函数由多个函数嵌套组成时,如何计算整体函数对某个变量的导数。 换句话说,链式法则是在回答:一个结果经过多步计算得到时,最终结果的变化应该怎样一层层追溯到最初输入。
如果说导数回答的是“一个变量变化会让结果变化多少”,那么链式法则回答的就是“当变量之间存在多层依赖关系时,这种变化如何逐层传递”。因此,链式法则常用于神经网络训练、反向传播、自动微分、计算图、梯度下降和深度学习框架,是理解模型如何学习参数的核心基础。
一、基本概念:什么是链式法则
链式法则(Chain Rule)是求复合函数导数的基本规则。
假设有两个函数:
也就是说,y 不是直接由 x 得到的,而是先由 x 得到 u,再由 u 得到 y:
x → u → y
那么 y 对 x 的导数为:
其中:
• dy/dx 表示 y 对 x 的变化率
• dy/du 表示 y 对 u 的变化率
• du/dx 表示 u 对 x 的变化率
从通俗角度看,链式法则可以理解为:如果 x 先影响 u,u 再影响 y,那么 x 对 y 的影响等于“x 对 u 的影响”乘以“u 对 y 的影响”。
例如:
可以拆成:
那么:
所以:
这就是链式法则的基本思想:复杂函数可以拆开求导,再把局部导数连乘起来。
二、为什么需要链式法则
链式法则之所以重要,是因为现实中的模型通常不是一步算出结果,而是由许多连续计算组成。
例如,一个人工神经元会先计算线性输入:
再通过激活函数:
再与真实标签计算损失:
整个过程可以写成:
x, w, b → z → a → L
训练模型时,我们关心的不是只算出 L,而是要知道:
也就是损失对权重和偏置的影响。
问题在于,L 并不是直接由 w 和 b 得到的,而是经过 z、a 等中间变量一步步计算出来的。
链式法则正好解决这个问题:它允许我们沿着计算路径,把最终损失对参数的影响一层层传回去。
从通俗角度看:参数影响中间结果,中间结果影响输出,输出影响损失,所以参数也会间接影响损失。
链式法则就是用来计算这种“间接影响”的数学工具。
这也是反向传播能够训练深度神经网络的根本原因。
三、链式法则的核心公式
最基本的链式法则是:
如果中间变量更多,例如:
x → u → v → y
也就是:
那么:
从通俗角度看:只要变量之间形成一条依赖链,整体导数就等于这条链上每一步局部导数的乘积。
在深度学习中,变量往往不是标量,而是向量、矩阵或张量。此时链式法则仍然成立,只是导数会变成偏导数、梯度、雅可比矩阵或张量形式。
对于多变量函数,如果:
那么可以写为:
其中:
• ∂L/∂w 表示损失对参数 w 的偏导数
• ∂L/∂z 表示损失对中间变量 z 的偏导数
• ∂z/∂w 表示中间变量 z 对参数 w 的偏导数
这正是神经网络参数梯度计算的基础形式。
四、一个直观例子:从简单函数理解链式法则
假设有一个函数:
这个函数看起来是一个整体,但可以拆成两步:
也就是:
x → u → y
先求每一步的导数:
根据链式法则:
代入得到:
再把 u 换回:
从通俗角度看:x 每变化一点,先让 u 变化;u 的变化再让 y 变化。链式法则就是把这两段影响连起来。
这也是为什么它叫“链式”法则:变量之间像一条链,变化沿着链传递。
五、链式法则与计算图
链式法则和计算图关系非常密切。
计算图把一个复杂计算拆成许多简单步骤,而链式法则告诉我们如何沿着这些步骤求导。
例如,有一个简单损失函数:
可以拆成:
z = wxa = z + be = a - yL = e²对应的计算路径是:
w, x → z → a → e → Lb ─────┘y ─────────→ e如果要计算 L 对 w 的导数,就沿着路径:
w → z → a → e → L
反向应用链式法则:
从通俗角度看:计算图告诉我们变量之间怎样连接;链式法则告诉我们梯度怎样沿这些连接传递。
这正是自动微分框架的工作基础。
在 PyTorch、TensorFlow 等框架中,用户通常不需要手动推导这些导数。框架会记录计算图,然后根据链式法则自动计算梯度。
六、链式法则与反向传播
反向传播(Backpropagation)本质上就是链式法则在神经网络中的系统应用。
神经网络前向传播时,数据从输入层流向输出层:
输入 → 隐藏层 → 输出 → 损失
反向传播时,梯度从损失开始,沿相反方向传回每一层:
损失 → 输出层 → 隐藏层 → 输入层
每一层都会根据链式法则计算:
其中:
• L 表示损失函数
• W 表示某一层的权重矩阵
• b 表示某一层的偏置
例如,某一层计算为:
如果已经知道:
那么需要继续计算:
再进一步计算:
从通俗角度看:反向传播就是从最终错误出发,一层层追问:每个参数对这个错误负多少责任。
链式法则则提供了这种“责任分配”的数学规则。
七、链式法则与自动微分
自动微分(Automatic Differentiation)是现代深度学习框架自动计算梯度的核心技术。
它的基本思想是:把复杂函数拆成基本运算,并在计算图上反复使用链式法则。
例如,复杂函数可能由以下基本运算组成:
• 加法
• 乘法
• 除法
• 指数
• 对数
• 矩阵乘法
• 激活函数
• 损失函数
每个基本运算都有简单的导数规则。
自动微分系统会记录这些运算的连接关系,然后用链式法则组合局部导数。
从通俗角度看:
自动微分 = 记录计算过程 + 自动套用链式法则
这与数值差分不同。
数值差分会通过微小扰动近似导数,例如:
这种方法简单,但在高维模型中计算成本高,而且有近似误差。
自动微分则可以更精确、更高效地计算梯度。
因此,链式法则是自动微分能够工作的数学核心。
八、链式法则的优势、局限与使用注意事项
1、链式法则的主要优势
链式法则最大的优势是可以处理复杂复合函数。
无论函数有多少层,只要每一步可导,就可以把整体导数拆成局部导数的组合。
其次,链式法则非常适合神经网络。
神经网络本质上就是多层函数复合:
每一层都可以看作一个函数,链式法则正好用于计算整体函数对各层参数的梯度。
再次,链式法则支持模块化求导。
每个运算只需要知道自己的局部导数,整体梯度就可以通过组合得到。
从通俗角度看,链式法则的优势在于:它让复杂模型的求导变成“局部求导 + 逐层传递”。
2、链式法则可能带来的问题
链式法则本身是严格的数学规则,但在深度学习中,它会带来一些训练现象。
因为梯度是许多局部导数连乘的结果,如果这些局部导数长期小于 1,梯度可能越来越小,这就是梯度消失。
如果这些局部导数长期大于 1,梯度可能越来越大,这就是梯度爆炸。
例如:
如果中间很多因子都很小,最终梯度可能接近 0。
从通俗角度看:链条太长时,信号一层层传递,可能越来越弱,也可能越来越强。
这就是深层网络训练需要激活函数、归一化、残差连接、合理初始化和优化器设计的重要原因。
3、使用链式法则时需要注意的问题
理解链式法则时,需要注意:
• 链式法则适用于复合函数求导
• 深度学习中的反向传播本质上依赖链式法则
• 计算图提供变量依赖结构,链式法则提供梯度传播规则
• 多变量情况下通常使用偏导数和梯度
• 深层网络中,链式连乘可能引发梯度消失或梯度爆炸
• 自动微分框架会自动应用链式法则,但理解原理有助于调试模型
从实践角度看,链式法则不是只存在于数学课本中的公式,而是深度学习模型能够训练的基础机制。
九、Python 示例
下面给出几个简单示例,用来帮助理解链式法则的计算过程。
示例 1:手动计算一个复合函数的导数
假设:
根据链式法则:
用 Python 计算 x = 2 时的导数:
x = 2 # 中间变量u = 2 * x + 3 # 函数值y = u ** 3 # 链式法则dy_du = 3 * u ** 2du_dx = 2dy_dx = dy_du * du_dx print("u:", u)print("y:", y)print("dy/dx:", dy_dx)这个例子展示了:
x → u → y
整体导数等于两段局部导数的乘积。
示例 2:使用 PyTorch 自动应用链式法则
import torch # 创建需要梯度的张量 x = 2.0x = torch.tensor(2.0, requires_grad=True) # 复合函数:u = 2x + 3, y = u³u = 2 * x + 3y = u ** 3 # 反向传播,计算 y 对 x 的导数y.backward() print("y:", y.item()) # 输出 y = (2*2+3)³ = 7³ = 343print("dy/dx:", x.grad.item()) # dy/dx = 3u² * 2 = 3*49*2 = 294PyTorch 会自动记录计算图:
x → u → y
调用 y.backward() 后,框架会沿计算图反向传播梯度,并自动应用链式法则。
示例 3:神经元中的链式法则
假设一个简单神经元:
使用 PyTorch 自动计算梯度:
import torch # 输入、参数和真实值x = torch.tensor(2.0) # 输入特征w = torch.tensor(3.0, requires_grad=True) # 权重(需梯度)b = torch.tensor(1.0, requires_grad=True) # 偏置(需梯度)y_true = torch.tensor(10.0) # 真实标签 # 前向计算z = w * x + b # 线性输出(z = 3*2+1=7)a = torch.relu(z) # ReLU激活:max(0,z)=7loss = (a - y_true) ** 2 # 平方误差损失:(7-10)²=9 # 反向传播,自动计算损失对w、b的梯度loss.backward() print("z:", z.item())print("a:", a.item())print("loss:", loss.item())print("dL/dw:", w.grad.item()) # 梯度 = 2*(a-y_true) * (1 if z>0 else 0) * x = 2*(-3)*1*2 = -12print("dL/db:", b.grad.item()) # 梯度 = 2*(a-y_true) * 1 = -6这个例子中,梯度会沿着:
w, b → z → a → loss
反向传播。
从链式法则角度看:
示例 4:计算图被切断时梯度无法传递
import torch # PyTorch 库 # 创建需要梯度的张量 x = 2.0x = torch.tensor(2.0, requires_grad=True) # 计算 u = 2x + 3(保留计算图)u = 2 * x + 3 # detach 切断 u 与计算图的连接,返回不可导的新张量u_detached = u.detach() # 对 detached 张量进行立方运算,y 无法反向传播到 xy = u_detached ** 3 # u 有 grad_fn(乘法加法),u_detached 无 grad_fn,y 有 grad_fn(幂运算)print("u.grad_fn:", u.grad_fn)print("u_detached.grad_fn:", u_detached.grad_fn)print("y.grad_fn:", y.grad_fn)这个例子中,detach() 会让 u_detached 脱离原来的计算图。
因此,y 不再依赖 x 的梯度路径。
从通俗角度看:链式法则需要一条连续的计算链;如果计算图被切断,梯度就无法沿链条传回去。
📘 小结
链式法则是复合函数求导的基本规则。它说明:当一个结果由多个中间步骤计算得到时,整体导数可以由各步骤局部导数相乘得到。深度学习中的反向传播、自动微分和计算图都建立在链式法则之上。对初学者而言,可以把链式法则理解为:结果的变化会沿着计算路径一层层传回去,每一步的局部影响相乘,就得到最初变量对最终结果的影响。
“点赞有美意,赞赏是鼓励”
