Batch Normalization (训练、测试、优点、缺点)

批量归一化(Batch Normalization)是深度学习中用于加速训练、提升模型稳定性的技术。它通过在训练过程中对每个批次的数据进行归一化处理,解决了梯度消失和初始化敏感的问题。BN层在训练时使用 mini-batch 的均值和方差,而在测试时使用整个训练集的统计信息。此外,BN层可以提高学习率,减少对dropout的依赖,并在某些情况下替代局部响应归一化。然而,当batchsize较小,BN的效果会减弱,这时可以考虑使用Group Normalization作为替代方案。

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

一、使用顺序:

Conv=>BN=>ReLU=>dropout=>Conv

BN本质上是解决传播过程中的梯度消失问题

二、训练
下图面试常考!

训练时前向传导过程公式:

在这里插入图片描述

 

理解:

1. 这个可学习重构参数 γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。(因为如果没有 γ、β ,那相当于我这一层网络所学习到的特征分布被你搞坏了)
2. 这个 scale 和 shift ,它们的主要作用就是找到一个线性和非线性的平衡点,既能享受非线性较强的表达能力,有可以避免非线性饱和导致网络收敛变慢问题。

细节:

1. BN层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个特征图,每个特征图的大小是100100,这样就相当于这一层网络有6100100个神经元,如果采用BN,就会有6100*100个参数γ、β,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。

2. 卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为m,那么网络某一层输入数据可以表示为四维矩阵 (m,f,w,h),m为min-batch sizes,f为特征图个数,w、h分别为特征图的宽高。在CNN中我们可以把每个特征图看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m ∗ w ∗ h m * w * hm∗w∗h,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。

3. 在使用BN前,减小学习率、小心的权重初始化的目的是:使其输出的数据分布不要发生太大的变化。

4. 因为偏置参数 b 经过 BN 层后其实是没有用的,最后也会被均值归一化,当然BN层后面还有个 β 参数作为偏置项,所以 b 这个参数就可以不用了。因此最后把 BN 层 + 激活函数 层就变成了:

z=g(BN(W))

三、测试
对于BN,当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差,gamma和bata。

测试的时候还是类似的:

在这里插入图片描述

 

测试的时候,是一个一个样本进行测试的,所以没办法求 均值和 方差,所以可以用训练数据的。因为每次做 Mini-Batch 训练时,都会有那个 Mini-Batch 里 m 个训练实例获得的均值和方差,现在要全局统计量,只要把每个Mini-Batch的均值和方差统计量记住,然后 均值采用训练集所有 batch 均值的期望,方差采用训练集所有 batch 的方差的无偏估计即可得出全局统计量,即:

在这里插入图片描述
(在测试时,所使用的均值和方差是整个训练集的均值和方差。整个训练集的均值和方差的值通常是在训练的同时用 移动平均法 来计算的。)
关于移动平均参考:移动平均

 

所以测试时总的公式入下:

在这里插入图片描述
============================================================

 

细节:
上述这个总的测试公式和训练的时候下式:

在这里插入图片描述
形式上是保持一致的,但是似乎做了某种变换。有可能是为了减少计算量。
因为对于每个隐层节点来说,

 在这里插入图片描述

 

上式红框中两项都是固定值,这样这两个值可以事先算好存起来,在预测的时候直接用就行了,这样比原始的公式每一步骤都现算少了除法的运算过程,乍一看也没少多少计算量,但是如果隐层节点个数多的话节省的计算量就比较多了。

这里其实是和训练保持一致,因为都要先减去训练集的均值再除以方差。这里你把训练时候的 x^{(k)}带进去算下就能理解测试时候的了。

四、BN的作用
1. 改善流经网络的梯度

2. 允许更大的学习率,大幅提高训练速度:
你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;

3. 减少对初始化的强烈依赖

4. 改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求
你再也不用去理会过拟合中dropout、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

5. 再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

6. 可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。

五、BN的不足
1. 当batch size较小时(比如2、4这样),该batch数据的均值和方差的代表性较差,因此对最后的结果影响也较大。随着batch size越来越小,BN层所计算的统计信息的可靠性越来越差,这样就容易导致最后错误率的上升;而在batch size较大时则没有明显的差别。虽然在分类算法中一般的GPU显存都能cover住较大的batch设置,但是在目标检测、分割以及视频相关的算法中,由于输入图像较大、维度多样以及算法本身原因等,batch size一般都设置比较小,所以GN对于这种类型算法的改进应该比较明显。

在这里插入图片描述

 

如上图,可见 BN 随着 batchsize 减小,性能下降比较明显。
由于BN训练的时候是基于一个 mini-batch 来计算均值和方差的,这相当于在梯度计算时引入噪声,如果 batchsize 很小的话, BN 就有很多不足。不适用于在线学习(batchsize = 1)

2. 无法在RNN等网络中使用。

4. 在mask rcnn的代码中,网络结构中有个重写batch normalization的类:

class BatchNorm(KL.BatchNormalization):
    """Extends the Keras BatchNormalization class to allow a central place
    to make changes if needed.
    Batch normalization has a negative effect on training if batches are small
    so this layer is often frozen (via setting in Config class) and functions
    as linear layer.
    """


当数据是大图片,并且一个batch一般都只有1-2张图片,不建议使用 BN

4. batchsize 小的时候可以用 group normalization 代替

在这里插入图片描述
BatchNorm:batch 方向做归一化,算 N ∗ H ∗ W N*H*WN∗H∗W 的均值

LayerNorm:channel 方向做归一化,算 C ∗ H ∗ W C*H*WC∗H∗W 的均值

InstanceNorm:一个 channel 内做归一化,算 H ∗ W H*WH∗W 的均值

GroupNorm:将 channel 方向分 group ,然后每个 group 内做归一化,算 (C//G)*H*W的均值

针对每一个 γ 和 β,GN 是对每一个 channel 进行学习的

其中两维 C 和 N 分别表示 channel 和 batch size,第三维表示 H,W,可以理解为该维度大小是 H*W,也就是拉长成一维,这样总体就可以用三维图形来表示。可以看出 BN 的计算和 batch size 相关(蓝色区域为计算均值和方差的单元),而 LN、BN 和 GN 的计算和 batch size 无关。同时 LN 和 IN 都可以看作是 GN 的特殊情况(LN 是 group=1 时候的 GN,IN 是 group=C 时候的GN)。

Tensorflow代码:

def GroupNorm(x,G=16,eps=1e-5):
    N,H,W,C=x.shape    	
    x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(G,tf.int32),tf.cast(C//G,tf.int32)])
    mean,var=tf.nn.moments(x,[1,2,4],keep_dims=True)
    x=(x-mean)/tf.sqrt(var+eps)
    x=tf.reshape(x,[tf.cast(N,tf.int32),tf.cast(H,tf.int32),tf.cast(W,tf.int32),tf.cast(C,tf.int32)])
    gamma = tf.Variable(tf.ones(shape=[1,1,1,tf.cast(C,tf.int32)]), name="gamma")
    beta = tf.Variable(tf.zeros(shape=[1,1,1,tf.cast(C,tf.int32)]), name="beta")
    return x*gamma+beta


参考:

  1. cs231n学习笔记-激活函数-BN-参数优化
  2. BN和Dropout在训练和测试时的差别
  3. 深入理解 BatchNormalization
  4. Group Normalization
<think>好的,我现在需要帮助用户解答关于人工神经网络训练优化方法的问题。首先,用户提到了梯度下降、正则化和学习率调整这几个关键词,所以我需要围绕这些主题来组织回答。 首先,我应该从梯度下降的基本概念开始,介绍不同的变体,比如随机梯度下降(SGD)、小批量梯度下降,以及带动量的优化方法。这部分需要解释清楚每种方法的原理和优缺点,比如SGD的计算效率高但可能震荡,动量法如何加速收敛等。要注意使用行内数学公式,比如$θ_{t+1} = θ_t - \eta \nabla L(θ_t)$,确保格式正确。 接下来是学习率调整部分。用户提到了学习率调整,所以需要涵盖预热策略、指数衰减、余弦退火等方法。这里需要提到具体的学习率公式,比如$\eta_t = \min(\eta_{base} \cdot \frac{t}{T_{warmup}}, \eta_{base})$,并且要说明每种方法的应用场景和效果。例如,余弦退火如何帮助跳出局部极小值。 然后是正则化技术。根据用户提供的引用内容,L1和L2正则化已经提到过,所以需要详细说明它们的作用机制,比如L1倾向于稀疏化,L2减小权重的影响。此外,Dropout和批量归一化也是重要的正则化方法,需要解释它们如何减少过拟合和协变量偏移。这里可以引用用户提供的参考[2]和[4],比如实例归一化减少内部协变量偏移,以及Dropout在训练时随机失活神经元。 还需要考虑其他优化方法,如自适应优化器(Adam、RMSProp),这些结合了动量和自适应学习率的优点,应该简要介绍它们的工作原理,比如Adam中的一阶和二阶矩估计。 在组织内容时,要确保结构清晰,分点说明,每个部分都有小标题。同时,按照用户的要求,所有行内数学表达式用$...$,独立公式用$$...$$。例如,动量法的更新公式可以写成$$θ_{t+1} = θ_t - \eta \nabla L(θ_t) + \gamma (θ_t - θ_{t-1})$$。 最后,生成相关问题时要覆盖用户可能感兴趣的方向,比如梯度下降的变体比较、学习率调整策略的选择、正则化方法的效果对比,以及自适应优化器的优缺点。确保问题与回答内容紧密相关,帮助用户进一步探索。 检查引用部分是否正确,比如提到L1和L2正则化时引用[1]和[4],实例归一化引用[2],超参数搜索引用[3]。引用标识需要自然地插入在相关段落的末尾,如“通过限制模型复杂度避免过拟合[^1]”。 还要注意使用中文回答,避免任何Markdown格式,代码块用三个反引号包裹,并确保LaTeX语法正确。整个回答要逻辑连贯,由浅入深,逐步展开每个优化方法,帮助用户全面理解神经网络训练的优化技术。</think>### 人工神经网络训练优化方法详解 人工神经网络训练优化方法主要围绕如何高效更新模型参数、防止过拟合、提升泛化能力展开。以下是梯度下降、正则化和学习率调整的核心方法: --- #### 一、梯度下降优化 梯度下降是神经网络参数更新的基础方法,目标是最小化损失函数$L(θ)$。常见变体包括: 1. **随机梯度下降(SGD)** 每次随机选取一个样本计算梯度并更新参数: $$θ_{t+1} = θ_t - \eta \nabla L(θ_t)$$ 优点:计算高效;缺点:更新方向震荡严重。 2. **小批量梯度下降(Mini-batch SGD)** 每次选取一个小批量数据计算梯度,平衡了计算效率与稳定性: $$θ_{t+1} = θ_t - \eta \cdot \frac{1}{m} \sum_{i=1}^m \nabla L(θ_t; x_i)$$ 其中$m$为批量大小,通常取32-256。 3. **动量法(Momentum)** 引入动量项加速收敛并减少震荡: $$v_{t+1} = \gamma v_t + \eta \nabla L(θ_t)$$ $$θ_{t+1} = θ_t - v_{t+1}$$ 动量系数$\gamma$通常设为0.9[^3]。 --- #### 二、学习率调整策略 学习率$\eta$直接影响收敛速度和稳定性: 1. **预热策略(Warmup)** 初期使用较小学习率,逐步增大至设定值,避免参数剧烈震荡: $$\eta_t = \min\left(\eta_{base} \cdot \frac{t}{T_{warmup}}, \eta_{base}\right)$$ 其中$T_{warmup}$为预热步数。 2. **指数衰减与余弦退火** - **指数衰减**:$\eta_t = \eta_{base} \cdot e^{-kt}$,逐步降低学习率以精细调参。 - **余弦退火**:周期性重置学习率,帮助跳出局部极小值: $$\eta_t = \eta_{min} + \frac{1}{2}(\eta_{max} - \eta_{min})\left(1 + \cos\left(\frac{t}{T_{cycle}}\pi\right)\right)$$ --- #### 三、正则化方法 正则化通过限制模型复杂度防止过拟合: 1. **L1/L2正则化** - L1正则化:损失函数中添加权重绝对值之和,促进稀疏性: $$L_{\text{new}} = L + \lambda \sum |w_i|$$ - L2正则化(权重衰减):添加权重平方和,限制权重幅值: $$L_{\text{new}} = L + \frac{\lambda}{2} \sum w_i^2$$ L2正则化更常用,尤其在深度学习中[^4]。 2. **Dropout** 训练时以概率$p$随机失活神经元,强制网络学习冗余表示: ```python # PyTorch示例 torch.nn.Dropout(p=0.5) ``` 测试时需对权重按$p$缩放以保持期望一致[^4]。 3. **批量归一化(Batch Normalization)** 对每层输入进行标准化,减少内部协变量偏移[^2]: $$\hat{x} = \frac{x - \mu}{\sqrt{\sigma^2 + \epsilon}}$$ 其中$\mu$和$\sigma$为当前批次的均值和方差。 --- #### 四、其他优化技术 1. **自适应优化器** - **Adam**:结合动量与自适应学习率,适用于非平稳目标函数: $$m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t$$ $$v_t = \beta_2 v_{t-1} + (1-\beta_2)g_t^2$$ $$θ_{t+1} = θ_t - \eta \cdot \frac{m_t}{\sqrt{v_t} + \epsilon}$$ - **RMSProp**:针对不同参数自适应调整学习率,适合处理稀疏梯度。 2. **早停(Early Stopping)** 监控验证集损失,当连续多轮不下降时终止训练,避免过拟合。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值