Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 神经网络的计算原理之反向传播

神经网络的计算原理之反向传播

1. 反向传播的基本概念

反向传播(Backpropagation)是训练神经网络的核心算法,通过链式法则计算损失函数对网络参数的梯度。其核心思想包括:

  • 误差反向传递:从输出层向输入层逐层传播误差信号
  • 局部梯度计算:每个神经元计算其对输入的局部梯度
  • 参数更新:利用梯度下降算法调整网络权重

2. 数学推导过程

2.1 链式法则的应用

对于具有L层的神经网络,第l层的梯度计算:

∂L∂W(l)=∂L∂z(l)⋅∂z(l)∂W(l)\frac{\partial \mathcal{L}}{\partial W^{(l)}} = \frac{\partial \mathcal{L}}{\partial z^{(l)}} \cdot \frac{\partial z^{(l)}}{\partial W^{(l)}} ∂W(l)∂L​=∂z(l)∂L​⋅∂W(l)∂z(l)​

其中:

  • z(l)=W(l)a(l−1)+b(l)z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}z(l)=W(l)a(l−1)+b(l)(前向传播结果)
  • a(l)=σ(z(l))a^{(l)} = \sigma(z^{(l)})a(l)=σ(z(l))(激活函数输出)

2.2 误差项计算

定义第l层的误差项:

δ(l)=∂L∂z(l)\delta^{(l)} = \frac{\partial \mathcal{L}}{\partial z^{(l)}} δ(l)=∂z(l)∂L​

递推公式:

δ(l)=(W(l+1))Tδ(l+1)⊙σ′(z(l))\delta^{(l)} = (W^{(l+1)})^T \delta^{(l+1)} \odot \sigma'(z^{(l)}) δ(l)=(W(l+1))Tδ(l+1)⊙σ′(z(l))

3. 算法步骤

  1. 前向传播:计算所有层的激活值
  2. 计算输出层误差:

    δ(L)=∇aL⊙σ′(z(L))\delta^{(L)} = \nabla_a \mathcal{L} \odot \sigma'(z^{(L)}) δ(L)=∇a​L⊙σ′(z(L))

  3. 反向传播误差:逐层计算δ(l)\delta^{(l)}δ(l)
  4. 计算梯度:

    ∇W(l)L=δ(l)(a(l−1))T\nabla_{W^{(l)}} \mathcal{L} = \delta^{(l)} (a^{(l-1)})^T ∇W(l)​L=δ(l)(a(l−1))T

    ∇b(l)L=δ(l)\nabla_{b^{(l)}} \mathcal{L} = \delta^{(l)} ∇b(l)​L=δ(l)

  5. 参数更新:使用梯度下降更新参数

4. 实现注意事项

4.1 数值稳定性

  • 使用对数空间计算避免数值下溢
  • 梯度裁剪防止梯度爆炸

4.2 计算效率优化

# Python伪代码示例
def backward_propagation(activations, weights, loss_grad):
    gradients = {}
    delta = loss_grad * activation_derivative(activations[-1])
    gradients[f'dW{len(weights)}'] = np.dot(delta, activations[-2].T)
    
    for l in reversed(range(len(weights)-1)):
        delta = np.dot(weights[l+1].T, delta) * activation_derivative(activations[l])
        gradients[f'dW{l+1}'] = np.dot(delta, activations[l-1].T)
    
    return gradients

5. 常见问题与解决方案

问题现象可能原因解决方案
梯度消失深层网络/不合适的激活函数使用ReLU/残差连接
梯度爆炸权重初始化过大梯度裁剪/权重归一化
震荡收敛学习率过大自适应学习率算法

6. 扩展阅读

  • 反向传播的发明历史(1986 Rumelhart et al.)
  • 自动微分(Autodiff)的现代实现
  • 二阶优化方法(Hessian-Free)

注:实际使用时建议:
1. 补充具体激活函数的导数公式
2. 添加实际案例(如MNIST分类器的梯度计算)
3. 可视化误差反向传播路径
4. 对比不同实现框架(PyTorch/TensorFlow)的自动微分机制
Last Updated:: 5/20/25, 6:56 PM