您的位置:首页 > 其它

5.2 梯度下降算法实用技巧(特征缩放)

2018-01-16 10:54 183 查看
5.2 梯度下降算法中的实用技巧一(特征缩放)
    这里我们将会介绍一个称为特征缩放 (feature scaling) 的方法。如果我们有一个问题,这个问题有许多的特征,如果你能确保不同的特征都处在相近的范围,我的意思是不同特征的取值处在相近的范围内,这样梯度下降算法就能更快的收敛,具体的说,如果你有一个具有两个特征的问题,x1是房子的面积大小,取值范围在0-2000平方英尺,x2是卧室的数量,取值范围是1-5,如果你画出代价函数J(θ)的轮廓图。注意,J(θ)是关于θ0、θ1、θ2的函数,但是我们暂时不考虑θ0,但是如果x1的取值范围远大于x2的取值范围,那么画出来的轮廓图就会呈现如下所示的一种形式,会使椭圆更加的瘦长,会是一个又瘦又高的轮廓图,如果你使用这个代价函数来运行梯度下降的话,需要花很长的一段时间,并且可能来回波动,才能收敛到最小值,在这种情况下一种有效的方法就是特征缩放。



    具体的说(如上图右边是所示),就是将特征x1定义为房子的面积除以2000,将特征x2定义为卧室的数量除以5,那么J(θ)的轮廓图就会变得更加的圆一些,如果使用这样的代价函数来执行梯度下降算法的话,可以从数学上证明,梯度下降算法能够找到一条更捷径的路径,来找到全局最小值点。在这个例子中特征值的范围都在0到1之间,这样你得到的梯度下降算法将能更快的收敛。
    更通常的说,当我们执行特征缩放的时候,我们通常的目的是将特征值约束到-1到+1的范围内,特征x0总是等于1,已经在这个范围内了,但是对于其他特征你可能需要通过除以某个数让他们处于同一个范围内。x1它的取值在0和3之间,这没问题,如果你有另外一个特征取值在-2到+0.5之间,这也没什么关系,这也非常接近 -1
到 +1的范围,这些都可以 。如果你有一个特征,在 -100 到 +100之间,那么这个范围跟-1到+1就有很大不同了,所以,这可能是一个不那么好的特征,类似地,如果你的特征在一个非常非常小的范围内,比如另外一个特征 x4它的范围在 0.0001和+0.0001之间,那么这同样是一个 比-1到+1小得多的范围比-1到+1小得多的范围,因此,我同样会认为这个特征也不太好。
    你可能认可的范围,可以大于+1也可以小于-1,但是也别太大或者太小,只要不是大的太多就可以接受,不同的人有不同的经验,但是Ng认为如果特征范围在-3到+3之间,你可以认为它是可以接受的,-1/3到+1/3也是可以接受的。
    除了将特征值除以最大值外, 有时候也会进行一个称为均值归一化(mean normalization)的工作,意思是如果你有一个特征x(i),你就用x(i)- u(i)来替换(u表示特征的平均值),这样做,让你的特征值具有为0的平均值,当然这不能应用到x0,因为x0总是拥有为1的特征值,它的均值不可能为0。比如房子的大小,取值介于0-2000之间,如果你知道均值是1000,那么你可以使用x1减去平均值1000,然后除以2000,类似的,对于卧室的多少,假设你知道每间房子的卧室数量的平均值是2,也可以采用类似的方法;在这两种情况下,你可以计算出,特征值的范围在-0.5到+0.5之间。
    更一般的公式是,你可以使用如图中所示的公式(x1 – u1)/ s1 替换x1,其中u1是特征x1的均值,s1是特征x1的范围(最大值减去最小值)特征缩放并不需要特别的精确,只是让梯度下降收敛的更快一点。



    特征归一化,理解下面这张图就够了:(其中si是标准差,在课程中是哟干的是范围,即最大值减去最小值,在编程练习中使用的是标准差)



总结,这里介绍了特征缩放的两种方法,除以最大值和均值归一化,他们都能够加快梯度下降算法收敛的速度,这是因为θ在小范围的范围下,减小的更加快速。通常将特征缩放之后,将他们的范围保持在-1到+1或者-0.5到+0.5之内,这并不是一个精确的要求,只要大概在这个范围之内就可以了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息