机器学习实战 梯度上升 数学推导_机器学习实战 原理/代码:Gradient-Descent(梯度下降)...

OUTLINE:

8cac5d284171c42f1f36eab4ce444e9f.png

3746be26f359f99a00aa3720c78482a6.png

00f5cc06acf1db20ea556b5892ef4ea8.png

这个点的导数为负,如果每次加上这个导数会向左走,是梯度上升。要梯度下降,则加负号,前面乘以一个系数,控制每次移动的步长

9c37eed690b4c7c120ce6bec67e189df.png

73a4f55b16eae194d2ba527f66167561.png

8c072b997d9a3900771faae782c5c2f8.png

1608ad95aee6956534c389875de6d6ec.png

9fd40c03a59967eb0f7ef09651b41375.png

有可能找到的是:局部最优解

4d376aad94f61db026b27f24ec80e77f.png

59fe312df4fb6a76352c2edfa469864e.png

028243a79f51c4bc09238ae9f7c1676d.png

implementation:找到这个二次函数的最低点。(梯度下降法)

563464a10859d5fbc5c45d62739c8176.png

首先:loss function是啥?

很明显,就是这个二次函数,我们要让这个loss function 达到0,就说明我们找到了最小值点。

于是,每次求出迭代的点的导数值,乘以-1,表示梯度下降,然后乘以eta(学习率)

b89101dba7a9a3bea36cb340e245249e.png

93070e3f5be93dd68d164657d7f91b09.png

不妨来研究一下learning rate (eta)对梯度下降法的影响

eta=η()

这是eta=0.1的时候

b7a9cd609b85188d653110708cda82fe.png

我盲猜eta=0.5,结果非常的amazing

dc22846a921ac0e82997d14dd7c27706.png

直接给我找到了最低点,哈哈

我猜想 eta>0.5的时候,很可能无法收敛。

结果任然amazing

经过左右横跳,最终还是收敛。

75295a09229f7e232fcdd8eccf80a52a.png

这时候eta=1.就无法收敛了。

fdd29b0565008c30976b0476f406c471.png

eta>1时,loss function 直接发散。

b8093fe859fe772742cc321431dfd5b1.png

当eta很小时,迭代很多次才达到结果。

e3f1a37c272355b00bf00cdf015dd983.png

线性回归中的梯度下降法:

虽然线性回归中有解析解,但是这样的解计算很复杂,为了优化loss function,我们同样可以使用梯度下降法。

b478c580b998ec7aefded5d4331f75e8.png

此时梯度是:

f0fddef651dbcb6f2ceab741acfc374b.png

3986c4525dd4bd77a79ffbb9b9fb4611.png

cd332d1d841e76eb918029bc033a810f.png

Loss function:

b5a93d9969bc47d200ea8a2dddb61e94.png

x是已经确定的,需要确定的就是θn

梯度是:

79be1725baf86fda947271e49062382f.png

a23e1204ee9dd9c03fc376b4e540727d.png

此时这个梯度每个分量都与m有关,这是一个很大的数字,我们不希望梯度与m有关,

这会导致运算量很大,

因此,不妨除以一个m:

ce8cea3df6d46544ad238673521c6bc6.png

这样,我们会发现,我们优化的loss function 是:

2e9a8b08f6ae58fc92f53a811082dfb2.png

dd68b5d9a5fa43ef4d64ac114a016e46.png

39ed450bccb0dcf29bba7a91a10425cc.png

差别就是是否除以2,并无影响。

下面来编程实现一下线性回归中的梯度下降法吧~

随机生成一些数据:

65e26a1c68333d90c5981eededa6cdf2.png

8a47f609a298a6ebb2da66ab204d3076.png

480e570cbd800bf71bde3525e12f6028.png

05-Vectorize-Gradient-Descent

7d6b1d689b153aae21d12522c4c1a14c.png

使用梯度下降法前进行数据归一化

当我们使用梯度下降法的时候,不同特征的单位不同,因此得到的梯度下降的方向也会受到一些数据偏大或者偏小的数字的影响,导致数据溢出,或者无法收敛到极小值。

92bef6ded2621531b22b9ac2b81379c7.png

此时,最好将数据归一化,这样得到的梯度就很均匀,能够更快的梯度下降。

注意:当我们用正规方程求解时,不需要归一化!

7352e82efa31575bdb3545216dde3567.png

梯度下降法的优势:

4c9b2d0cd264b06bd3f51a5fc5346694.png

随机梯度下降:

如何理解随机梯度下降(stochastic gradient descent,SGD)?​www.zhihu.com

这真的是一个很大的问题,我很难从我浅显的视角给出一个很准确的答案,

我的理解是:

我们选取的损失函数是各个样本损失的和再求平均,这样的方法显然很好

代表了总体性质,类似平均数。

但是这样的计算复杂度是:O(N)

随机梯度下降的思想就是随机选取一个样本,用他来代替整体的下降趋势。

那么计算开销就从

下降到

17f5b3e9e6717f81ec90ac4a901832ec.png

ff9327311cb9bb0067ed6e9c65e1d339.png

以上是搜索的过程,也许搜索的方向不是最佳的,甚至方向错误,

但是,根据实验数据显示,这样的方式能够优化到最终结果。

SGD对学习率要求很高。

因为优化的过程十分随机,如果我们的学习率一成不变,意味着可能我们到了

最佳位置但是又跳出去了。

因此,我们需要学习率随着迭代次数而逐步减少

则有:

520463d54df32f4cf9161d03fbd676a2.png

cffe4b41192ec3cf92c9e18b3e674e26.png

打造钢铁的时候,火的温度随着时间而减小。

eddc371359f74b4322fd34984a628063.png

下面编程实现:

faddfeefeef2ece96fac008c88beca22.png

而梯度下降法耗时:

71d02a57635ea361470603d51aef1409.png

SCI-kit-LEARN 中的SGD:

f24ec6989c68253b4b3267e73ad19da1.png

关于梯度的调试:

我们求出的梯度公式真正是对的吗?

如何验证?

其实很简单,我们的求法是依据多元函数求导公式

但是,我们忽略了导数的定义。

67651a870fbc8c628df8fb332ec646f6.png

求个极限,割线斜率=切线斜率

011e41cc0f912d6a239839cfba20f0a3.png

因此,对于梯度来说,就有

2a9b585ad171744c7062483b2c5b8062.png
def dJ_debug(theta, X_b, y, epsilon=0.01):
    res = np.empty(len(theta))
    for i in range(len(theta)):
        theta_1 = theta.copy()
        theta_1[i] += epsilon
        theta_2 = theta.copy()
        theta_2[i] -= epsilon
        res[i] = (J(theta_1, X_b, y) - J(theta_2, X_b, y)) / (2 * epsilon)
    return res

总结:

9cf9430455c3a6b21b5864a21c59c8f3.png

随机:

提高运算速度。

对于large_scale data 很重要。

能跳出局部最优解

对于很多不确定的问题,本身就没有一个确定的答案。

梯度上升法:

我们知道导数,或者梯度是代表函数值上升的方向

因此我们梯度下降的时候要减去。

fdd88da100b971c3ebdb72659bb4b4e3.png

梯度下降法不是一个机器学习算法

是一个基于搜索的最优化算法

能够最小化一个loss function maximize utility function~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值