Batch Normalizition

1 什么是归一化/标准化

Normalization是一个统计学中的概念,我们可以叫它归一化或者规范化,它并不是一个完全定义好的数学操作(如加减乘除)。它通过将数据进行偏移和尺度缩放调整,在数据预处理时是非常常见的操作,在网络的中间层如今也很频繁的被使用。

  1. 线性归一化
    最简单来说,归一化是指将数据约束到固定的分布范围,比如8位图像的0~255像素值,比如0~1。在数字图像处理领域有一个很常见的线性对比度拉伸操作:X=(x-xmin)/(xmax-mxin) 它常常可以实现下面的增强对比度的效果。不过以上的归一化方法有个非常致命的缺陷,当X最大值或者最小值为孤立的极值点,会影响性能。
    在这里插入图片描述
    1. 零均值归一化/Z-score标准化 零均值归一化也是一个常见的归一化方法,被称为标准化方法,即每一变量值与其平均值之差除以该变量的标准差。
      在这里插入图片描述
      经过处理后的数据符合均值为0,标准差为1的分布,如果原始的分布是正态分布,那么z-score标准化就将原始的正态分布转换为标准正态分布,机器学习中的很多问题都是基于正态分布的假设,这是更加常用的归一化方法。以上两种方法都是线性变换,对输入向量X按比例压缩再进行平移,操作之后原始有量纲的变量变成无量纲的变量。不过它们不会改变分布本身的形状,下面以一个指数分布为例:
      在这里插入图片描述如果要改变分布本身的形状,下面也介绍两种
      3.正态分布Box-Cox变换 box-cox变换可以将一个非正态分布转换为正态分布,使得分布具有对称性,变换公式如下:
      在这里插入图片描述
      在这里lamda是一个基于数据求取的待定变换参数,Box-Cox的效果如下。
      在这里插入图片描述4. 直方图均衡化直方图均衡也可以将某一个分布归一化到另一个分布,它通过图像的灰度值分布,即图像直方图来对图像进行对比度进调整,可以增强局部的对比度。它的变换步骤如下:(1)计算概率密度和累积概率密度。(2)创建累积概率到灰度分布范围的单调线性映射T。(3)根据T进行原始灰度值到新灰度值的映射。直方图均衡化将任意的灰度范围映射到全局灰度范围之间,对于8位的图像就是(0,255),它相对于直接线性拉伸,让分布更加均匀,对于增强相近灰度的对比度很有效,如下图。

在这里插入图片描述

2 Batch Normalization

在深度学习中,因为网络的层数非常多,如果数据分布在某一层开始有明显的偏移,随着网络的加深这一问题会加剧(这在BN的文章中被称之为internal covariate shift),进而导致模型优化的难度增加,甚至不能优化。所以,归一化就是要减缓这个问题。

  1. BN层作用:
    0) 减轻了对参数初始化的依赖,这是利于调参的朋友们的。
    1) 改善流经网络的梯度,
    2)允许更大的学习率,大幅提高训练速度:
    你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率的衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;
    3)减少对初始化的强烈依赖
    4)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求
    再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;
    对于Dropout来讲,给每个隐藏单元一定概率置零的可能,这样就相当于给网络引入了噪声。迫使Dropout后部单元不过分依赖于前面任何一个隐藏单元。而BN,因为是在Mini-batch上计算mean、variance,而不是整个数据集上。均值和方差有一些小噪音,在进行缩放过程,γ、β也会引入噪声,这样和dropout类似,它往每个隐藏层的激活值上增加了噪音,所以起到了一定的正则化作用。当mini-batch变大时,由于均值方差更加接近真实值,所以噪声会减小,就会减少正则化的效果。
    5)再也不需要使用使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;
    6)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)。
    缺点:对Batch的大小有要求,不能让batch值太小,还有不适用于类似与rnn这类变长度网

3. BN层的原理过程

	我们以神经网络中的一个普通神经元为例。神经元接收一组输入向量 

在这里插入图片描述
通过某种运算后,输出一个标量值:在这里插入图片描述
由于 ICS 问题的存在,X的分布可能相差很大。要解决独立同分布的问题,“理论正确”的方法就是对每一层的数据都进行白化操作。然而标准的白化操作代价高昂,特别是我们还希望白化操作是可微的,保证白化操作可以通过反向传播来更新梯度。因此,以 BN 为代表的 Normalization 方法退而求其次,进行了简化的白化操作。基本思想是:在将 X 送给神经元之前,先对其做平移和伸缩变换, 将 X的分布规范化成在固定区间范围的标准分布。
通用变换框架就如下所示:
在这里插入图片描述
(1)mu 是平移参数(shift parameter), sigma是缩放参数(scale parameter)。通过这两个参数进行 shift 和 scale 变换:在这里插入图片描述
得到的数据符合均值为 0、方差为 1 的标准分布。
(2) B是再平移参数(re-shift parameter), g 是再缩放参数(re-scale parameter)。将 上一步得到的X帽 进一步变换为:
在这里插入图片描述
最终得到的数据符合均值为 b 、方差为 g^2 的分布。
说好的处理 ICS,第一步都已经得到了标准分布,第二步怎么又给变走了?
答案是——为了保证模型的表达能力不因为规范化而下降。
说下我的理解,首先,我们进行标准化,这样处理了异常数据问题,但是数据分布被改变了,这样并不好,所以我们要想办法在变回去,举个例子,假设原来的数据服从均值为4,方差为5的正太分布,我们将其强行变成均值为0,方差为0的分布,这样也许会有问题,所以我们再变回去,这个变回去不是仅仅变回原来的分布,而是进行学习,对原来的分布进行类修正,学习出更符合条件爱的参数(仅仅是我的直观理解,也许有问题)

我们可以看到,第一步的变换将输入数据限制到了一个全局统一的确定范围(均值为 0、方差为 1)。下层神经元可能很努力地在学习,但不论其如何变化,其输出的结果在交给上层神经元进行处理之前,将被粗暴地重新调整到这一固定范围。

除了充分利用底层学习的能力,另一方面的重要意义在于保证获得非线性的表达能力。Sigmoid 等激活函数在神经网络中有着重要作用,通过区分饱和区和非饱和区,使得神经网络的数据变换具有了非线性计算能力。而第一步的规范化会将几乎所有数据映射到激活函数的非饱和区(线性区),仅利用到了线性变化能力,从而降低了神经网络的表达能力。而进行再变换,则可以将数据从线性区变换到非线性区,恢复模型的表达能力。
那么问题又来了—经过这么的变回来再变过去,会不会跟没变一样?

不会。因为,再变换引入的两个新参数 g 和 b,可以表示旧参数作为输入的同一族函数,但是新参数有不同的学习动态。在旧参数中, \bold{x} 的均值取决于下层神经网络的复杂关联;但在新参数中, y = g ⋅ x ^ + b \bold{y}=\bold{g}\cdot \bold{\hat{x}} + \bold{b} y=gx^+b 仅由 b \bold{b} b 来确定,去除了与下层计算的密切耦合。新参数很容易通过梯度下降来学习,简化了神经网络的训练。
那么还有一个问题——这样的 Normalization 离标准的白化还有多远?
标准白化操作的目的是“独立同分布”。独立就不说了,暂不考虑。变换为均值为 b \bold{b} b、方差为 g 2 \bold{g}^2 g2的分布,也并不是严格的同分布,只是映射到了一个确定的区间范围而已。(所以,这个坑还有得研究呢!)

开始的时候十分不理解这里的gama和beta是如何学习得到的,感觉只有输入没有标签,无法学习。其实这么想就好了,BN层也是一个网络层,就如同全连接层output=W*input,gama和beta和权重W一样,都是最后的输出y_true和label之间的误差进行反向传播,一层一层的更新W和gama,beta
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值