[cs231n] assignment2 Batch Nomalization部分

BN操作的主要公式如下:

$$\mu = \frac{1}{m} \sum_{1}^{m}x_i$$

$$\sigma = \sum_{i=1}^{m}(x_i-\mu)^2 $$

$$ \widehat{x} = \frac{x_i – \mu} {\sqrt{\sigma ^ 2+ \epsilon}} $$

$$ y_i = \gamma \widehat{x_i} + \beta $$

在Batch Normlization中,最为重要的两个参数就是被beta和gamma,beta。这两个参数作为控制BN层的输出的参数,控制着BN的力度。当gamma和beta取得特定值(sqrt(Var(x[k]) 和 E(x[k]))的时候,可以起到“还原该层输入”的效果。此外,在引入BN层时,原始的数据分布可能会遭到破坏,使得网络的loss增大。而我们在反向传播中可以通过调整beta和gamma的值,使得之后的“shift and scale”操作可以保持原输入的特征。

在BN的最后的部分,我们做了一个小的实验来研究BN和权重初始化的互相的影响(interaction)。第一个网络将训练一个8层的网络,它既有BN也用到了权重初始化的不同的规格。第二个网络将绘制训练准确度、验证集的准确率和训练集的误差在一个权重初始化的规模上。在这里的网络是一个非常深层的网络(有7层,然后每一层的size是50)两个网络的区别仅仅在于有没有加BN层,然后我们看看效果,如下(注意这个图的横轴是权重初始化的大小,最左边是比较小的,可以看到大概是1e-4这个级别,而最右边则是接近1):

《[cs231n] assignment2 Batch Nomalization部分》

我们可以看到在,Batch Normalizaion和裸的权重初始化上相比,验证集的准确率上前者远远吊打后者。而在训练集的准确率上,BN仍然是吊打裸权重初始化。然后在最终的训练误差上,我们也可以看到BN的loss要小的多。总结下就是带BN的网络的健壮性更好(more robust) 此外我们注意到当初始化的值较大的时候,不加BN层的模型直接爆炸了,而BN层则好端端无事。这些行为的原因是,BN层可以把每一层的输出映射到一个正规化的全年,因此激活函数避免了输出值过大或过小。

BN层的主要作用如下:

BN解决了反向传播过程中的梯度问题(梯度消失和爆炸),同时使得不同scale的 w 整体更新步调更一致。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。
* 减少坏初始化的影响;
* 加快模型的收敛速度;
* 可以用大些的学习率
* 能有效地防止过拟合。

接下来就只剩CNN层和PyTorch和TensorFlow的实现了。要加把劲。

Ref

推导BN反向传播的一篇很好的博客

讲BN的很好的一篇博客

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注