把所有的输入值缩放到一个大致相同的范围可以显著的加速加速。
(比如在θ1μ=0.5的时候,如果θ2的范围很大,在每次都是相同的a进行运算,那就会多计算很多没有用的θ2。如果把θ2的范围缩放,那么会快很多。至于精确性,我也还没有想明白这层关系)。
总的来说,因为θ会小取值范围内快速收敛而在大取值范围内低效率震荡而导致缓慢收敛。所以,当变量都很不一样的时候,会导致出现一个大范围而震荡缓慢收敛。因此,我们要将输入变量进行缩放,是指在一个大致相同的范围内。
理想化结果: −1 ≤ x(i) ≤ 1 或者 −0.5 ≤ x(i) ≤ 0.5
这里没有很明确的要求,就是大致缩放到同一个范围内就可以了。
特征值缩放 和 均值标准化
- 特征值缩放就是通过乘除来把输入值调到期望的范围(一般都是缩放到[-1,1])。
- 均值标准化就是通过把输入值减去平均值来把数值变小。
这两步骤之后不管多大的数值应该都会变到很小的值了。
公式 xi:=(xi−μi)/si
其中** μi 是所有特征 (i) 的均值**
si 是最大值与最小值之差(max - min), 或者标准差。
其实这种做法是在针对很大的数据集和很多参数,这时候,除非你将学习速率a调到非常小然后通过很多很多次迭代消耗非常多的时间,要不然这是最好的方法。
因为学习速率与后面的偏导部分是对每次变化之后进行偏导,也就说它虽然一开始看起来缩放了范围然后使两个本来收敛速度不一样的函数以相同速率收敛从而会导致误差,但事实上,式子里的是通过偏导来重新计算每次迭代的收敛速率,所以可能会有误差存在,但是并没有想象中的那么大。
我的问题:
Q: 缩放的计算如果本来也只有个位数,但是缩放均值话之后可能变成了小数,对于电脑计算来说,是不是更加慢了? 也就是说,在某个特定情况下(应该平常遇到的训练集的数据都是很大的吧),是不是可能会变得反而更加慢了?