批归一化
- 内部协变量偏移
内部协变量偏移ICS指的是深度神经网络在训练时,随着参数的不断更新,中间隐藏层的输入分布发生较大差异,导致网络需要不断的适应新的数据分布,进而增加了学习难度。[传统解决方案:较小的学习率、合适的初始化参数] - 梯度饱和
sigmoid激活函数和tanh激活函数在输入值过大或者过小的情况下,会出现梯度值非常接近于0的情况,使得网络的收敛速度减慢。[传统解决方案:使用不存在梯度饱和区域的激活函数]。BN可以有效缓解梯度饱和的情况,它的策略是将输入值归一化到梯度较大的区域,即
\]
- BN训练过程
BN基于小批量梯度下降,具体过程为: - 计算小批数据的梯度均值和方差
\[\mu_B = \frac{\Sigma_{i=1}^m x_i}{m}
\]\[\sigma^2_B = \frac{\Sigma_{i=1}^{m}(x_i-\mu_B)^2}{m}
\] - 进行归一化
\[x_i = \frac{x_i-\mu_B}{\sqrt{\sigma^2_B+\epsilon}}$$ (防止分母为0)
\]\[y_i = \gamma x_i+\beta = BN_{\gamma,\beta}(x_i)
\] - BN测试过程
训练过程的输入是小批量样本,但测试过程输入是单个样本。
测试过程中使用的均值和方差是训练过程中得到的均值及方差的平均,即\[\mu_{test} = E(\mu_B)
\]\[\sigma_{test}^2 = \frac{m-1}{m}E(\sigma_B^2)
\]但是这种方式过于耗时,在keras的实现中使用的是滑动平均的思想。
- BN的优缺点
- 优点
- 保证模型容量
- 适应激活函数(Sigmoid函数在输入接近于0的位置趋于线性,非线性表达能力会下降,可以通过\(\gamma\)及\(\beta\)进行调节;RELU函数会使一半数据无法使用,通过\(\beta\)可以调整参与的比例,防止Dead-RELU的问题)
- 缺点
- 当受限于硬件条件/在线学习,即Batch Size很小的时候,应谨慎使用BN;
- 当使用RNN等动态网络的时候,应谨慎使用BN;
- 当训练数据集和测试数据集的方差较大时,应谨慎使用BN。
- 优点
层归一化
- BN在动态网络和Batch Size较小的时候,效果不好,此时可以使用Layer Normalization。
- LN训练过程
- 计算网络层的均值与方差
\[\mu^{(l)} = \frac{\Sigma_{i=1}^{n^{(l)}}x_i^{(l)}}{n^{(l)}}
\]\[\sigma^{(l)^2} = \frac{\Sigma_{i=1}^{n^{(l)}}(x_i^{(l)}-\mu^{(l)})^2}{n^{(l)}}
\]- 进行归一化
\[x_i^{(l)} = \frac{x_i^{(l)}-\mu^{(l)}}{\sqrt{\sigma^{(l)^2}+\epsilon}}
\]- 设置可训练的缩放及偏移
\[y_i^{(l)} = \gamma x_i^{(l)}+\beta
\] - LN的优缺点
- 优点
- 适用于动态网络和Batch Size较小的情况
- 缺点
- 用于CNN时会破坏卷积学习到的特征,致使模型无法收敛
- 当BN与LN都可以使用的场景,BN的效果一般优于LN的效果,因为基于不同数据,同一特征归一化得到的数据更不容易损失信息。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:[机器学习]批归一化和层归一化 - Python技术站