【机器学习:十九、反向传播】

1. 计算图和导数

计算图的概念

计算图(Computation Graph)是一种有向无环图,用于表示数学表达式中的计算过程。每个节点表示一个操作或变量,每条边表示操作的依赖关系。通过计算图,可以轻松理解和实现反向传播。

计算图的意义

  • 直观地展示复杂计算过程。
  • 支持自动微分,通过链式规则计算导数。
  • 应用于神经网络中梯度的高效计算。

例如,对于函数 z = ( x + y ) ⋅ w z = (x + y) \cdot w z=(x+y)⋅w ,其计算图包括三个节点(加法、乘法、输入变量)和两条边。

2. 计算代价函数的偏导 - 单神经元

代价函数的定义

代价函数衡量模型输出与真实值之间的差距,例如平方误差:

L = 1 2 ( y − y ^ ) 2 L = \frac{1}{2} (y - \hat{y})^2 L=21(y−y^)2

其中, y ^ \hat{y} y^ 是模型输出, y y y 是目标值。

单神经元的导数推导

假设输出为 y ^ = σ ( w x + b ) \hat{y} = \sigma(wx + b) y^=σ(wx+b) ,其中 σ \sigma σ 是激活函数(如 Sigmoid),导数计算如下:

  1. 对于权重 w w w :
    ∂ L ∂ w = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ z ⋅ ∂ z ∂ w \frac{\partial L}{\partial w} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial w} ∂w∂L=∂y^∂L⋅∂z∂y^⋅∂w∂z

  2. 对于偏置 b b b :
    ∂ L ∂ b = ∂ L ∂ y ^ ⋅ ∂ y ^ ∂ z ⋅ ∂ z ∂ b \frac{\partial L}{\partial b} = \frac{\partial L}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} \cdot \frac{\partial z}{\partial b} ∂b∂L=∂y^∂L⋅∂z∂y^⋅∂b∂z

意义

通过计算偏导数,可以更新参数 w w w 和 b b b 以最小化损失函数。

3. 链导法则求导

链导法则是反向传播的核心,其定义如下:

∂ L ∂ x = ∂ L ∂ y ⋅ ∂ y ∂ x \frac{\partial L}{\partial x} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial x} ∂x∂L=∂y∂L⋅∂x∂y

步骤:

  1. 先计算从输出到隐藏层的梯度。
  2. 再计算从隐藏层到输入的梯度。

例如,对于两层网络的损失函数 L = f ( g ( x ) ) L = f(g(x)) L=f(g(x)) ,使用链导法则:

∂ L ∂ x = ∂ f ∂ g ⋅ ∂ g ∂ x \frac{\partial L}{\partial x} = \frac{\partial f}{\partial g} \cdot \frac{\partial g}{\partial x} ∂x∂L=∂g∂f⋅∂x∂g

4. 过程解释

反向传播过程包括以下步骤:

  1. 前向传播:计算网络输出和损失函数。
  2. 反向传播:从输出层开始,逐层计算梯度。
  3. 更新参数:使用梯度下降或其变体更新参数。

假设两层网络的权重为 W 1 W_1 W1 和 W 2 W_2 W2 ,反向传播过程为:

  1. 计算输出层梯度 δ 2 \delta_2 δ2 :
    δ 2 = ∂ L ∂ z 2 = ∂ L ∂ y ^ ⋅ σ ′ ( z 2 ) \delta_2 = \frac{\partial L}{\partial z_2} = \frac{\partial L}{\partial \hat{y}} \cdot \sigma'(z_2) δ2=∂z2∂L=∂y^∂L⋅σ′(z2)

  2. 计算隐藏层梯度 δ 1 \delta_1 δ1 :
    δ 1 = ( δ 2 ⋅ W 2 T ) ⋅ σ ′ ( z 1 ) \delta_1 = (\delta_2 \cdot W_2^T) \cdot \sigma'(z_1) δ1=(δ2⋅W2T)⋅σ′(z1)

  3. 更新权重和偏置:
    W 2 = W 2 − α ⋅ δ 2 ⋅ h 1 T W_2 = W_2 - \alpha \cdot \delta_2 \cdot h_1^T W2=W2−α⋅δ2⋅h1T

    W 1 = W 1 − α ⋅ δ 1 ⋅ x T W_1 = W_1 - \alpha \cdot \delta_1 \cdot x^T W1=W1−α⋅δ1⋅xT

5. 神经网络中的反向传播

多层网络中的反向传播

多层网络通过将链导法则逐层应用,从输出层反向传播至输入层。每层的梯度依赖于后一层的梯度。

实现代码示例

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([1, 2])  # 输入
w1 = np.array([[0.1, 0.2], [0.3, 0.4]])  # 权重
b1 = np.array([0.5, 0.5])  # 偏置
z1 = np.dot(w1, x) + b1
a1 = sigmoid(z1)

# 反向传播
delta = (a1 - 1) * sigmoid_derivative(z1)
grad_w1 = np.outer(delta, x)

6. 计算代价函数的偏导 - 两层神经网络

两层神经网络的反向传播在单层基础上扩展,每层分别计算:

∂ L ∂ W 1 , ∂ L ∂ W 2 , ∂ L ∂ b 1 , ∂ L ∂ b 2 \frac{\partial L}{\partial W_1}, \frac{\partial L}{\partial W_2}, \frac{\partial L}{\partial b_1}, \frac{\partial L}{\partial b_2} ∂W1∂L,∂W2∂L,∂b1∂L,∂b2∂L

总结与意义

反向传播是神经网络训练的核心,通过计算梯度并更新参数,使得网络能够有效学习复杂的映射关系,从而提高模型的泛化能力。

相关推荐
Multipath7123 分钟前
上车即入院,链路先到院——乾元通多链路聚合,为智慧救护车守住移动中的生命线
网络·人工智能·网络协议·udp·无人机
吴建旭 智宅焕15 分钟前
智能家居全国交付中内容生产与知识中枢的架构设计:RAG检索增强与交付确定性系统实现
人工智能·智能家居
.Bryce.18 分钟前
T2-LLM评测不等于Agent评测
android·java·人工智能·后端·gpt·agent·1024程序员节
全栈陈序员26 分钟前
【Python】基础语法入门(二十九)—— 正则表达式实战:文本处理利器
开发语言·人工智能·python·正则表达式
Dawson Zhu32 分钟前
【AI编译器入门④】编译中端:图优化Pass全解析——DCE、常量折叠、算子融合与布局变换
人工智能·语言模型·架构·aigc·agi
甲维斯32 分钟前
排名算法一变,国产模型全部滑铁卢了!
人工智能
wx_xkq128833 分钟前
优秘智能灵秘:数字分身内容的输入、制作与审核怎样衔接
人工智能·数字人·优秘智能·数字分身·品牌内容·灵秘
前沿在线36 分钟前
黄仁勋 GTC 柏林演讲完整整理:从 AI 工厂到机器人,英伟达把下一步讲透了 | 前沿在线
人工智能·ai·大模型
weixin_4462608537 分钟前
AgentMoCo:面向长视界智能体的动量对比记忆优化框架
人工智能
武天旭1 小时前
AI安全--AI大模型赋能安全攻防的关键技术
人工智能·安全