欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

简述批量归一化batch_normalization

程序员文章站 2024-03-14 09:56:52
...

批量归一化batch_normalization

一、为什么要用批量归一化

机器学习领域有个很重要的假设:独立同分布假设,就是假设训练数据和测试数据是满足相同分布的,这是通过训练数据获得的模型能够在测试集获得好的效果的一个基本保障。如果训练数据与测试数据的分布不同,网络的泛化能力就会严重降低。

在之前的学习过程中我们知道,输入层的数据,已经归一化,而后面网络每一层的输入数据的分布一直在发生变化,前面层训练参数的更新将导致后面层输入数据分布的变化,必然会引起后面每一层输入数据分布的改变。而且,网络前面几层微小的改变,后面几层就会逐步把这种改变累积放大。BN的提出,就是要解决在训练过程中,中间层数据分布发生改变的情况。

二、什么是批量归一化

BN的基本思想:因为深层神经网络在做非线性变换前的**输入值(Z=WX+b)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着**输入值Z是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因,而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得**输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。

总结一下就是说,经过BN后,大部分值将会落入非线性函数(**函数)的线性区内,其对应的导数远离导数饱和区,这样来加速训练收敛过程。
明白了其思想之后,我们应该如何做归一化呢?这时我们首先想到的可能是:在输入之前加一个预处理。比如归一化到均值为0,方差为1,然后再送入输入进行学习。就如下面的公式一样:
简述批量归一化batch_normalization
但实际上并没有这么简单;这里我们再思考几个问题

  • 回想一下我们之前讲过的**函数ReLU,假设在**层之前,数据大多在正半轴,那么经过**层后,大部分神经元将被**;但如果我们在输入**层之前,对数据直接进行归一化,在经过**层后,只有一半的神经元会被**。这样一来,我们学习到的神经元就会被破坏掉,这显然不是我们想要的结果。
  • 如果都归一化到一个范围(如均值为0,方差为1),那么绝大部分数据都会位于**函数的线性区域(如sigmoid),但**层本身的意义是为了引入非线性因素;因此,简单地做归一化处理,相当于仅利用到了线性变化能力,从而降低了神经网络的表达能力,这同样也不是我们想要的结果

为了解决上述问题,我们又引入了一个公式
简述批量归一化batch_normalization
其中,其中γ和β是BN层中的参数,经过变换后后,分布的均值为β,标准差为γ;相当于通过γ和β把这个值从标准正态分布左移或者右移一点,变胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。
至此,我们知道了BN层的计算公式
简述批量归一化batch_normalization

sample_mean = np.mean(x,axis = 0) #矩阵x每一列的平均值(D,)
sample_var = np.var(x,axis = 0) #矩阵x每一列的方差(D,)
x_hat = (x - sample_mean)/(np.sqrt(sample_var + eps)) #标准化,eps:防止除数为0而增加的一个很小的正数
out = gamma * x_hat + beta #gamma放缩系数,beta偏移常量
  • 做完这些后,还有一个问题,我们用归一化公式将原始数据拉到正中间后,现在又变化回去了,那和原来相比有什么不一样呢?
    原来每一层输出的均值取决于下层神经网络的复杂关联;但在引入BN层后,某层的输出仅由两个参数γ和β决定,去除了与下层计算的密切耦合,使用梯度下降法优化参数时,优化方法只需要调节两个参数的值来控制各层的输出,而不需要调节各层的全部参数来确定,简化了神经网络的训练。

三、批量归一化应该用在哪儿

在实现层面,应用这个技巧通常是在全连接层(或者是卷积层)与**函数之间添加一个BN层,对数据进行处理使其服从标准高斯分布。

除BN外,还有LN,IN,GN我们可以了解一下简述批量归一化batch_normalization

立方体的3个维度为别为batch/ channel/ HW,而我们常见的feature maps中,3个维度分别为channel/ H/W,没有batch。分析上图可知:BN计算均值和标准差时,固定channel(在一个channel内),对HW和batch作平均;LN计算均值和标准差时,固定batch(在一个batch内),对HW和channel作平均;IN计算均值和标准差时,同时固定channel和batch(在一个batch内中的一个channel内),对HW作平均;GN计算均值和标准差时,固定batch且对channel作分组(在一个batch内对channel作分组),在分组内对HW作平均。

此外,我们在assignment2的batch normlization和convolutional Network中,还会看到LN、SBN、SGN等,这些本质上都实现了对数据的规范化,但其具体公式需要我们额外找资料来进行学习验证