batch normalization 正向传播与反向传播 both naive and smart way

本文介绍了两种实现 Backprop 的方法:朴素方法与智能方法。Backprop 是训练神经网络的重要算法,通过这两种不同的实现方式,可以帮助读者更好地理解其工作原理。

http://blog.youkuaiyun.com/xiaojiajia007/article/details/54924959


Both naive and smart way to implement Backprop.

### Batch Normalization反向传播原理 在神经网络中,Batch Normalization (BN) 层通过标准化每一层的输入来减少内部协变量偏移。这不仅加速了训练过程还提高了模型性能[^1]。 #### 反向传播中的梯度计算 为了理解 BN 如何工作,在反向传播期间需要考虑两个主要方面: - **均值和方差的梯度**:由于前向传播过程中计算了 mini-batch 数据的均值 μ 和标准差 σ,因此在反向传播时也需要更新这些统计量对应的参数 γ 和 β 的梯度。 - **激活函数之前的线性变换部分**:即 z = γ * x_hat + β, 其中 x_hat 是经过归一化的输入。这部分涉及到对 γ 和 β 参数的学习以及它们相对于损失 L 的导数 dL/dγ 和 dL/dβ 的求解。 具体来说,当执行反向传播算法时,对于每一个样本 i 来说: \[ \frac{\partial{L}}{\partial{x_i}}=\frac{\partial{L}}{\partial{\hat{x}_i}}\cdot\left(\gamma-\bar{\mu}\right)+\sum_j^{N}{\frac{\partial{L}}{\partial{\hat{x}_j}}\cdot\frac{(x_i-\bar{\mu})-(\sigma^2+\epsilon)\delta_{ij}}{\sqrt{|\Sigma|}(|\Sigma|+1)}} \] 其中 \( |\Sigma|=N*\sigma ^2+\epsilon \),\( N \) 表示 batch size ,而 ε 则是为了数值稳定性加入的小常数项[^3]。 #### PyTorch 中的实现方式 下面是一个简单的 Python 代码片段展示了如何利用 PyTorch 库来进行带有 BN 层的卷积神经网络定义及其反向传播操作: ```python import torch.nn as nn import torch.optim as optim class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() self.conv1 = nn.Conv2d(1, 32, kernel_size=5) self.bn1 = nn.BatchNorm2d(32) def forward(self, x): out = F.relu(self.bn1(self.conv1(x))) return out # 定义优化器损失函数 optimizer = optim.Adam(model.parameters(), lr=learning_rate) criterion = nn.CrossEntropyLoss() for epoch in range(num_epochs): model.train() outputs = model(inputs) loss = criterion(outputs, labels) optimizer.zero_grad() # 清除之前累积下来的梯度信息 loss.backward() # 执行反向传播并自动计算各参数上的梯度 optimizer.step() # 更新权重参数 ``` 上述代码实现了具有单个卷积层加批处理规范化(`nn.BatchNorm2d`)结构的一个小型CNN,并演示了完整的训练循环,包括前馈、计算误差、清零旧有梯度、执行BP及SGD步骤[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值