深度学习--Batch_Normlization

本文探讨深度学习中的Batch Normalization(BN),解释BN是什么,如何进行反向传播,其作用,包括与权重尺度无关性。同时讨论了gamma和beta参数的作用,以及为何在激活前应用BN而非激活后。此外,还介绍了Caffe中BN层的实现细节。
摘要由CSDN通过智能技术生成

bn是什么?

神经网络激活函数前的输出进行 z-score,即减去batch均值,除以方差,然后再修正,最后再送进激活函数。

y=WTx+by^=yuδy^=γy^+βz=max(0,y^)

其中 γ β 需要学习。

bn反向传播?

bn作用有哪些?

推导一下,假设 BN(wx) 为bn后的结果,显然给 w 尺度缩放为αw,有 BN(wx)=BN(αwx) ,即bn后的结果与权重 w 的尺度(大小)无关。进一步推导,

BN(αwx)x=BN(wx)x

BN(αwx)αw=1αBN(wx)w

即较大的ww将获得较小的梯度,这意味着weight的更新更加稳健了,较大的weight更新较少,较小的weight更新较大,具有正则化的效果。
1. 可以使用较大学习率,加速收敛,解决了反向传播中的梯度弥散和爆炸问题,同时使得weight的更新更加稳健。如果不同层的输出scale不一致,需要不同的学习率,通常用只有最小的那个学习率才能保证损失函数有效下降,bn把每层的scale保持一致,那么我们就可以直接使用较高的学习率进行优化。
2. 移除或使用较低的dropout。 dropout是常用的防止overfitting的方法,而导致overfit的位置往往在数据边界处,如果初始化权重就已经落在数据内部,overfit现象就可以得到一定的缓解。论文中最后的模型分别使用10%、5%和0%的dropout训练模型,与之前的40%-50%相比,可以大大提高训练速度。
3. 降低L2权重衰减系数。 还是一样的问题,边界处的局部最优往往有几维的权重(斜率)较大,使用L2衰减可以缓解这一问题,现在用了Batch Normalization,就可以把这个值降低了,论文中降低为原来的5倍。

gamma和beta的作用

y=WTx+by^=yuδy^1=γy^+βz=max(0,y^1))

简单理解下,如果令 γ=δ β=u ,那么 y^=y^1 ,即回到z-score之前。 β 是个偏移量,如果 β=0 ,则 y1 在-1到0,和在0到1,各50%的几率,而所以relu只有一半的几率激活神经元,会导致模型更难训练(参考dropout率越大越难训练)。通过学习这个参数,来控制这个神经元的激活,更合理,这也解释了为什么可以移除或使用较低的dropout。

为什么不在激活后做bn,而在激活前做bn

貌似还存在争议,期待后续论文。

caffe中的bn实现

1) 输入归一化 x_norm = (x-u)/std, 其中u和std是个累计计算的均值和方差。
2)y=alpha×x_norm + beta,对归一化后的x进行比例缩放和位移。其中alpha和beta是通过迭代学习的。那么caffe中的bn层其实只做了第一件事。scale层做了第二件事。
3)可选参数定义在 src\caffe\proto\caffe.proto 中,共有3个:

message BatchNormParameter {
  // 如果为真,则使用保存的均值和方差,否则采用滑动平均计算新的均值和方差。
  //关于滑动平均,可以参考吴大大deep learning ai讲指数加权平均那节
  // 该参数缺省的时候,如果是测试阶段则等价为真,如果是训练阶段则等价为假。
  optional bool use_global_stats = 1;

  // 滑动平均的衰减系数,默认为0.999
  optional float moving_average_fraction = 2 [default = .999];

  // 分母附加值,防止除以方差时出现除0操作,默认为1e-5
  optional float eps = 3 [default = 1e-5];
}

主要参考了happynear大神的博客,膜拜

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值