纯干货 | 机器学习中梯度下降法的分类及对比分析(附源码)



α
线性回归
其中, 是参数,
是输入特征。为了求解线性回归模型,需要找到合适的参数使拟合函数能够更好地适合模型,然后使用梯度下降最小化代价函数J(θ)。
代价函数:
下面的伪代码能够解释其详细原理:
1. 初始化参数值
2. 迭代更新这些参数使目标函数J(θ)不断变小。
使用整个数据集()去计算代价函数的梯度批量梯度下降法会很慢

3. 然后重复上面每一步;
4. 这意味着需要较长的时间才能收敛;
批量梯度下降法不适合大数据集。下面的Python代码实现了批量梯度下降法:
1. import numpy as np
2. import random
3. def gradient_descent(alpha, x, y, ep=0.0001, max_iter=10000):
4. converged = False
5. iter = 0
6. m = x.shape[0] # number of samples
7.
8. # initial theta
9. t0 = np.random.random(x.shape[1])
10. t1 = np.random.random(x.shape[1])
11.
12. # total error, J(theta)
13. J = sum([(t0 + t1*x[i] - y[i])**2 for i in range(m)])
14.
15. # Iterate Loop
16. while not converged:
17. # for each training sample, compute the gradient (d/d_theta j(theta))
18. grad0 = 1.0/m * sum([(t0 + t1*x[i] - y[i]) for i in range(m)])
19. grad1 = 1.0/m * sum([(t0 + t1*x[i] - y[i])*x[i] for i in range(m)])
20. # update the theta_temp
21. temp0 = t0 - alpha * grad0
22. temp1 = t1 - alpha * grad1
23.
24. # update theta
25. t0 = temp0
26. t1 = temp1
27.
28. # mean squared error
29. e = sum( [ (t0 + t1*x[i] - y[i])**2 for i in range(m)] )
30.
31. if abs(J-e) <= ep:
32. print 'Converged, iterations: ', iter, '!!!'
33. converged = True
34.
35. J = e # update error
36. iter += 1 # update iter
37.
38. if iter == max_iter:
39. print 'Max interactions exceeded!'
40. converged = True
41.
42. return t0,t1
批量梯度下降法被证明是一个较慢的算法,所以,我们可以选择随机梯度下降法达到更快的计算。随机梯度下降法的第一步是随机化整个数据集。在每次迭代仅选择一个训练样本去计算代价函数的梯度,然后更新参数。即使是大规模数据集,随机梯度下降法也会很快收敛。随机梯度下降法得到结果的准确性可能不会是最好的,但是计算结果的速度很快。在随机化初始参数之后,使用如下方法计算代价函数的梯度:

如下为随机梯度下降法的伪码:
如下图所示,随机梯度下降法不像批量梯度下降法那样收敛,而是游走到接近全局最小值的区域终止。

小批量梯度下降法不是使用完整数据集,在每次迭代中仅使用m个训练样本去计算代价函数的梯度

这里b表示一批训练样本的个数,m是训练样本的总数。
1. 实现该算法时,同时更新参数。
2. 学习速率α(也称之为步长)。如果α过大,算法可能不会收敛;如果α比较小,就会很容易收敛。
3. 检查梯度下降法的工作过程。画出迭代次数与每次迭代后代价函数值的关系图,这能够帮助你了解梯度下降法是否取得了好的效果。每次迭代后J(θ)应该降低,多次迭代后应该趋于收敛。
4. 不同的学习速率在梯度下降法中的效果
本文详细介绍了不同类型的梯度下降法。这些算法已经被广泛应用于神经网络。下面的图详细展示了3种梯度下降法的比较。
以上为译文
本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。
文章原标题《3 Types of Gradient Descent Algorithms for Small & Large Data Sets》,由HackerEarth blog发布。
译者:李烽 ;审校:
文章为简译,更为详细的内容,请查看原文。中文译制文档下载见此。
最后更新:2017-04-09 18:03:54