Batch Normalization原理介绍

1)Batch Normalization解决的问题

Batch Normalization(BN)主要用于解决Internal Covariate Shift。由于训练过程中,网络各层数据x分布会发生变化(偏移),这个偏移可能是受不同batch间(或者训练集和测试集)的数据本身分布不同,或者是在训练过程,由于梯度回传,导致不同batch间各层数据分布前后不一致。

这个现象会导致模型训练更为困难,而且由于某些层数据偏移如果过大,导致其经过某些激活层(sigmoid函数等)后其梯度会趋于0,从而造成梯度消失的问题。

早期解决这个问题是对输入进行归一化到N(0,1)的高斯分布(白化),在网络层较小时,通过此类对输入数据初始化操作确实能解决这类问题,但随着网络层数加大,中间层仍然会出现偏移过大的情况。

一种直观的解决思路是对每一层都进行归一化操作,但这样会破坏每层原本的表达,特别是对于某些激活函数(如sigmoid函数),归一化操作还会使得数据分布都在线性区域,而失去了非线性的表达。

2)Batch Normalization的计算方式

BN的思路是在归一化操作后,加一个还原操作,通过这种方式实现训练过程中减少数据分布变化带来的偏移。                  

上图显示了BN的计算过程,其中在训练过程中,j\in[0,1,2,...,b]表示batch内的样本标签,X^j=[x_0^j,x_1^j,x_2^j,...,x_k^j]表示batch内一条输入样本,i\in[0,1,2,...,k]表示输入样本特征的标识,其中\mu_i,\ \sigma_i表示输入样本特征i在当前batch内的均值和方差:

\mu_i=\frac{1}{b}\sum_{j=0}^bx_i^j,\ \sigma_j^2 = \frac{1}{b}\sum_{j=0}^b(x_i^j-\mu_i)^2

 其中\lambda_i,\ \beta_i表示输入样本特征i在BN层的还原操作的学习参数,其会随梯度回传时进行更新,当其值恰好等于\mu_i,\ \sigma_i时,输入经过样本后是完全还原的。

y_i^j=\lambda_i * \hat{x}_i^j + \beta_i

 在Inference过程中,没有所谓的batch内的均值和方差,此时用的是整体的均值和方差E[\mu_i],\ E[\sigma_i]

3)Batch Normalization的训练

BN的训练参数主要为\lambda_i,\ \beta_i,梯度回传的计算逻辑为:

\\ \frac{\partial L}{\partial \hat{x}^j_i}=\lambda_i\frac{\partial L}{\partial y^j_i}\\ \frac{\partial L}{\partial \mu_i}=\sum_{j=0}^b\frac{\partial L}{\partial \hat{x}^j_i}\frac{\partial \hat{x}^j_i}{\partial \mu_i} + \frac{\partial L}{\partial \sigma^2_i}\frac{\partial \sigma^2_i}{\partial \mu_i}=\sum_{j=0}^b\frac{\partial L}{\partial \hat{x}^j_i}\frac{-1}{\sqrt{\sigma^2_i}} + \frac{\partial L}{\partial \sigma^2_i}\frac{\sum_{j=0}^b-2(x_i^j-\mu_i)}{b}\\ \frac{\partial L}{\partial \sigma^2_i}=\sum_{j=0}^b\frac{\partial L}{\partial \hat{x}^j_i}\frac{\partial \hat{x}^j_i}{\partial \sigma^2_i} =\sum_{j=0}^b\frac{\partial L}{\partial \hat{x}^j_i}\frac{-(x_i^j-\mu_i)}{2\sigma^3_i}\\ \frac{\partial L}{\partial x_i^j}=\frac{\partial L}{\partial \hat{x}_i^j}\frac{\partial \hat{x}_i^j}{\partial x_i^j} + \frac{\partial L}{\partial \mu_i}\frac{\partial \mu_i}{\partial x_i^j}+ \frac{\partial L}{\partial \sigma^2_i}\frac{\partial \sigma^2_i}{\partial x_i^j}

\\ \frac{\partial L}{\partial \lambda_i} = \sum_{j=0}^b \frac{\partial L}{\partial y_i^j}\frac{\partial y_i^j}{\partial \lambda_i}=\sum_{j=0}^b \frac{\partial L}{\partial y_i^j}x_i^j\\ \frac{\partial L}{\partial \beta_i} = \sum_{j=0}^b \frac{\partial L}{\partial y_i^j}\frac{\partial y_i^j}{\partial \beta_i}=\sum_{j=0}^b \frac{\partial L}{\partial y_i^j}

4)Batch Normalization的优点

  • 减少Internal Covariate Shift:BN可以减少训练过程中各层数据分布的偏移。
  • 加速训练过程:在训练过程中,如何各层参数增大过快,会导致各层输出值偏大,在经过激活函数时,会造成梯度消失的问题。而通过BN可以避免这类问题,因此可以设置更高的学习率。另外当权重参数扩大时,BN下梯度回传不会受到影响,而且当权重参数增大时,其学习率也会相应减少,可以保存在训练过程的稳定性。
  • Regularizes Model(模型正则化):BN通过类似向样本中添加了白噪声,可以取代Dropout用于避免模型过拟合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值