BP反向传播算法PPT详解:从数学推导到Python实现

1次阅读
没有评论

共计 1798 个字符,预计需要花费 5 分钟才能阅读完成。

image.webp

BP(反向传播)算法是深度学习训练神经网络的基石,它通过高效计算梯度来优化网络参数。没有 BP 算法,现代深度学习的辉煌成就将无从谈起。理解 BP 不仅是为了使用框架,更是为了掌握模型训练的底层逻辑。

BP 反向传播算法 PPT 详解:从数学推导到 Python 实现

数学基础:前向传播与损失计算

以一个单隐层网络为例,输入层有 2 个神经元,隐层 3 个神经元,输出层 1 个神经元。前向传播过程如下:

  1. 输入层到隐层 :
    $$h = \sigma(W_1^T x + b_1)$$
    其中 $W_1$ 是 2×3 权重矩阵,$b_1$ 是 3 维偏置向量,$\sigma$ 是 sigmoid 函数。

  2. 隐层到输出层 :
    $$\hat{y} = \sigma(W_2^T h + b_2)$$
    $W_2$ 是 3×1 矩阵,$b_2$ 是标量。

  3. 损失计算 (采用均方误差):
    $$L = \frac{1}{2}(y – \hat{y})^2$$

反向传播四步拆解

  1. 输出层梯度 :
    $$\frac{\partial L}{\partial \hat{y}} = -(y – \hat{y})$$
    $$\frac{\partial \hat{y}}{\partial z_2} = \sigma'(z_2) = \hat{y}(1-\hat{y})$$
    组合得:
    $$\delta_2 = (\hat{y} – y) \odot \sigma'(z_2)$$

  2. 隐层梯度 :
    $$\delta_1 = (W_2 \delta_2) \odot \sigma'(z_1)$$

  3. 权重更新 :
    $$\Delta W_2 = h \delta_2^T$$
    $$\Delta W_1 = x \delta_1^T$$

  4. 偏置更新 :
    $$\Delta b_2 = \delta_2$$
    $$\Delta b_1 = \delta_1$$

Python 实现代码

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def sigmoid_derivative(x):
    return x * (1 - x)

# 网络参数
input_size = 2
hidden_size = 3
output_size = 1

# 初始化权重(注意:这里用较小随机值)W1 = np.random.randn(input_size, hidden_size) * 0.01
b1 = np.zeros((1, hidden_size))
W2 = np.random.randn(hidden_size, output_size) * 0.01
b2 = np.zeros((1, output_size))

# 前向传播
def forward(x):
    z1 = np.dot(x, W1) + b1
    h = sigmoid(z1)
    z2 = np.dot(h, W2) + b2
    y_hat = sigmoid(z2)
    return y_hat, h

# 反向传播
def backward(x, y, y_hat, h, learning_rate=0.1):
    # 输出层梯度
    dL_dyhat = -(y - y_hat)
    dyhat_dz2 = sigmoid_derivative(y_hat)
    delta2 = dL_dyhat * dyhat_dz2

    # 隐层梯度
    dz2_dh = W2
    dh_dz1 = sigmoid_derivative(h)
    delta1 = np.dot(delta2, dz2_dh.T) * dh_dz1

    # 参数更新
    global W1, W2, b1, b2
    W2 -= learning_rate * np.dot(h.T, delta2)
    b2 -= learning_rate * np.sum(delta2, axis=0, keepdims=True)
    W1 -= learning_rate * np.dot(x.T, delta1)
    b1 -= learning_rate * np.sum(delta1, axis=0, keepdims=True)

避坑指南

  • 梯度消失识别 :当网络深层权重更新量级小于 1e- 5 时需警惕
  • 学习率设置 :从 0.01 开始尝试,观察损失曲线震荡情况
  • 权重初始化 :避免全零初始化,推荐 Xavier 初始化(np.random.randn(fan_in, fan_out) * np.sqrt(1/fan_in))

思考题

  1. 增加网络深度时,如何保证梯度有效传递到浅层?
  2. 如果用 ReLU 替代 sigmoid,反向传播公式需要做哪些调整?
  3. 当训练数据量很大时,为什么批量训练比单样本训练更稳定?

通过这个简单的单隐层网络示例,我们已经走完了 BP 算法的完整流程。建议读者在 Jupyter Notebook 中逐行运行代码,观察中间变量的变化规律,这对理解神经网络的工作原理大有裨益。

正文完
 0
评论(没有评论)

启源AI快讯

随机文章
Chaterbox VC 语音合成入门指南:从零搭建你的第一个语音克隆系统

Chaterbox VC 语音合成入门指南:从零搭建你的第一个语音克隆系统

背景介绍 语音合成技术近年来取得了显著进展,从早期的机械式发音到现在的自然语音生成,技术已经越来越成熟。Cha...
Chain-of-Thought思维链:从零构建可解释的AI推理系统

Chain-of-Thought思维链:从零构建可解释的AI推理系统

为什么我们需要可解释的 AI? 去年接触过一个医疗问答系统项目,模型直接给出诊断建议时,曾把『孕期维生素缺乏』...
基于CesiumLab的三维管网模型生成实战:从数据预处理到性能优化

基于CesiumLab的三维管网模型生成实战:从数据预处理到性能优化

背景痛点 在城市地下管网的三维可视化中,传统建模方式(如 3DMax 手动建模)存在诸多问题: 数据更新困难 ...
决策树实战:如何用Gini系数优化CART模型分类性能

决策树实战:如何用Gini系数优化CART模型分类性能

背景痛点 在机器学习分类任务中,CART 决策树是一种常用且高效的算法。然而,在实际应用中,特别是面对类别极度...
Buck-Boost电路参数计算指南:从理论到实践的关键步骤

Buck-Boost电路参数计算指南:从理论到实践的关键步骤

Buck-Boost 电路的基本原理与应用场景 Buck-Boost 电路是一种经典的 DC-DC 变换器,能...
热评文章
ClaudeCode与DeepSeek技术栈深度整合:从原理到生产环境实践

ClaudeCode与DeepSeek技术栈深度整合:从原理到生产环境实践

1. 业务价值与技术挑战 AI 代码生成与智能搜索的结合正在重塑开发者的工作流。当 ClaudeCode 的智...
深入解析claudecode向量数据库:原理、实现与高维数据检索优化

深入解析claudecode向量数据库:原理、实现与高维数据检索优化

高维向量数据的存储与查询挑战 传统关系型数据库在处理高维向量数据时面临两个核心问题: 维度灾难:当向量维度超过...
Claude Code 接入 DeepSeek 模型的工程实践:从架构设计到性能优化

Claude Code 接入 DeepSeek 模型的工程实践:从架构设计到性能优化

业务场景与技术痛点 在智能对话系统开发中,我们经常需要将不同 AI 模型的能力进行组合。最近我在项目中尝试将 ...
Claude与DeepSeek的代码介入实践:技术选型与实现解析

Claude与DeepSeek的代码介入实践:技术选型与实现解析

技术背景与应用场景 Claude 和 DeepSeek 都是当前流行的 AI 代码生成工具,它们通过大语言模型...
GPT-1M上下文窗口设置无效?深入解析ccswitch配置的正确姿势

GPT-1M上下文窗口设置无效?深入解析ccswitch配置的正确姿势

1. 理解 ccswitch 的基础概念 ccswitch 是一个用于管理 GPT 模型上下文窗口大小的配置工...