训练神经网络--批量归一化

目录

1.前言

2.BN概述

2.1数据预处理

2.2算法实现

2.3源码实现

3.归一化作用


1.前言

我们知道在神经网络训练开始前,都要对输入数据做一个归一化处理,那么具体为什么需要归一化呢?归一化后有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
 

2.BN概述

就像激活函数层、卷积层、全连接层、池化层一样,BN(Batch Normalization)也属于网络的一层。每一层网络参数更新后,数据分布都可能不一样,为了方便训练,提高网络结构的稳定性,泛化性,我们在数据输入每一次网络前,将它调整为N(0,1)分布

2.1数据预处理

神经网络输入数据预处理,最好的算法莫过于白化预处理,然而白化运算量很大,而且白化不是处处可微的,所以深度学习用的不是很多,但是它确实可以降低特征相关度以及让数据服从N(.,1)分布,核心公式为:

 E[x(k)]为所有数据均值,Var[x(k)]为标准差

2.2算法实现

在网络层中使用预处理的公式进行处理的话,会破话原本网络训练出来的数据特征分布,于是引入了可学习参数γ、β

可以理解为:

  

 可以恢复出原始的某一层所学到的特征的

 具体实现方式就是

 可以直接理解为,神经网络中的γ、β已经记录了数据的均值,方差,然后我们将他们归一化后,再加上他的均值,乘以它的方差,那么数据还是以前一样 的分布,只是说数据的特征相关性等被处理了。

2.3源码实现


m = K.mean(X, axis=-1, keepdims=True)#计算均值
std = K.std(X, axis=-1, keepdims=True)#计算标准差
X_normed = (X - m) / (std + self.epsilon)#归一化
out = self.gamma * X_normed + self.beta#重构变换
 

3.归一化作用

 BN的作用:

       1)改善流经网络的梯度

       2)允许更大的学习率,大幅提高训练速度:

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

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

       4)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求

            你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项了参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

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

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

       注:以上为学习过程,在测试时,均值和方差(mean/std)不基于小批量进行计算, 可取训练过程中的激活值的均值。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值