吴恩达:Batch Normalization
简介
我们常常会对输入进行归一化(normalization 而不是 被用来防止过拟合的正规化 regularization),那么试想如果对每一层神经网络都进行归一化,结果也许会有进一步提升,这就是Batch Normalization。
那么这样又会遇到一个问题,是对每一个未激活单元应用还是对激活后单元 运用,没有理论性的指导,只是默认一般对进行。
计算式子:
对于某一层未激活值(忽略层信息):
到这里,就将未激活隐藏层正规化为均值为0,方差为1的分布。不过有时候其他分布也有存在的意义,所以将进行如下处理
其中 和 是可学习参数,使得该隐藏层分布可以是其他分布。
注意:
- 当且时,,在运用sigmoid激活函数时,若分布为N~(0,1),则会无法发挥激活函数的非线性功能。
- 在运用batch normalization时, bias其实是无效的,因为无路bias是多少都会被算到均值中,然后被减去,所以运用batch normalization时可以舍弃bias,或者干脆设置为0。而后面的可学习参数\gamma实际上承担了bias的角色。
具体实现
scale = tf.Variable(tf.ones([out_size]))
shift = tf.Variable(tf.zeros([out_size]))
从上面可以看出,和并不是每一层的单一可学习值,参数数量等于下一层神经元数量。
Batch Normalization有效的深层次原因
当训练一个深层次网络时,归一化可以让每一层在学习过程中,波动都比较小(甚至可以强制让上层分布为N~(0,1)),如果低层学习过程中如果改变太大,会导致高层也必须作出相应的改变,因此很难收敛。所以Batch normalization某种程度上可以制约层之间相互影响的关系,让层与层相对独立。进而达到独立学习,加快收敛的目的。
此外,Batch normalization 的scale可能是0,某种程度和dropout一样引入了噪声。
但是正规化只是batch normalization过程中带来的副作用,最好别把它当成有效的正规化措施,而可以和dropout一起运用。
Test过程
Batch normalization测试过程中可能不存在minibatch,那么均值和方差怎么计算呢?最直接的方法是直接对训练集所有数据计算均值和方差,但是在实际运用中,往往对训练过程中的每个mini batch进行指数平均。