归一化输入
在训练神经网络中,一个加速训练的方法就是标准化输入,标准化输入总共需要两个步骤:
- 零均值化,过程如下:
μ = 1 m ∑ i = 1 m x ( i ) \mu = \frac{1}{m}\sum_{i=1}{m}x^{(i)} μ=m1i=1∑mx(i)
x = x − μ x=x-\mu x=x−μ
此时样本的均值为0。 - 归一化方差,公式如下
σ 2 = 1 m ∑ i = 1 m x ( i ) ∗ ∗ 2 \sigma ^ {2} = \frac{1}{m}\sum_{i=1}{m}x^{(i)}**2 σ2=m1i=1∑mx(i)∗∗2
x / = σ x/=\sigma x/=σ
假设当前样本为二位的输入,如下图:
样本经过零均值化后,样本在两个坐标轴的均值都为0,变为下图所示:
再经过归一化方差后,样本的两个维度的方差都变为了1,两个特征的离散程度相同,变为如下所示:
为什么进行标准化输入
对于代价函数J来说,如果使用非标准化的数据,代价函数如下所示:
平面图如下:
而使用标准化的数据,代价函数如下:
平面图如下:
很明显,在标准化的代价函数上运行梯度下降会比非标准化数据的代价函数上简单,快速,因为标准的无论初始点在哪里,都能很快的找到代价函数最小值,而非标准的在不同起始点学习速率可能需要设置不同值。
何时使用
在输入特征范围相近时,比如x1取值[0, 1],x2区值[-1,1],此时不使用标准化同样表现得很好。而对于x1取值[0, 1],x2区值[1,1000],使用标准化能加速神经网络训练。通常无论数据特征取值范围是否相似,都可以直接做一个标准化,不一定要有用,但是肯定不会有坏处。