Batch Normalization

吴恩达:Batch Normalization

简介

我们常常会对输入进行归一化(normalization 而不是 被用来防止过拟合的正规化 regularization),那么试想如果对每一层神经网络都进行归一化,结果也许会有进一步提升,这就是Batch Normalization。
那么这样又会遇到一个问题,是对每一个未激活单元z^l应用还是对激活后单元 a^l运用,没有理论性的指导,只是默认一般对z^l进行。

计算式子:

对于某一层未激活值(忽略层信息):
z^{(1)},z^{(2)},z^{(3)},z^{(4)}...
\mu = \sum_{i=1}^{m}z^{(i)}
\sigma^2 = \frac1m\sum_{i=1}^{m}(z^{(i)}-\mu)^2
z^{(i)}_{norm} = \frac{z^(i) - \mu}{\sqrt{\sigma^2 + \epsilon}}
到这里,就将未激活隐藏层正规化为均值为0,方差为1的分布。不过有时候其他分布也有存在的意义,所以将z^{(i)}_{norm}进行如下处理
\tilde{z}^{(i)} = \gamma z^{(i)}_{norm} + \beta
其中\gamma\beta 是可学习参数,使得该隐藏层分布可以是其他分布。
注意:

  1. \gamma = \sqrt{\sigma^2 + \epsilon}\beta = \mu时,\tilde{z}^{(i)} = z^{(i)},在运用sigmoid激活函数时,若分布为N~(0,1),则会无法发挥激活函数的非线性功能。
  2. 在运用batch normalization时, bias其实是无效的,因为无路bias是多少都会被算到均值中,然后被减去,所以运用batch normalization时可以舍弃bias,或者干脆设置为0。而后面的可学习参数\gamma实际上承担了bias的角色。

具体实现

scale = tf.Variable(tf.ones([out_size]))
shift = tf.Variable(tf.zeros([out_size]))
            

从上面可以看出,\gamma\beta并不是每一层的单一可学习值,参数数量等于下一层神经元数量。

Batch Normalization有效的深层次原因

当训练一个深层次网络时,归一化可以让每一层在学习过程中,波动都比较小(甚至可以强制让上层分布为N~(0,1)),如果低层学习过程中如果改变太大,会导致高层也必须作出相应的改变,因此很难收敛。所以Batch normalization某种程度上可以制约层之间相互影响的关系,让层与层相对独立。进而达到独立学习,加快收敛的目的。
此外,Batch normalization 的scale可能是0,某种程度和dropout一样引入了噪声。
但是正规化只是batch normalization过程中带来的副作用,最好别把它当成有效的正规化措施,而可以和dropout一起运用。

Test过程

Batch normalization测试过程中可能不存在minibatch,那么均值和方差怎么计算呢?最直接的方法是直接对训练集所有数据计算均值和方差,但是在实际运用中,往往对训练过程中的每个mini batch进行指数平均。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容