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