Batch Normalization(BN)

优点

Batch Normalization(BN)有什么优点?BN的优点是多个并存,这里只提一个个人认为最容易理解的优点和其原因。

训练时的问题

尽管在讲解神经网络概念的时候,神经网络的输入指的是一个向量 x_i

但在实际训练中有下面的训练方式:

  • 随机梯度下降法(Stochastic Gradient Descent):用一个样本的梯度来更新权重。
  • 批量梯度下降法(Batch Gradient Descent):用多个样本梯度的平均值来更新权重

如下图所示,绿、蓝、黑的箭头表示三个样本的梯度更新网络权重后loss的下降方向。

若用多个梯度的均值来更新权重的批量梯度下降法可以用相对少的训练次数遍历完整个训练集,其次可以使更新的方向更加贴合整个训练集,避免单个噪音样本使网络更新到错误方向。


然而也正是因为平均了多个样本的梯度,许多样本对神经网络的贡献就被其他样本平均掉了,相当于在每个epoch中,训练集的样本数被缩小了。batch中每个样本的差异性越大,这种弊端就越严重。

一般的解决方法就是在每次训练完一个epoch后,将训练集中样本的顺序打乱再训练另一个epoch,不断反复。这样重新组成的batch中的样本梯度的平均值就会与上一个epoch的不同。而这显然增加了训练的时间。
同时因为没办法保证每次更新的方向都贴合整个训练集的大方向,只能使用较小的学习速率。这意味着训练过程中,一部分steps对网络最终的更新起到了促进,一部分steps对网络最终的更新造成了干扰,这样“磕磕碰碰”无数个epoch后才能达到较为满意的结果。

注:一个epoch是指训练集中的所有样本都被训练完。一个step或iteration是指神经网络的权重更新一次。

为了解决这种“不效率”的训练,BN首先是把所有的samples的统计分布标准化,降低了batch内不同样本的差异性,然后又允许batch内的各个samples有各自的统计分布。所以,


BN的优点自然也就是允许网络使用较大的学习速率进行训练,加快网络的训练速度(减少epoch次数),提升效果。

做法

设,每个batch输入是 x=[x_0,x_1,x_2,...,x_n] (其中每个 x_i 都是一个样本, n 是batch size) 假如在第一层后加入Batch normalization layer后, h_1 的计算就倍替换为下图所示的那样。


  • 矩阵 x 先经过 W_{h_1} 的线性变换后得到 s_1
    • :因为减去batch的平均值 \mu_B 后, b 的作用会被抵消掉,所以没必要加入 b(红色删除线)。
  • 将 s_1 再减去batch的平均值 \mu_B ,并除以batch的标准差 \sqrt{\sigma_B+\epsilon} 得到 s_2 。 \epsilon是为了避免除数为0的情况所使用的微小正数。
    • \mu_B=\frac {1}{m} \sum^m_{i=0}W_{h_1}x_{i,:}
    • \sigma^2_B=\frac {1}{m} \sum^m_{i=0}(W_{h_1}x_{i,:}-\mu_B)^2
    • :但 s_2 基本会被限制在正态分布下,使得网络的表达能力下降。为解决该问题,引入两个新的parameters: \gamma 和 \beta 。 \gamma 和 \beta 是在训练时网络自己学习得到的。
  • 将 s_1 乘以 \gamma 调整数值大小,再加上 \beta 增加偏移后得到 s_3 。
  • 为加入非线性能力, s_3 也会跟随着ReLU等激活函数。
  • 最终得到的 h_1 会被送到下一层作为输入。

需要注意的是,上述的计算方法用于在训练。因为测试时常会只预测一个新样本,也就是说batch size为1。若还用相同的方法计算 \mu_B , \mu_B 就会是这个新样本自身, s_1-\mu_B 就会成为0。

所以在测试时,所使用的 \mu 和 \sigma^2 是整个训练集的均值 \mu_P 和方差 \sigma^2_P 。

而整个训练集的均值\mu_P和方差 \sigma^2_P 的值通常也是在训练的同时用移动平均法来计算.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值