转自:https://blog.csdn.net/weixin_42555985/article/details/106278473
1.9 归一化输入 Normalizing inputs
训练NN,其中一个加速训练的方法就是归一化输入。
如上图,数据集的散点图。
假设一个训练集有两个特征,输入特征为2维,归一化需要两个步骤:
- step1:零均值
μ = 1 m ∑ i = 1 m x ( i ) \mu =\frac 1m\sum_{i=1}^mx^{(i)}μ=m1i=1∑mx(i)
向量X等于每个训练数据 x 减去μ \muμ,即X := x-μ
,意思是移动训练集,直到它完成零均值化。如下图。
- step2:归一化方差
注意:上图中特征x 1 x_1x1的方差比特征x 2 x_2x2的方差要大得多
我们要做的是给σ \sigmaσ赋值。
σ 2 = 1 m ∑ i = 1 m ( x ( i ) ) 2 \sigma^2=\frac 1m\sum_{i=1}^m(x^{(i)})^2σ2=m1i=1∑m(x(i))2
这是元素y yy的平方。σ 2 \sigma^2σ2是一个向量,它的每个特征都有方差。
到此,我们已经完成零值均化,( x ( i ) ) 2 (x^{(i)})^2(x(i))2或者说元素y 2 y^2y2就是方差。我们把向量X所有数据除以向量σ 2 \sigma^2σ2,即X /=σ**2
,最后变成下图形式。
此时x 1 x_1x1和x 2 x_2x2的方差都等于1,如下图。
提示一下,如果你用它来调整训练数据,那么也用相同的μ \muμ和σ 2 \sigma^2σ2来归一化测试集。尤其是,你不希望训练集和测试集的归一化有所不同。所以你要用同样的方法调整测试集,而不是在训练集和测试集上分别预估μ \muμ和σ 2 \sigma^2σ2。
训练数据和测试数据都是通过相同μ \muμ和σ 2 \sigma^2σ2定义的相同数据转换,其中μ \muμ和σ 2 \sigma^2σ2是由训练集数据计算得来的。
为什么我们想要归一化输入特征?
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w,b)=\frac 1m\sum_{i=1}^mL(\hat y^{(i)},y^{(i)})J(w,b)=m1i=1∑mL(y^(i),y(i))
上面是代价函数J公式。
我们来对比一下非归一化和归一化代价函数有什么不同。
- 非归一化的输入特征
如果你使用非归一化的输入特征,代价函数会像这样
这是一个非常细长狭窄的代价函数,最小值应该在原点。
但如果特征值在不同范围,假如x 1 x_1x1取值范围从1到1000,特征x 2 x_2x2的取值范围从0到1,结果是参数w 1 w_1w1和w 2 w_2w2值的范围或比率将会非常不同。
上图数据轴应该是w 1 w_1w1和w 2 w_2w2,但为了便于直观理解,图中标记为w和b。代价函数就有点像狭长的碗一样,如果你能画出该函数的部分轮廓,它会是这样一个狭长的函数,如下图。
如果你在上图这样的代价函数上运行梯度下降法,你必须使用一个非常小的学习率。
如上图,梯度下降法可能从图中左下方开始,需要多次迭代过程,直到最后找到最小值。
- 归一化特征
然而如果你归一化特征,代价函数平均起来看更对称。
此时代价函数是一个更圆的球形轮廓。如上图,不论从哪个位置开始,梯度下降法都能够更直接地找到最小值,你可以在梯度下降法中使用较大步长,而不需要像在非归一化狭长图中那样反复执行。
当然,实际上w是一个高维向量,因此用二维绘制并不能正确地传达并直观理解。但总得来说,代价函数更圆一些,就更容易优化。前提是特征都在相似范围内,而不是一个特征从1到1000,另外特征从0到1的范围,而是特征都在-1到1范围内或相似偏差,这使得代价函数优化起来更简单快速。
实际上如果假设特征x 1 x_1x1范围在0-1之间,x 2 x_2x2的范围在-1到1之间,x 3 x_3x3范围在1-2之间,它们是相似范围,所以算法运行会表现得很好。
当它们在非常不同的取值范围内,如其中一个从1到1000,另一个从0到1,这对优化算法非常不利。但是仅将它们设置为均化零值,假设方差为1,确保所有特征都在相似范围内,通常可以帮助学习算法运行得更快。
所以如果输入特征处于不同范围内,可能有些特征值从0到1,有些从1到1000,那么归一化特征值就非常重要了。如果特征值处于相似范围内,那么归一化就不是很重要了。执行这类归一化并不会产生什么危害,我通常会做归一化处理,虽然我不确定它能否提高训练或算法速度。
总结
- 输入特征处于相似范围内,不一定要归一化。
- 输入特征处于不同范围内,一定要归一化。
执行这类归一化并不会产生什么危害,所以别管范围,都做吧。