Machine Learning Chinese NLP :::: Gradient Descent Feature Scaling - Chad Salinas ::: Data Scientist
Life and times of Chad Salinas
Chad Salinas, golf caddy, data scientist, chad rPubs, recovering chess addict, daddy caddy
1202
post-template-default,single,single-post,postid-1202,single-format-standard,qode-listing-1.0.1,qode-social-login-1.0,qode-news-1.0,qode-quick-links-1.0,qode-restaurant-1.0,ajax_fade,page_not_loaded,,qode-title-hidden,qode_grid_1300,qode-theme-ver-12.0.1,qode-theme-bridge,bridge,wpb-js-composer js-comp-ver-5.4.2,vc_responsive

Machine Learning Chinese NLP :::: Gradient Descent Feature Scaling

Gradient Descent Feature Scaling

 
在这段视频 
以及下一段视频中 
我想告诉你一些关于 
梯度下降运算中的实用技巧 
在这段视频中 我会告诉你一个称为特征缩放 (feature scaling) 的方法

我们用一个 for 循环 
如果你有一个机器学习问题 
这个问题有多个特征 
如果你能确保这些特征 
都处在一个相近的范围 
我的意思是确保 
不同特征的取值 
在相近的范围内

这样梯度下降法就能更快地收敛

具体地说 
假如你有一个具有两个特征的问题 
其中 x1 是房屋面积大小 
它的取值 
在0到2000之间 
x2 是卧室的数量 
可能这个值 
取值范围在1到5之间 
如果你画出代价函数 
J(θ) 的轮廓图

那么这个轮廓看起来 
应该是像这样的 
J(θ) 是一个关于 
参数 θ0 θ1 和 θ2 的函数 
但我要忽略 θ0 
所以暂时不考虑 θ0 
并假想一个函数的变量 
只有 θ1 和 θ2 
但如果 x1 的取值范围 
远远大于 x2 的取值范围的话 
那么最终画出来的 
代价函数 J(θ) 的轮廓图 
就会呈现出这样一种

非常偏斜 
并且椭圆的形状 
2000 和 5的比例 
会让这个椭圆更加瘦长 
所以 这是一个又瘦又高的 
椭圆形轮廓图 
就是这些非常高大细长的椭圆形 
构成了代价函数 J(θ)

而如果你用这个代价函数 
来运行梯度下降的话 
你要得到梯度值 最终可能 
需要花很长一段时间 
并且可能会来回波动 
然后会经过很长时间 
最终才收敛到全局最小值

事实上 你可以想像 如果这些 
轮廓再被放大一些的话 
如果你画的再夸张一些 
把它画的更细更长

那么可能情况会更糟糕 
梯度下降的过程 
可能更加缓慢 
需要花更长的时间 
反复来回振荡 
最终才找到一条正确通往全局最小值的路

在这样的情况下 
一种有效的方法是进行特征缩放(feature scaling)

具体来说 
把特征 x 定义为 
房子的面积大小 
除以2000的话 
并且把 x2 定义为 
卧室的数量除以5 
那么这样的话 
表示代价函数 J(θ) 
的轮廓图的形状

就会变得偏移没那么严重 
可能看起来更圆一些了

如果你用这样的代价函数 
来执行梯度下降的话 
那么 梯度下降算法

你可以从数学上来证明 
梯度下降算法 就会找到一条 
更捷径的路径通向全局最小 
而不是像刚才那样 
沿着一条让人摸不着头脑的路径 
一条复杂得多的轨迹 
来找到全局最小值

因此 通过特征缩放 
通过”消耗掉”这些值的范围 
在这个例子中 
我们最终得到的两个特征 
x1 和 x2 都在0和1之间

这样你得到的梯度下降算法 
就会更快地收敛

更一般地 
我们执行特征缩放时 也就是我们经常 
我们通常的目的是 
将特征的取值约束到 
-1 到 +1 的范围内 
你的特征 x0 是总是等于1 
因此 这已经是在这个范围内

但对其他的特征 
你可能需要通过除以不同的数 
来让它们处于同一范围内 
-1 和 +1 这两个数字并不是太重要 
所以 如果你有一个特征

x1 它的取值 
在0和3之间 这没问题 
如果你有另外一个特征 
取值在-2 到 +0.5之间 
这也没什么关系 
这也非常接近 
-1 到 +1的范围 
这些都可以

但如果你有另一个特征 
比如叫 x3 
假如它的范围

在 -100 到 +100之间 
那么 这个范围 
跟-1到+1就有很大不同了 
所以 这可能是一个 
不那么好的特征 
类似地 如果你的特征在一个 
非常非常小的范围内 
比如另外一个特征 
x4 它的范围在 
0.0001和+0.0001之间 那么

这同样是一个 
比-1到+1小得多的范围 
比-1到+1小得多的范围 
因此 我同样会认为这个特征也不太好

所以 可能你认可的范围 
也许可以大于 
或者小于 -1 到 +1 
但是也别太大 
只要大得不多就可以接受 
比如 +100 
或者也别太小 比如这里的0.001 
不同的人有不同的经验 
但是我一般是这么考虑的 
如果一个特征是在 
-3 到 +3 的范围内 
那么你应该认为 
这个范围是可以接受的 
但如果这个范围 
大于了 -3 到 +3 的范围 
我可能就要开始注意了 
如果它的取值 
在-1/3 到+1/3的话

我觉得 还不错 可以接受 
或者是0到1/3 或-1/3到0 
这些典型的范围 我都认为是可以接受的 
但如果特征的范围 
取得很小的话 
比如像这里的 x4 你就要开始考虑进行特征缩放了 
因此 总的来说 
不用过于担心 
你的特征是否在完全 
相同的范围或区间内 
但是只要他们都 
只要它们足够接近的话 梯度下降法就会正常地工作 
除了在特征缩放中 
将特征除以最大值以外 
有时候我们也会进行一个 
称为均值归一化的工作(mean normalization) 
我的意思是这样的 
如果你有一个特征 xi 
你就用 xi – μi 来替换 
通过这样做 让你的特征值

具有为0的平均值

很明显 我们不需要 
把这一步应用到 
x0中 
因为 x0 总是等于1的 
所以它不可能有 
为0的的平均值

但是 
对其他的特征来说 
比如房子的大小 
取值介于0到2000 
并且假如 
房子面积 
的平均值 
是等于1000的

那么你可以用这个公式

将 x1 的值变为 
x1 减去平均值 μ1 
再除以2000 
类似地 
如果你的房子有 
五间卧室

并且平均一套房子有 
两间卧室 那么你可以 
使用这个公式 
来归一化你的第二个特征 x2

在这两种情况下 
你可以算出新的特征 x1 和 x2 
这样它们的范围 
可以在-0.5和+0.5之间 
当然这肯定不对 
x2的值实际上肯定会大于0.5 但很接近 
更一般的规律是 
你可以用这样的公式 
你可以用 (x1 – μ1)/S1

来替换原来的特征 x1 
其中定义 
μ1的意思是 
在训练集中

特征 x1 的平均值

而 S1 是 
该特征值的范围 
我说的范围是指 
最大值减去最小值 
最大值减去最小值 
或者学过 
标准差的同学可以记住 
也可以把 S1 设为 
变量的标准差 
但其实用最大值减最小值就可以了

类似地 对于第二个 
特征 x2 
你也可以用同样的这个

特征减去平均值 
再除以范围 来替换原特征 
范围的意思依然是最大值减最小值 
这类公式将 
把你的特征 
变成这样的范围 
也许不是完全这样 
但大概是这样的范围 
顺便提一下 
有些同学可能比较仔细 
如果我们用最大值减最小值 
来表示范围的话 这里的5有可能应该是4 
如果最大值为5 
那么减去最小值1 
这个范围值就是4 
但不管咋说 这些取值 
都是非常近似的 
只要将特征转换为 
相近似的范围 就都是可以的 
特征缩放其实 
并不需要太精确 
只是为了让梯度下降 
能够运行得更快一点而已

好的 现在你知道了 
什么是特征缩放 
通过使用这个简单的方法 
你可以将梯度下降的速度变得更快 
让梯度下降收敛所需的循环次数更少

这就是特征缩放 
在接下来的视频中 
我将介绍另一种技巧来使梯度下降 
在实践中工作地更好 

Any programming problem can be solved by adding a level of indirection.

– David J. Wheeler

No Comments

Sorry, the comment form is closed at this time.