深度学习-链式求导法则
假设有两个函数 ( f ) 和 ( g ),其中 ( f ) 是 ( g ) 的函数,即 ( f ) 和 ( g ) 的复合函数为 ( h(x) = f(g(x)) )。ddxfgxdfdg⋅dgdxdxdfgx))dgdf⋅dxdg也就是说,复合函数 ( h(x) ) 的导数等于外层函数 ( f ) 对中间函数 ( g ) 的导数,乘以中间函数 ( g ) 对 ( x ) 的导数。
链式法则(Chain Rule)是微积分中的一种重要法则,用于计算复合函数的导数。在深度学习和反向传播算法中,链式法则是计算梯度的核心方法之一。
链式法则的定义
假设有两个函数 ( f ) 和 ( g ),其中 ( f ) 是 ( g ) 的函数,即 ( f ) 和 ( g ) 的复合函数为 ( h(x) = f(g(x)) )。链式法则的核心在于:
ddxf(g(x))=dfdg⋅dgdx \frac{d}{dx} f(g(x)) = \frac{d f}{d g} \cdot \frac{d g}{d x} dxdf(g(x))=dgdf⋅dxdg
也就是说,复合函数 ( h(x) ) 的导数等于外层函数 ( f ) 对中间函数 ( g ) 的导数,乘以中间函数 ( g ) 对 ( x ) 的导数。
在深度学习中的应用
在神经网络的反向传播中,链式法则用于计算损失函数对每一层权重的梯度。假设我们有一个多层前馈神经网络,目标是计算损失函数对网络中每个权重的梯度。
例子:单层神经网络的链式法则
假设有一个简单的神经网络层,包括输入 ( x )、权重 ( w )、偏置 ( b ) 和激活函数 ( σ\sigmaσ ),输出为 ( a )。损失函数为 ( L ),我们希望计算损失函数对权重 ( w ) 的梯度。
-
前向传播:
z=w⋅x+b z = w \cdot x + b z=w⋅x+b
a=σ(z) a = \sigma(z) a=σ(z)
L=Loss(a,y) L = \text{Loss}(a, y) L=Loss(a,y) -
计算梯度:
-
计算损失函数 ( L ) 对激活值 ( a ) 的梯度:
∂L∂a \frac{\partial L}{\partial a} ∂a∂L -
计算激活函数 ( σ\sigmaσ ) 对 ( z ) 的梯度:
∂a∂z=σ′(z) \frac{\partial a}{\partial z} = \sigma'(z) ∂z∂a=σ′(z) -
计算 ( z ) 对权重 ( w ) 的梯度:
∂z∂w=x \frac{\partial z}{\partial w} = x ∂w∂z=x -
使用链式法则计算损失函数 ( L ) 对权重 ( w ) 的梯度:
∂L∂w=∂L∂a⋅∂a∂z⋅∂z∂w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial a} \cdot \frac{\partial a}{\partial z} \cdot \frac{\partial z}{\partial w} ∂w∂L=∂a∂L⋅∂z∂a⋅∂w∂z
-
代码示例
以下是一个简单的 Python 代码示例,演示如何使用链式法则计算神经网络中的梯度:
import numpy as np
# 激活函数及其导数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
def sigmoid_derivative(x):
return sigmoid(x) * (1 - sigmoid(x))
# 假设数据
x = np.array([0.5]) # 输入
w = np.array([0.2]) # 权重
b = 0.1 # 偏置
y = np.array([0.7]) # 实际目标
# 前向传播
z = w * x + b
a = sigmoid(z)
# 计算损失(均方误差)
loss = 0.5 * (a - y) ** 2
# 反向传播(链式法则)
dL_da = a - y # 损失函数对激活值的梯度
da_dz = sigmoid_derivative(z) # 激活函数对 z 的梯度
dz_dw = x # z 对权重 w 的梯度
# 使用链式法则计算损失函数对权重的梯度
dL_dw = dL_da * da_dz * dz_dw
print(f'损失对权重的梯度: {dL_dw}')
总结
链式法则是深度学习中梯度计算的核心,通过逐层计算导数并将其组合来计算复合函数的梯度。在神经网络的反向传播中,链式法则使得我们能够高效地计算损失函数对每个参数的梯度,并利用这些梯度更新模型参数,从而优化网络性能。
更多推荐
所有评论(0)