如何训练神经网络——批归一化batch normalization

如果不出意外的话,小姐姐今天也将跟过去的12天一样,在退烧药和眼药水的陪伴中昏昏睡去,直到看到了这段话:

于是身为中年妇女的小姐姐以击败了病毒的昂扬斗志矫健地翻身下床,决定打开电脑,回归到工友中间来,做好我的本职工作——一本正经地更新技术水平很low的公号。

最近状态着实不佳,加上准备开始写论文了,可能要跟各位工友告个假,将来的一段时间里可能会花更少的精力来更新笔记——但是有收获依然会来更新,保持质量,降低频率吧

好到这里可以扫一眼标题进入正题——Batch Normalization

批归一化(BN)是在实际操作中经验证明非常有效的一种数据处理手段,它能改进整个网络梯度流的精神面貌(不会没事就饱和,然后就挂掉),同时也使得整个网络的鲁棒性更强——能够容忍更高的学习率、并同时降低对精确初始化的依赖性,从而使得整个网络更容易训练,另外,它还自带一点类似正则化的功能,使得使用dropout的需求也相应减少。

那么它是怎么做到这一切的呢?先上公式:

减去均值,再除以方差,有没有觉得很眼熟?像不像一个以原点为中心的高斯分布?

这么棒,那是要好好看看具体是怎么操作的。

批归一化,顾名思义,就是要一批一批地归一化(好会解释的小姐姐)。由于输入数据量太庞大,在输入端就要分成一批一批地送进网络,这个批就叫batch。假设一批的输入数据量为N,维度为D,那么上面那个公式中的均值和方差都是基于每个维度D而独立计算的经验均值和经验方差,所以批归一化不仅仅是在所有的训练样本上做归一化,在每一层做归一化,更是在其每一个维度(也就是每一维的特征)上做归一化。算出来的均值和方差为常数,所以上面那个公式呢,就是一个可微分方程(differentiable function),将其微分以后再像往常一样做反向传播就可以了(其实就是求得出导数的意思)。

那么在整个网络结构中,BN通常什么时候出场呢?

通常在全连接层或者卷积层之后,在非线性激活函数之前。

此外,在现实生活中,在上述操作之外,还引入两个参数:

这两个参数也是训练自学而得的,理想情况下如果:

那么就能还原出初始的输入映射,就好像完全没有做过BN一样。。。

小姐姐到了这里就会思索一下这么做有什么意义呢。。。听说是为了提高BN的灵活性这样你有时候不想完全避免梯度饱和的时候,还可以通过控制这两项参数,从而控制你想要的梯度流的精神面貌。。。听起来好牛鬼的样子。

ANYWAY,一个标准的卷积神经网络做BN的流程如下:

没记错的话YOLO也是这么做哒(有兴趣从公众号菜单里面找YOLO这个算法的详解,小姐姐为此写了12篇)。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180107G0PP2Z00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区