文档开发者中心
我的

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

HackerEarth,一家来自印度的创业公司,旨在帮助开发者通过线上编程竞赛获得工作机会。和Github类似,它提供一个多种编程语言的代码交流平台。而HackerEarth blog 上多刊登一些跟大数据、人工智能、机器学习、算法及编程竞赛相关的博文。

f5e6e0bcd0a1d12d75f80446b773999e5b1750dd

引言

梯度下降法 (Gradient Descent Algorithm,GD) 是为目标函数J(θ),如代价函数(cost function), 求解全局最小值(Global Minimum)的一种迭代算法。本文会详细讨论按照准确性和耗费时间(accuracy and time consuming factor)将梯度下降法进行分类。这个算法在机器学习中被广泛用来最小化目标函数,如下图所示。

ee0ae16bbac1db584fbdf744e5f517cca85c3b7e

为什么使用梯度下降法

我们使用梯度下降法最小化目标函数J(θ)。在使用梯度下降法时,首先初始化参数值,然后一直改变这些值,直到得到全局最小值。其中,我们计算在每次迭代时计算代价函数的导数,然后使用如下公式同时更新参数值:

a5b40dac8c48a93c6e0b9c0725bf8c81fe10ba8d

α表示学习速率(learning rate)。

在本文中,考虑使用线性回归(linear regression)作为算法实例,当然梯度下降法也可以应用到其他算法,如逻辑斯蒂回归(Logistic regression)和 神经网络(Neural networks)。在线性回归中,我们使用如下拟合函数(hypothesis function):

cc57b6c6b85dce36eb7cd93d6db9bcfb50b4d7ee

其中, fb4b7ce517e248004c59fb559578e54a4a9482f4是参数,a65bfc1e47ff7322dfe5ce55cf7f8bb891259a01 是输入特征。为了求解线性回归模型,需要找到合适的参数使拟合函数能够更好地适合模型,然后使用梯度下降最小化代价函数J(θ)。

代价函数(普通的最小平方差,ordinary least square error)如下所示:

b2cbb904e3bc0a7044c0a5fa0f8bc2ecdcf622ca

代价函数的梯度(Gradient of Cost function):

4429e2f2d132d5207f67f09e94b22819c90dc1fa

参数与代价函数关系如下图所示:

1e5064d9ee7749bab10f650a8d3b00db8979c28e

梯度下降法的工作原理

下面的伪代码能够解释其详细原理:
1. 初始化参数值
2. 迭代更新这些参数使目标函数J(θ)不断变小。

梯度下降法的类型

基于如何使用数据计算代价函数的导数,梯度下降法可以被定义为不同的形式(various variants)。确切地说,根据使用数据量的大小(the amount of data),时间复杂度(time complexity)和算法的准确率(accuracy of the algorithm),梯度下降法可分为:

1. 批量梯度下降法(Batch Gradient Descent, BGD);

2. 随机梯度下降法(Stochastic Gradient Descent, SGD);

3. 小批量梯度下降法(Mini-Batch Gradient Descent, MBGD)。

批量梯度下降法原理

这是梯度下降法的基本类型,这种方法使用整个数据集(the complete dataset)去计算代价函数的梯度。每次使用全部数据计算梯度去更新参数,批量梯度下降法会很慢,并且很难处理不能载入内存(don’t fit in memory)的数据集。在随机初始化参数后,按如下方式计算代价函数的梯度:

e73e9a24fa64e4fb81246d312e0a1e6af5742cb9

其中,m是训练样本(training examples)的数量。

Note:

1. 如果训练集有3亿条数据,你需要从硬盘读取全部数据到内存中;

2. 每次一次计算完求和后,就进行参数更新;

3. 然后重复上面每一步;

4. 这意味着需要较长的时间才能收敛;

5. 特别是因为磁盘输入/输出(disk I/O)是系统典型瓶颈,所以这种方法会不可避免地需要大量的读取。

2cce4e74db8b0834f57cbaab8abe4ab7249305f3

上图是每次迭代后的等高线图,每个不同颜色的线表示代价函数不同的值。运用梯度下降会快速收敛到圆心,即唯一的一个全局最小值。

批量梯度下降法不适合大数据集。下面的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

随机梯度下降法原理

批量梯度下降法被证明是一个较慢的算法,所以,我们可以选择随机梯度下降法达到更快的计算。随机梯度下降法的第一步是随机化整个数据集。在每次迭代仅选择一个训练样本去计算代价函数的梯度,然后更新参数。即使是大规模数据集,随机梯度下降法也会很快收敛。随机梯度下降法得到结果的准确性可能不会是最好的,但是计算结果的速度很快。在随机化初始参数之后,使用如下方法计算代价函数的梯度:
bac171a0ee9ae8ea7e1241d0f5c49cae19f35704

这里m表示训练样本的数量。

如下为随机梯度下降法的伪码:

1. 进入内循环(inner loop);

2. 第一步:挑选第一个训练样本并更新参数,然后使用第二个实例;

3. 第二步:选第二个训练样本,继续更新参数;

4. 然后进行第三步…直到第n步;

5. 直到达到全局最小值

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

179a3f7ba6d43967171a3c042712f193a9375df5

小批量梯度下降法原理

小批量梯度下降法是最广泛使用的一种算法,该算法每次使用m个训练样本(称之为一批)进行训练,能够更快得出准确的答案。小批量梯度下降法不是使用完整数据集,在每次迭代中仅使用m个训练样本去计算代价函数的梯度。一般小批量梯度下降法所选取的样本数量在50到256个之间,视具体应用而定。

1.这种方法减少了参数更新时的变化,能够更加稳定地收敛。

2.同时,也能利用高度优化的矩阵,进行高效的梯度计算。

随机初始化参数后,按如下伪码计算代价函数的梯度:
6ab4dc834ad914cd762f4c6b71ad84a6a2072681
这里b表示一批训练样本的个数,m是训练样本的总数。

Notes:

1. 实现该算法时,同时更新参数。

c944184d2a723235b3d10c20e2d47eb04cc18079

2. 学习速率α(也称之为步长)。如果α过大,算法可能不会收敛;如果α比较小,就会很容易收敛。

993031773399242fc846b90fbe097ef0b68dd40e

3. 检查梯度下降法的工作过程。画出迭代次数与每次迭代后代价函数值的关系图,这能够帮助你了解梯度下降法是否取得了好的效果。每次迭代后J(θ)应该降低,多次迭代后应该趋于收敛。

8ea2d3d604748b11018d054efcfdbf455116b416

93a9bbaa880631a57a7b439941afc12fe70fa0b5

4. 不同的学习速率在梯度下降法中的效果

d8ec456ab02fb7c20059e1dff1346abc04030272

总结

本文详细介绍了不同类型的梯度下降法。这些算法已经被广泛应用于神经网络。下面的图详细展示了3种梯度下降法的比较。

b9270bdb89b892bae231e61ee2cb29634cfedc0a



以上为译文

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《3 Types of Gradient Descent Algorithms for Small & Large Data Sets》,由HackerEarth blog发布。

译者:李烽 ;审校:段志成-海棠

文章为简译,更为详细的内容,请查看原文。中文译制文档下载见此。

附件下载: 3类梯度下降法的...[【方向】].1491730296.pdf

点赞
收藏
回复
分享
举报
浏览1604 发布于2019-08-20 04:11未知归属地
全部评论
最多点赞
最新发布
最早发布
暂无评论
暂无评论
写回答
新增插入模板功能
一键使用模板,快速填写内容,轻松发帖~
知道了
  • 为了保障您的信息安全,请勿上传您的敏感个人信息(如您的密码等信息)和您的敏感资产信息(如关键源代码、签名私钥、调试安装包、业务日志等信息),且您需自行承担由此产生的信息泄露等安全风险。
  • 如您发布的内容为转载内容,请注明内容来源。

我要发帖子

目录 收起
引言
为什么使用梯度下降法
梯度下降法的工作原理
梯度下降法的类型
批量梯度下降法原理
随机梯度下降法原理
小批量梯度下降法原理
总结
了解社区公约,与您携手共创和谐专业的开发者社区。