在训练神经网络的时候,normalization是必不可少的,原因是如果不进行normalization,在更新参数的时候会出现zig zag的现象。
$$\frac{X-\bar{X}}{std(X)}$$$$\hat{y} = sigmoid(W \cdot X+b)$$$$L = Loss(y, \hat{y})$$$$\frac{\partial{L}}{\partial{W}} = \frac{\partial{L}}{\partial{\hat{y}}}\frac{\partial{\hat{y}}}{\partial{Z}}\frac{\partial{Z}}{\partial{W}} = \frac{\partial{L}}{\partial{\hat{y}}}\frac{\partial{\hat{y}}}{\partial{Z}}X^T$$$$W := W - \alpha \frac{\partial{L}}{\partial{W}}$$W就会一直减小,这显然是有问题的。 图2 右图展示了只有两个方向允许更新梯度后实际的参数更新路线(红线) 图片来源于cs231n 如图2所示,可以发现如果我们的输入变成了要么都是大于0,要么都是小于0的数,那么允许梯度更新的两个方向在二维空间中就只能落在第一和第三象限中,扩展到高维空间中也是相对的两个卦限。这样在更新的过程中就会产生这种红线所示的路径zig zag path。以上是不进行中心化的后果。 而不进行特征缩放的后果则是,如果每个特征的量级不同,假设一个特征是数值范围在$[-10, 10]$,另一个特征在$[-10^9, 10^9]$,那么在计算梯度后,使用梯度下降更新时,也会造成上面所述的zig zag现象。