为什么我们要进行标准化?
具有统一规格的数据更方便神经网络学习到数据的规律。
举个非常简单的例子。假设我们的激活函数是f(x)=tanh,输入数据x从-10到10。如下图所示:
加上标准化工序后,x被调整到[-1,1],那么with和without标准化工序的数据输入之后,输出响应分布也大不相同:
没有normalize的数据,使用 tanh 激活以后, 激活值大部分都分布到了饱和阶段, 也就是大部分的激活值不是-1, 就是1。而normalize 以后, 大部分的激活值在每个分布区间都还有存在。再将这个激活后的分布传递到下一层神经网络进行后续计算, 每个区间都有分布的这一种对于神经网络就会更加有价值。
BN算法:
Batch Normalization 的公式,这三步就是我们在刚刚一直说的 normalization 工序。 但是公式的后面还有一个反向操作:normalize 后的数据再扩展和平移!神经网络能够自己去学着使用和修改这个扩展参数 gamma, 和平移参数 β, 慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 就使用 gamma 和 belt 来抵消一些 normalization 的操作。
TensorFlow实现Batch Normalization 实例
假设我们要拟合一批数据(实际是一元二次方程曲线),输入x的范围是[-7,10]:
假设有7层神经网络,激活函数使用ReLU。即输入小于0时输出为0,输入大于0时呈线性增长。
在有/无标准化的两种情况下,每一层神经网络的输入数据情况:
相应的输出: