pytorch BatchNorm参数详解,计算过程

目录

 

说明

BatchNorm1d参数

num_features

eps

momentum

affine

track_running_stats

BatchNorm1d训练时前向传播

BatchNorm1d评估时前向传播

总结


说明

网络训练时和网络评估时,BatchNorm模块的计算方式不同。如果一个网络里包含了BatchNorm,则在训练时需要先调用train(),使网络里的BatchNorm模块的training=True(默认是True),在网络评估时,需要先调用eval(),使网络里的BatchNorm模块的training=False。

BatchNorm1d参数

torch.nn.BatchNorm1d(num_features, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)

num_features

输入维度是(N, C, L)时,num_features应该取C;这里N是batch size,C是数据的channel,L是数据长度。

输入维度是(N, L)时,num_features应该取L;这里N是batch size,L是数据长度,这时可以认为每条数据只有一个channel,省略了C

eps

对输入数据进行归一化时加在分母上,防止除零,详情见下文。

momentum

更新全局均值running_mean和方差running_var时使用该值进行平滑,详情见下文。

affine

设为True时,BatchNorm层才会学习参数\gamma\beta,否则不包含这两个变量,变量名是weightbias,详情见下文。

track_running_stats

设为True时,BatchNorm层会统计全局均值running_mean和方差running_var,详情见下文。

BatchNorm1d训练时前向传播

  1. 首先对输入batch求E[x]Var[x],并用这两个结果把batch归一化,使其均值为0,方差为1。归一化公式用到了eps(\epsilon),即y=\frac{x-E[x]}{\sqrt{Var[x]+\epsilon }}。如下输入内容,shape是(3, 4),即batch_size=3,此时num_features需要传入4。
    tensor = torch.FloatTensor([[1, 2, 4, 1],
                                [6, 3, 2, 4],
                                [2, 4, 6, 1]])
    此时E[x]=[3, 3, 4, 2]Var[y]_{unbiased}=[7, 1, 4, 3](无偏样本方差)和Var[y]_{biased}=[4.6667, 0.6667, 2.6667, 2.0000](有偏样本方差),有偏和无偏的区别在于无偏的分母是N-1,有偏的分母是N。注意在BatchNorm中,用于更新running_var时,使用无偏样本方差即,但是在对batch进行归一化时,使用有偏样本方差,因此如果batch_size=1,会报错。归一化后的内容如下。
    [[-0.9258, -1.2247,  0.0000, -0.7071],
     [ 1.3887,  0.0000, -1.2247,  1.4142],
     [-0.4629,  1.2247,  1.2247, -0.7071]]
  2. 如果track_running_stats==True,则使用momentum更新模块内部的running_mean(初值是[0., 0., 0., 0.])和running_var(初值是[1., 1., 1., 1.]),更新公式是x_{new}=(1-momentum)\times x_{cur}+momentum\times x_{batch},其中x_{new}代表更新后的running_meanrunning_varx_{cur}表示更新前的running_meanrunning_varx_{batch}表示当前batch的均值和无偏样本方差。
  3. 如果track_running_stats==False,则BatchNorm中不含有running_meanrunning_var两个变量。
  4. 如果affine==True,则对归一化后的batch进行仿射变换,即乘以模块内部的weight(初值是[1., 1., 1., 1.])然后加上模块内部的bias(初值是[0., 0., 0., 0.]),这两个变量会在反向传播时得到更新。
  5. 如果affine==False,则BatchNorm中不含有weightbias两个变量,什么都都不做。

BatchNorm1d评估时前向传播

  1. 如果track_running_stats==True,则对batch进行归一化,公式为y=\frac{x-\hat{E}[x]}{\sqrt{\hat{Var}[x]+\epsilon }},注意这里的均值和方差是running_meanrunning_var,在网络训练时统计出来的全局均值和无偏样本方差。
  2. 如果track_running_stats==False,则对batch进行归一化,公式为y=\frac{x-{E}[x]}{\sqrt{​{Var}[x]+\epsilon }},注意这里的均值和方差是batch自己的mean和var,此时BatchNorm里不含有running_meanrunning_var注意此时使用的是无偏样本方差(和训练时不同),因此如果batch_size=1,会使分母为0,就报错了。
  3. 如果affine==True,则对归一化后的batch进行放射变换,即乘以模块内部的weight然后加上模块内部的bias,这两个变量都是网络训练时学习到的。
  4. 如果affine==False,则BatchNorm中不含有weightbias两个变量,什么都不做。

总结

在使用batchNorm时,通常只需要指定num_features就可以了。网络训练前调用train(),训练时BatchNorm模块会统计全局running_meanrunning_var,学习weightbias,即文献中的\gamma\beta。网络评估前调用eval(),评估时,对传入的batch,使用统计的全局running_meanrunning_var对batch进行归一化,然后使用学习到的weightbias进行仿射变换。

### Batch Normalization 参数详解及作用 Batch Normalization (BN) 是一种用于加速深度神经网络训练的技术,其核心思想是通过对每一层输入的数据进行标准化处理来减少内部协变量偏移(Internal Covariate Shift)。以下是 BN 中涉及的主要参数及其作用: #### 1. **γ 和 β** - γ 和 β 是两个可学习的缩放和平移参数,分别用来调整数值分布的方差大小和均值位置[^2]。 - 默认情况下,γ 初始化为 1,β 初始化为 0。这使得初始阶段的 BN 输出等于原始输入。 - 这些参数允许模型恢复被标准化掉的信息,并适应不同的激活函数需求。 #### 2. **ε (epsilon)** - ε 是一个小常数,通常设置为 \(1e^{-5}\) 或 \(1e^{-3}\),用于防止除零错误,在计算标准差时加入分母中以稳定数值运算[^4]。 #### 3. **moving_mean 和 moving_variance** - 在训练过程中,BN 需要估计整个数据集上的均值和方差。为了实现这一点,引入了移动平均机制。 - `moving_mean` 表示全局均值的指数加权移动平均值;`moving_variance` 则表示全局方差的指数加权移动平均值[^3]。 - 移动平均更新公式如下: \[ \text{new\_mean} = (1 - \text{momentum}) \cdot \text{current\_mean} + \text{momentum} \cdot \text{old\_mean} \] 同理适用于 variance 更新。 #### 4. **momentum** - momentum 控制移动平均的速度,默认值一般设为 0.9 或 0.999。 - 较高的 momentum 值意味着更慢地更新 moving_mean 和 moving_variance,从而更加依赖历史统计量。 #### PyTorch 实现中的参数说明 在 PyTorch 的 `nn.BatchNorm2d(num_features)` 方法中,上述参数可以通过以下方式指定或访问: ```python import torch.nn as nn # 创建一个具有 64 个特征通道的 BatchNorm 层 bn_layer = nn.BatchNorm2d(64) print(bn_layer.weight) # 对应于 gamma 参数 print(bn_layer.bias) # 对应于 beta 参数 print(bn_layer.running_mean) # 训练过程中的 moving mean print(bn_layer.running_var) # 训练过程中的 moving var print(bn_layer.eps) # epsilon 小值 print(bn_layer.momentum) # 动态平均系数 ``` --- ### 总结 Batch Normalization 使用 γ 和 β 来调节标准化后的输出分布,同时利用 moving_mean 和 moving_variance 跟踪整体统计数据。这些参数共同协作,使网络能够在不牺牲表达能力的情况下更快收敛并提高性能。
评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值