Batch Normalization(批标准化)的原理和意义及对模型的重要影响

一、什么是Batch Normalization(批标准化)?

因为我们正常的训练神经网络,为了提高速度,当然也因为很多时候数据量很庞大没法一次性全部读入,我们会把数据分批次读入模型训练,批标准化就是针对每批数据训练后,对网络每层神经元的输出做标准化处理(将很离散的数据映射到0-1之间),这只是一个很简单的操作,但是我为啥要单独拎出来说呢,因为这个批标准化对模型的影响实在太大太大。

上周我正开开心心的搭建一个CNN模型跑图像识别,模型没问题,数据正常读取,然后…模型发散了!!!是的,不是过拟合或欠拟合,就是发散了!训练集一直不收敛,一直发散,我知道这是因为模型设计的不合理导致的,于是我反复查看神经网络层数,每层的神经元个数,卷积层,池化层,全连接层,但是都没有找到问题,于是我换了另外一个数据集,正常拟合了,,,,那是我这个数据集的问题吗???是数据集内容太少了吗?也不是啊,上万的数据量,是产生了梯度爆炸吗?也不是啊,keras里面设计会产生的初始化权重会自动规避这个问题,那是啥原因呢???

后来注意到没有加入批标准化对每层的输出做处理,莫非是这里的问题?于是在全连接层中加了批标准化处理,结果,,,顺利的拟合了,,,,模型最后输出也没有问题。What???为啥会是没有批标准化处理就导致这样的问题。

二、Batch Normalization(批标准化)对模型的影响是什么?

回忆一下,在模型读入数据的时候,我们会将数据进行标准化处理(所有数据映射到0-1),这样对模型的影响是什么呢?比如我们的模型中第一个神经元权重是0.5,如果原始数据是100,那么第一个神经元输出是0.5 x 100 = 50,将原始数据标准化为0.1,那么此时输出为0.5 x 0.1 = 0.05,50和0.05有啥区别呢?说个很直接的例子,如果我们的激活函数是sigmoid,函数方程点击这里查看常见的激活函数(Sigmoid,tanh双曲正切,ReLU修正线性单元,Leaky ReLU函数),那么50会很容易导致sigmoid的函数方程式爆炸,因为e的-50次方的原因,会让sigmoid整体输出的结果非常趋近于0(python实现的时候就已经是输出0了,,,,,),这也很好的解释了我为啥一开始numpy实现神经网络时产生的很多数据爆炸的问题,而如果是0.05就不会这样,会输出一个非常可观的数值。当然我们的神经网络隐层现在常采用的是ReLU激活函数,不会出现sigmoid所谓的数值爆炸情况,但是也恰好因为ReLU没有映射能力,会导致前面的数据量不断堆积到后面,后面的数值也会非常庞大,最后模型的输出还是使用到sigmoid进行映射输出,也会产生数值爆炸,所以最好的方式就是对每层神经元的输出做一个批标准化处理。因为每层读入的数值很大对模型的优化训练也不是好事,下降慢耗时长,而且也容易导致其他隐藏的因为数据量过大的问题。

三、keras加载使用Batch Normalization(批标准化)

keras加载使用BatchNormalization很简单,看下面代码。

from keras.layers import BatchNormalization
model.add(Dense(2, input_dim=10,#输入数据唯独10,输出唯独为2
                activation='relu'#激活函数采用ReLU
                )),
BatchNormalization()#添加批标准化处理
Dense(1,activation='sigmoid')#输出

根据上面的分析,如果隐层使用的ReLU激活函数,没有加BatchNormalization,那么最好输出层,也就是sigmoid输出层前面的一层神经元的输出最好加上,比如导致sigmoid的数值爆炸,对了如果是多分类,激活函数使用的是softmax,也要加上BatchNormalization,因为softmax和sigmoid本质一样是利用e的指数函数进行数值映射,也会容易产生数值爆炸。

希望我的分享对你的学习有所帮助,如果有问题请及时指出,谢谢~

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值