batch归一化

本文来自于网易云课堂
在深度学习兴起后,最重要的一个思想是一个算法-Batch归一化,由Sergey Ioffe和Christian Szegedy两位研究者创造。Batch归一化会使参数搜索问题变得很容易,使神经网络对超参数的旋转更加稳定,超参数的范围会更庞大,工作效果也很好。
在逻辑回归中,我们学过归一化输入会让算法运行的更好。
这里写图片描述
那么我们可不可以归一化每一层的a来使得下一次的参数训练的更好呢?简单来说,Batch归一化做的就是这个事情。严格的说,归一化的不是a而是z。
归一化的过程如下:
这里写图片描述
前三个公式让z的每一个分量都含有平均值0和方差1,但我们不想让隐藏单元总是含有平均值0和方差1,也许隐藏单元有了不同的分布会有意义,所以有了第四个公式。 注意, γβ γ 和 β 是模型的学习参数,他们的作用是允许我们可以随意设置 z~ z ~ 的平均值,事实上,如果 γ=σ2+ϵ γ = σ 2 + ϵ β=μ β = − μ ,那么 z~(i)=z(i) z ~ ( i ) = z ( i ) 。通过对 γβ γ 和 β 合理设定,可以使你构造含其他平均值和方差的隐藏单元值。于是,我们将会使用 z~(i) z ~ ( i ) 来替代 z(i) z ( i ) ,方便神经网络中的后续计算。
怎么将bantch归一化加到神经网络中呢?
这里写图片描述
那么batch归一化为什么会有效呢?
首先,从之前的输入特征归一化可以看到,它可以将不同参数的范围变换到相似的范围,可以加速学习。但是batch归一化不仅仅是对输入值,而且还对隐藏单元进行归一化。
第二个原因是,它可以使权重比你的网络更滞后或更深层。比如第10层的权重比第一层的权重更能经受的住变化。这是什么意思呢?下面给出一个生动形象的例子。
对于下面这个猫脸识别的神经网路,可能是深层也可能是浅层。假设你已经在所有黑猫的图像上训练了数据集,如果现在你要把此网路应用于有色猫,这种情况下,正面的例子不仅是黑色猫还有有色猫。那么你的cosfa可能适用的不会很好(cosfa是啥意思?是classify吗?)。如果在黑猫图像中,你的训练集是一种情况,加上有色猫以后,如果你试图把黑猫和有色猫统一与一个数据集,那么你就不应该期待左边训练很好的模块同样在右边也运行的很好。
这里写图片描述
所以,使你的数据分布改变的想法有个有点怪的名字-covariate shift。如果你已经学习了x->y的映射,如果x的分布改变了,那么你可能需要重新训练你的学习算法。covariate shift的问题怎么应用于神经网络呢?
让我们从第三层来看看神经网络的学习过程。假如此网络已经学习了参数w3,b3,从第三隐藏层的角度来看,它从前层中取一些值,然后做些什么希望使输出值\hat \hat 接近于真实值y。
这里写图片描述
假如将前面的遮住,从第三隐藏层的角度来看,它得到一些值 a1,a2... a 1 , a 2 . . . ,第三隐藏层的工作是找到一种方式使这些值映射到\hat \hat 。但是将前面的层打开,我们可以看到前面的层的参数会导致 a1,a2... a 1 , a 2 . . . 的变化。从第三隐藏层来看,这些隐藏单元的值在不断的改变,所以它就有了covariate shift的问题。
这里写图片描述
batch归一化做的就是它减少了这些隐藏层分布变化的数量。如果是绘制这些隐藏的单元值的分布,从2d的视角来看。即使z1、z2会改变,而的确也在改变,batch归一化能够使的z1、z2的均值和方差保持不变。即使z1和z2一直在变,batch归一化至少能够保证其均值为0,方差为1或者是由 γβ γ 和 β 决定的值。也就是它限制了在前层的参数更新会影响数值分布的程度。当前面参数改变了它使得后面的参数适应的程度减小了,或许你可以这样想,它减少了前层参数与后层参数之间的联系,使得网络每层都可以自己学习,稍稍独立与其他层,这将有助于加速整个网络的学习。
这里写图片描述
batch还有一个作用,它有一个轻微的正则化的作用。
这里写图片描述

<think>嗯,用户想了解批量归一化Batch Normalization)的概念、原理及应用。首先,我需要回忆一下批量归一化的基本知识。记得它是由Sergey Ioffe和Christian Szegedy在2015年提出的,主要是用来解决深度神经网络训练中的内部协变量偏移问题。这个概念可能有点抽象,需要解释清楚。 内部协变量偏移是指每一层输入的分布随着前一层参数的变化而发生变化,导致训练变得困难。批量归一化通过对每一层的输入进行标准化处理,使其均值接近0,方差接近1,从而加速训练并提高模型稳定性。 接下来是原理部分。批量归一化通常在激活函数之前应用,对每个小批量数据进行处理。步骤包括计算均值和方差、标准化、缩放和平移。这里需要注意数学公式的正确性,比如标准化公式应该是减均值除以标准差加上一个epsilon防止除零。然后使用可学习的参数gamma和beta来恢复网络的表达能力。 然后是应用场景。比如加速训练、允许更高的学习率、减少对初始化的依赖、起到轻微的正则化效果等。可能还需要提到在卷积神经网络中的应用,比如在激活函数之后应用,或者在卷积层和全连接层的不同处理方式。 用户可能还关心批量归一化的优缺点,比如在Batch较小时效果不佳,这时候可能转向其他归一化方法,比如Layer Normalization或者Instance Normalization。另外,在推理阶段,使用的是整个训练集的均值和方差的移动平均,而不是小批量的统计量,这一点也需要说明。 参考引用部分,虽然用户提供的引用中没有直接提到批量归一化,但可能需要关联到优化指标或初始化方法。不过可能更适合直接引用原始论文或其他可靠来源,但根据用户提供的引用,可能需要调整。比如引用[1]提到优化指标,可以联系到批量归一化如何作为优化训练过程的技术。而引用[2]关于He初始化,可以对比批量归一化如何减少对初始化的依赖。 最后,生成相关问题的时候,要围绕批量归一化的原理、实现细节、与其他技术的比较、应用中的挑战等展开。比如与其他归一化技术的区别,实际应用中的注意事项,或者如何与不同的初始化方法结合使用。 需要确保回答结构清晰,分点解释,并且使用正确的中文术语。数学公式要使用$$...$$格式,例如标准化过程。同时,代码示例可能展示批量归一化的实现,比如在TensorFlow或PyTorch中的使用方式。 可能还需要注意用户的背景,如果是深度学习的学习者,可能需要更详细的原理解释,而如果是实践者,可能更关注应用和调参技巧。但根据问题描述,用户需要概念、原理和应用,所以应全面覆盖这些方面。 检查是否有遗漏的关键点,比如批量归一化在训练和测试阶段的不同处理,为什么能加速收敛,以及其正则化效果的原因。同时,确保LaTeX格式正确,例如变量用$符号包裹,独立公式用双美元符号。 最后,确保回答中引用的部分自然添加标识,比如在提到减少对初始化依赖时引用[2]关于初始化的内容,或者在提到优化训练目标时引用[1]中的优化指标概念。</think>### 批量归一化Batch Normalization)的概念、原理及应用 #### 1. **概念** 批量归一化Batch Normalization, BN)是深度学习中一种用于加速训练、提升模型稳定性的技术。其核心思想是对神经网络每一层的输入进行标准化处理,使得输入分布接近均值为0、方差为1的高斯分布,从而缓解**内部协变量偏移**(Internal Covariate Shift)问题[^1]。 #### 2. **原理** **步骤详解**(以全连接层为例): - **输入**:某一层的输入为小批量数据 $B = \{x_1, x_2, ..., x_m\}$。 - **计算均值和方差**: $$ \mu_B = \frac{1}{m} \sum_{i=1}^m x_i, \quad \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i - \mu_B)^2 $$ - **标准化**: $$ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} \quad (\epsilon \text{为防除零的小常数}) $$ - **缩放和平移**(引入可学习参数 $\gamma$ 和 $\beta$): $$ y_i = \gamma \hat{x}_i + \beta $$ 此操作使网络能够自适应地恢复数据的表达能力[^2]。 #### 3. **应用** - **加速训练**:标准化后的输入分布更稳定,允许使用更高的学习率。 - **缓解梯度消失/爆炸**:归一化减少了激活值的动态范围,梯度更易传播。 - **正则化效果**:小批量数据的噪声对模型参数更新有轻微正则化作用。 - **降低对初始化的敏感度**:参数初始化的影响被削弱,减少了对复杂初始化方法的依赖。 **应用场景示例**: - **卷积神经网络**:对每个特征图(Channel)独立归一化。 - **循环神经网络**:需结合时间步调整归一化方式。 - **生成对抗网络**(GANs):稳定生成器和判别器的训练。 #### 4. **代码示例(PyTorch)** ```python import torch.nn as nn class Model(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(100, 50) self.bn = nn.BatchNorm1d(50) # 批量归一化层 self.relu = nn.ReLU() def forward(self, x): x = self.fc(x) x = self.bn(x) # 通常在激活函数前应用BN x = self.relu(x) return x ``` #### 5. **注意事项** - **推理阶段**:使用训练时计算的移动平均 $\mu$ 和 $\sigma$,而非实时统计量。 - **小批量问题**:当 Batch Size 过小时,统计量不准确,可改用 Layer Normalization 或 Group Normalization。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值