53、反向传播计算梯度与Python环境搭建

反向传播计算梯度与Python环境搭建

1. 反向传播计算梯度

1.1 反向传播概述

在神经网络训练中,计算多层感知器(MLP)成本函数的偏导数的过程被称为反向传播。这是因为从最后一层的权重和偏置开始,反向计算更为高效。反向传播可分为四个步骤:计算最后一层权重、最后一层偏置、隐藏层权重和隐藏层偏置的导数。下面将详细介绍如何计算最后一层权重的偏导数。

1.2 计算最后一层权重相关的成本

设MLP最后一层的索引为L,最后一层的权重矩阵由权重 $w_{ij}^L$ 组成,该层的偏置为 $b_j^L$,激活值标记为 $a_j^L$。最后一层第j个神经元的激活值 $a_j^L$ 的计算公式如下:
[a_j^L = \sigma(b_j^L + \sum_{i=1}^{n_{L - 1}} w_{ij}^L a_{i}^{L - 1})]
其中,$\sigma$ 是Sigmoid函数,$n_{L - 1}$ 是第L - 1层的神经元数量。

给定一个实际的训练示例,理想输出向量 $y$ 在正确的位置为1,其他位置为0。成本是激活向量 $a_j^L$ 与理想输出值 $y_j$ 之间的平方距离,即:
[C = \sum_{j = 1}^{n_L} (a_j^L - y_j)^2]

权重 $w_{ij}^L$ 对成本 $C$ 的影响是间接的。它首先与前一层的激活值相乘,加上偏置,通过Sigmoid函数,最后通过二次成本函数。

1.3 使用链式法则计算最后一层权重的偏导数

为了从 $w_{ij}^L$ 计算到 $C$,可以将其分解为三个步骤:
1. 计

### Python反向传播神经网络的实现及原理 #### 1. 反向传播算法的核心概念 反向传播算法(Backpropagation, BP)是深度学习领域中一种重要的监督学习方法,主要用于训练多层神经网络。其核心思想在于通过计算损失函数相对于各层权重的梯度,并利用这些梯度调整权重,从而使网络输出更接近目标值。 该算法主要分为两部分: - **前向传播**:输入数据经过每一层神经元处理后得到最终输出。此阶段的主要目的是计算当前网络的状态以及对应的预测误差[^1]。 - **反向传播**:从输出层开始逐层向前传递误差信号,同时依据链式法则计算每层权重的梯度并更新它们[^4]。 #### 2. 数学推导中的关键公式 为了更好地理解反向传播的工作机制,以下是几个重要公式的概述: 假设我们有一个简单的全连接神经网络,其中第 \( l \) 层的激活值表示为 \( a^{(l)} \),权重量化矩阵记作 \( W^{(l)} \),偏置项为 \( b^{(l)} \),则有如下关系: \[ z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)} \] \[ a^{(l)} = f(z^{(l)}) \] 对于给定的目标值 \( y \) 和实际输出 \( \hat{y} \),定义均方误差作为损失函数: \[ L(y,\hat{y}) = \frac{1}{2}(y-\hat{y})^2 \] 在反向传播过程中,我们需要求解以下梯度: - 针对某一层权重的梯度:\( \frac{\partial L}{\partial W^{(l)}} \) - 对应于偏置的梯度:\( \frac{\partial L}{\partial b^{(l)}} \) 具体而言,可以通过链式法则逐步展开上述表达式,从而获得精确的数值估计[^3]。 #### 3. 使用 Python 的简单实现 下面展示了一个基于 NumPy 库的小型 BP 网络框架实例代码片段: ```python import numpy as np class NeuralNetwork: def __init__(self, input_size, hidden_size, output_size): self.W1 = np.random.randn(input_size, hidden_size) self.b1 = np.zeros(hidden_size) self.W2 = np.random.randn(hidden_size, output_size) self.b2 = np.zeros(output_size) def sigmoid(self, x): return 1 / (1 + np.exp(-x)) def forward(self, X): self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = self.sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.y_hat = self.sigmoid(self.z2) return self.y_hat def backward(self, X, Y, learning_rate=0.1): m = X.shape[0] delta_output = (self.y_hat - Y) * self.y_hat * (1 - self.y_hat) dW2 = np.dot(self.a1.T, delta_output) / m db2 = np.sum(delta_output, axis=0) / m delta_hidden = np.dot(delta_output, self.W2.T) * self.a1 * (1 - self.a1) dW1 = np.dot(X.T, delta_hidden) / m db1 = np.sum(delta_hidden, axis=0) / m # 更新参数 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 # 测试用例 X_train = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) Y_train = np.array([[0], [1], [1], [0]]) nn = NeuralNetwork(2, 2, 1) for epoch in range(10000): nn.forward(X_train) nn.backward(X_train, Y_train) print(nn.forward(X_train)) ``` 以上代码构建了一种简易版本的双隐藏节点 XOR 解决方案演示如何运用正向逆向流程完成一次完整的迭代操作[^5]。 #### 4. 总结说明 综上所述,Python 提供了强大的工具支持开发者轻松搭建自己的人工神经网络模型并通过反向传播技术对其进行高效调优。无论是理论层面还是实践环节都体现了这一经典算法的强大适应性和灵活性[^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值