李沐pytorch学习-BatchNormalization

一、意义

        在使用较深的网络时,BatchNormalization(批量归一化)几乎是必需的,可以加速收敛。

         对于图1所示的全连接层神经网络,输出节点O_0的GroundTruth为R_0,损失函数为L\left(x\right),则损失对权重w_1的梯度为:

        \frac{\partial L\left ( R_0-O_0 \right)}{\partial w_1}=\frac{\partial L\left ( R_0-O_0 \right)}{\partial O_0}\cdot \frac{\partial O_0}{\partial w_1}

更新权重w_0的梯度为:

        \frac{\partial L\left ( R_0-O_0 \right)}{\partial w_0}=\frac{\partial L\left ( R_0-O_0 \right)}{\partial O_0}\cdot \frac{\partial O_0}{\partial H_0}\cdot\frac{\partial H_0}{\partial w_0}

李沐pytorch学习-BatchNormalization_第1张图片 图1. 网络结构

如果该网络有5个隐含层,那么更新底层权重w_0的梯度为:

        \frac{\partial L\left ( R_0-O_0 \right)}{\partial w_0}=\frac{\partial L\left ( R_0-O_0 \right)}{\partial O_0}\cdot \frac{\partial O_0}{\partial H_4}\cdot\frac{\partial H_4}{\partial H_3}\cdot\frac{\partial H_3}{\partial H_2}\cdot\frac{\partial H_2}{\partial H_1}\cdot\frac{\partial H_1}{\partial H_0}\cdot\frac{\partial H_0}{\partial w_0}

        从上面的推导可知,如果网络非常深,那么更新底层权重的梯度后面会乘很多偏导数,而偏导数一般比较小,小于1,所以网络底层的梯度会非常小,从而权重更新很慢,造成底层训练速度慢。

        而底层权重一旦改变,顶层权重也需要跟着改变,因此造成收敛变慢,网络训练速度慢。

         解决这个问题的思路为在学习网络底层时避免变化网络平顶层

 二、定义

        计算主要涉及如下公式:

{x_i}'=\gamma \frac{x_i-\mu}{\sigma}+\beta                         \gamma ,\beta 为可学习的参数,对应新的方差和均值。

        其中:

李沐pytorch学习-BatchNormalization_第2张图片\epsilon 是一个很小的数,用于防止分母为零

三、用法

可用位置:

# 全连接层和卷积层的输出上,激活函数前

# 全连接层和卷积层的输入上

对于全连接层,作用在特征维,即B=\left \{ x_1,x_2,...,x_N\right\}

李沐pytorch学习-BatchNormalization_第3张图片

对于卷积层,作用在通道维

四、总结

# 最好不要与DropOut组合使用

# 可以加速收敛,一般不会增加正确率

你可能感兴趣的:(深度学习,pytorch,深度学习)