batch norm反向公式推导

本文深入解析批量归一化算法的工作原理,包括其在深度学习中的应用,详细阐述了算法的前向传播和反向传播过程,以及如何通过调整可学习参数来优化网络性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

输入

Xi=(xi0,xi1,...,xi(n−1))X_i=(x_{i0},x_{i1},...,x_{i(n-1)})Xi=(xi0,xi1,...,xi(n1)) i∈[0,m−1]i \in [0,m-1]i[0,m1] batch-size等于m,特征维度n

输出

Yi=(yi0,yi1,...,yi(n−1))Y_i=(y_{i0},y_{i1},...,y_{i(n-1)})Yi=(yi0,yi1,...,yi(n1)) i∈[0,m−1]i \in [0,m-1]i[0,m1] 维度和输入XXX一致

前向计算

  1. 均值
    μ=μ0,μ1,...,μn\mu = {\mu_0,\mu_1,...,\mu_n}μ=μ0,μ1,...,μn 其中
    μp=1m∑ixip\mu_p = \frac{1}{m}\sum_ix_{ip}μp=m1ixip

  2. 方差
    σ=σ0,σ1,...,σn\sigma = {\sigma_0,\sigma_1,...,\sigma_n}σ=σ0,σ1,...,σn 其中
    σp=1m∑i(xip−μp)2\sigma_p = \frac{1}{m}\sum_i(x_{ip}-\mu_p)^2σp=m1i(xipμp)2

  3. 中间结果
    x‾ip=xip−μpσp2+ϵ\overline x_{ip}=\frac{x_{ip}-\mu_p}{\sqrt{\sigma_p^2+\epsilon}}xip=σp2+ϵxipμp

  4. 结果
    yip=γpx‾ip+βpy_{ip}=\gamma_p \overline x_{ip}+\beta_pyip=γpxip+βp 其中
    参数γ=γ0,γ1,...,γn−1\gamma = {\gamma_0, \gamma_1,...,\gamma_{n-1}}γ=γ0,γ1,...,γn1
    β=β0,β1,...,βn−1\beta = {\beta_0,\beta_1,...,\beta_{n-1}}β=β0,β1,...,βn1
    是learnable parameters

反向计算

∂O∂xij=∑kl∂O∂ykl∂ykl∂xij=∑kl∂O∂ykl∂ykl∂x‾ij∂x‾ij∂xij=∑kl∂O∂yklγl∂x‾ij∂xij(1)\frac{\partial O}{\partial x_{ij}}=\sum_{kl}{ \frac{\partial O}{\partial y_{kl}} } \frac{\partial y_{kl}}{\partial x_{ij}} = \sum_{kl}{ \frac{\partial O}{\partial y_{kl}} } \frac{\partial y_{kl}}{\partial \overline x_{ij}} \frac{\partial \overline x_{ij}}{\partial x_{ij}} = \sum_{kl}{ \frac{\partial O}{\partial y_{kl}} } \gamma_l \frac{\partial \overline x_{ij}}{\partial x_{ij} } \quad (1) xijO=klyklOxijykl=klyklOxijyklxijxij=klyklOγlxijxij(1)

∂x‾ij∂xij=∂(xkl−μl)∂xijσl2+ϵ−∂σl2+ϵ∂xij(xkl−μl)σl2+ϵ(2) \frac{\partial \overline x_{ij}}{\partial x_{ij}} = \frac { \frac{\partial{ (x_{kl}-\mu_l)}}{\partial x_{ij}} \sqrt{\sigma_l^2+\epsilon} - \frac{ \partial {\sqrt{\sigma_l^2+\epsilon}} }{\partial x_{ij}}(x_{kl}-\mu_l) } { \sigma_l^2+\epsilon } \quad (2) xijxij=σl2+ϵxij(xklμl)σl2+ϵxijσl2+ϵ(xklμl)(2)

∂(xkl−μl)∂xij=δkiδlj−δlj1m(3) \frac{ \partial (x_{kl}-\mu_l)}{\partial x_{ij}} = \delta_{ki}\delta_{lj} - \delta_{lj} \frac{1}{m} \quad (3) xij(xklμl)=δkiδljδljm1(3)
其中
δpq={1p=q0else \delta_{pq}= \begin{cases} 1 \quad p=q \\ 0 \quad else \end{cases} δpq={1p=q0else
这个符号可以替代推导过程中的if-else,遇到求和号可以消除
∂σl2+ϵ∂xij=1m1σl2+ϵδlj(xil−μl)(4) \frac{\partial \sqrt{\sigma_l^2 + \epsilon}} {\partial x_{ij}} = \frac{1}{m} \frac{1}{\sqrt{\sigma_l^2+\epsilon}} \delta_{lj} (x_{il} - \mu_l) \quad (4) xijσl2+ϵ=m1σl2+ϵ1δlj(xilμl)(4)
(3)(4)带入(2)得到
∂x‾ij∂xij=δlj(δki−1m)σl2+ϵ−1mσl2+ϵ(xkl−μl)(xil−μl)σl2+ϵ \frac{\partial \overline x_{ij}}{\partial x_{ij}} = \delta_{lj} \frac { (\delta_{ki} - \frac{1}{m}) \sqrt{\sigma_l^2 + \epsilon} - \frac{1}{m\sqrt{\sigma_l^2 + \epsilon}}(x_{kl}-\mu_l)(x_{il}-\mu_l) } {\sigma_l^2 + \epsilon} xijxij=δljσl2+ϵ(δkim1)σl2+ϵmσl2+ϵ1(xklμl)(xilμl)
上式带入公式(1)得到
∂O∂xij=γjmσj2+ϵ(σj2+ϵ)((σj2+ϵ)(m∂O∂yjj−∑k∂O∂ykj)−(xij−μj)(xkj−μj)∑k∂O∂ykj)(done) \frac{\partial O}{\partial x_{ij}} = \frac{\gamma_j}{m\sqrt{\sigma_j^2 + \epsilon}(\sigma_j^2 + \epsilon)} ( (\sigma_j^2 + \epsilon)( m\frac{\partial O}{\partial y_{jj}}-\sum_k\frac{\partial O}{\partial y_{kj}}) - (x_{ij}-\mu_j)(x_{kj}-\mu_j)\sum_k\frac{\partial O}{\partial y_{kj}} ) \quad (done) xijO=mσj2+ϵ(σj2+ϵ)γj((σj2+ϵ)(myjjOkykjO)(xijμj)(xkjμj)kykjO)(done)

### Batch Normalization 中梯度的计算及作用 Batch Normalization (BN) 的引入旨在解决神经网络中的梯度消失和梯度爆炸问题,同时也缓解了内部协方差转移现象。为了更好地理解 BN 的梯度计算及其作用,可以从以下几个方面展开分析。 #### 1. 梯度计算的核心机制 在反向传播过程中,Batch Normalization 层会对其参数(如 γ 和 β)以及输入数据 z 进行梯度更新。具体来说: - **标准化操作**:对于给定的一批数据 \( \{z_1, z_2, ..., z_m\} \),首先计算这批数据的均值 μ 和方差 σ²: \[ \mu_B = \frac{1}{m}\sum_{i=1}^{m}z_i,\quad \sigma_B^2 = \frac{1}{m}\sum_{i=1}^{m}(z_i-\mu_B)^2 \] 接着对每一批次的数据进行标准化处理: \[ \hat{z}_i = \frac{z_i - \mu_B}{\sqrt{\sigma_B^2+\epsilon}} \] - **可学习参数的作用**:标准化后的数据经过尺度放缩和平移变换,最终输出为: \[ y_i = \gamma \cdot \hat{z}_i + \beta \] 其中 γ 和 β 是两个可学习的参数,用于恢复模型表达能力[^3]。 #### 2. 反向传播中的梯度推导反向传播阶段,损失函数 L 对 BN 输出 \(y\) 的梯度会被逐层传递到前面各层。以下是具体的梯度计算公式: - 首先定义中间变量: \[ dL/d\hat{z}_i = \gamma \cdot dL/dy_i \] - 计算关于均值 μ 和标准差 σ 的梯度: \[ dL/d\mu_B = \sum_{i=1}^{m}-dL/d\hat{z}_i / (\sqrt{\sigma_B^2+\epsilon}) \] \[ dL/d\sigma_B^2 = \sum_{i=1}^{m}-0.5(dL/d\hat{z}_i)(z_i-\mu_B)/(\sigma_B^2+\epsilon)^{3/2} \] - 更新原始输入 \(z\) 的梯度: \[ dL/dz_i = dL/d\hat{z}_i/\sqrt{\sigma_B^2+\epsilon} + dL/d\mu_B/m + dL/d\sigma_B^2(2(z_i-\mu_B))/m \] 这些公式推导基于链式法则,并考虑了批量统计量的影响[^2]。 #### 3. 实现代码示例 以下是一个简单的 PyTorch 实现,展示了如何手动完成 Batch Normalization 的前向与反向传播过程: ```python import torch def batch_norm(X, gamma, beta, eps=1e-5): mean = X.mean(dim=0) var = ((X - mean)**2).mean(dim=0) X_hat = (X - mean) / torch.sqrt(var + eps) Y = gamma * X_hat + beta return Y, mean, var # 前向传播测试 X = torch.tensor([[1., 2.], [3., 4.]]) gamma = torch.tensor([1., 1.]) beta = torch.tensor([0., 0.]) Y, _, _ = batch_norm(X, gamma, beta) print(Y) # 反向传播模拟 grad_Y = torch.ones_like(Y) grad_X = grad_Y * gamma / torch.sqrt(torch.var(X, dim=0, unbiased=False)) print(grad_X) ``` 上述代码实现了基本的 BN 正则化逻辑,并演示了部分梯度计算方法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值