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

本文深入探讨了梯度下降法的原理及其在机器学习中的应用,包括不同类型的梯度下降法(批量、随机及小批量)的特点与适用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



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个训练样本去计算代价函数的梯度。一般小批量梯度下降法所选取的样本数量在50256个之间,视具体应用而定。

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

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

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

Notes:

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

c944184d2a723235b3d10c20e2d47eb04cc18079

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

993031773399242fc846b90fbe097ef0b68dd40e

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

8ea2d3d604748b11018d054efcfdbf455116b416

93a9bbaa880631a57a7b439941afc12fe70fa0b5

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

d8ec456ab02fb7c20059e1dff1346abc04030272

总结

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

b9270bdb89b892bae231e61ee2cb29634cfedc0a



另一篇文章介绍的内容:

 在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(Gradient Descent)是最常采用的方法之一,另一种常用的方法是最小二乘法。这里就对梯度下降法做一个完整的总结。

1. 梯度

    在微积分里面,对多元函数的参数求∂偏导数,把求得的各个参数的偏导数以向量的形式写出来,就是梯度。比如函数f(x,y), 分别对x,y求偏导数,求得的梯度向量就是(∂f/∂x, ∂f/∂y)T,简称grad f(x,y)或者▽f(x,y)。对于在点(x0,y0)的具体梯度向量就是(∂f/∂x0, ∂f/∂y0)T.或者▽f(x0,y0),如果是3个参数的向量梯度,就是(∂f/∂x, ∂f/∂y,∂f/∂z)T,以此类推。

    那么这个梯度向量求出来有什么意义呢?他的意义从几何意义上讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点(x0,y0),沿着梯度向量的方向就是(∂f/∂x0, ∂f/∂y0)T的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更加容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是 -(∂f/∂x0, ∂f/∂y0)T的方向,梯度减少最快,也就是更加容易找到函数的最小值。

     

2. 梯度下降与梯度上升

    在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值。反过来,如果我们需要求解损失函数的最大值,这时就需要用梯度上升法来迭代了。

    梯度下降法和梯度上升法是可以互相转化的。比如我们需要求解损失函数f(θ)的最小值,这时我们需要用梯度下降法来迭代求解。但是实际上,我们可以反过来求解损失函数 -f(θ)的最大值,这时梯度上升法就派上用场了。

    下面来详细总结下梯度下降法。        

3. 梯度下降法算法详解

3.1 梯度下降的直观解释

    首先来看看梯度下降的一个直观的解释。比如我们在一座大山上的某处位置,由于我们不知道怎么下山,于是决定走一步算一步,也就是在每走到一个位置的时候,求解当前位置的梯度,沿着梯度的负方向,也就是当前最陡峭的位置向下走一步,然后继续求解当前位置梯度,向这一步所在位置沿着最陡峭最易下山的位置走一步。这样一步步的走下去,一直走到觉得我们已经到了山脚。当然这样走下去,有可能我们不能走到山脚,而是到了某一个局部的山峰低处。

    从上面的解释可以看出,梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。当然,如果损失函数是凸函数,梯度下降法得到的解就一定是全局最优解。

3.2 梯度下降的相关概念

    在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

    1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

    2.特征(feature):指的是样本中输入部分,比如样本(x0,y0),(x1,y1),则样本特征为x,样本输出为y。

    3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)。比如对于样本(xi,yi)(i=1,2,...n),可以采用拟合函数如下: hθ(x) = θ01x。

    4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于样本(xi,yi)(i=1,2,...n),采用线性回归,损失函数为:

             J(θ0,θ1)=∑i=1m(hθ(xi)−yi)2

     其中xi表示样本特征x的第i个元素,yi表示样本输出y的第i个元素,hθ(xi)为假设函数。   

3.3 梯度下降的详细算法

    梯度下降法的算法可以有代数法和矩阵法(也称向量法)两种表示,如果对矩阵分析不熟悉,则代数法更加容易理解。不过矩阵法更加的简洁,且由于使用了矩阵,实现逻辑更加的一目了然。这里先介绍代数法,后介绍矩阵法。

 

3.3.1 梯度下降法的代数方式描述

    1. 先决条件: 确认优化模型的假设函数和损失函数。

    比如对于线性回归,假设函数表示为 hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn, 其中θi (i = 0,1,2... n)为模型参数,xi (i = 0,1,2... n)为每个样本的n个特征值。这个表示可以简化,我们增加一个特征x0=1 ,这样hθ(x0,x1,...xn)=∑i=0nθixi

    同样是线性回归,对应于上面的假设函数,损失函数为:

           J(θ0,θ1...,θn)=12m∑i=0m(hθ(x0,x1,...xn)−yi)2

 

    2. 算法相关参数初始化:主要是初始化θ0,θ1...,θn,算法终止距离ε以及步长α。在没有任何先验知识的时候,我喜欢将所有的θ初始化为0, 将步长初始化为1。在调优的时候再 优化。

    3. 算法过程:

      1)确定当前位置的损失函数的梯度,对于θi,其梯度表达式如下:

        ∂∂θiJ(θ0,θ1...,θn)

      2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即α∂∂θiJ(θ0,θ1...,θn)对应于前面登山例子中的某一步。

      3)确定是否所有的θi,梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的θi(i=0,1,...n)即为最终结果。否则进入步骤4.

      4)更新所有的θ,对于θi,其更新表达式如下。更新完毕后继续转入步骤1.

        θi=θi−α∂∂θiJ(θ0,θ1...,θn)

    下面用线性回归的例子来具体描述梯度下降。假设我们的样本是(x1(0),x2(0),...xn(0),y0),(x1(1),x2(1),...xn(1),y1),...(x1(m),x2(m),...xn(m),yn),损失函数如前面先决条件所述:

    J(θ0,θ1...,θn)=12m∑i=0m(hθ(x0,x1,...xn)−yi)2

    则在算法过程步骤1中对于θi 的偏导数计算如下:   

     ∂∂θiJ(θ0,θ1...,θn)=1m∑j=0m(hθ(x0j,x1j,...xnj)−yj)xij

    由于样本中没有x0上式中令所有的x0j为1.

    步骤4中θi的更新表达式如下:

           θi=θi−α1m∑j=0m(hθ(x0j,x1j,...xnj)−yj)xij

    从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加1m 是为了好理解。由于步长也为常数,他们的乘机也为常数,所以这里α1m可以用一个常数表示。

    在下面第4节会详细讲到的梯度下降法的变种,他们主要的区别就是对样本的采用方法不同。这里我们采用的是用所有样本。

3.3.2 梯度下降法的矩阵方式描述

    这一部分主要讲解梯度下降法的矩阵方式表述,相对于3.3.1的代数法,要求有一定的矩阵分析的基础知识,尤其是矩阵求导的知识。

    1. 先决条件: 和3.3.1类似, 需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn的矩阵表达方式为:

     hθ(x)=Xθ ,其中, 假设函数hθ(X)为mx1的向量,θ为nx1的向量,里面有n个代数法的模型参数。X为mxn维的矩阵。m代表样本的个数,n代表样本的特征数。

             损失函数的表达式为:J(θ)=12(Xθ−Y)T(Xθ−Y), 其中Y是样本的输出向量,维度为mx1.

    2. 算法相关参数初始化: θ向量可以初始化为默认值,或者调优后的值。算法终止距离ε,步长α和3.3.1比没有变化。

    3. 算法过程:

      1)确定当前位置的损失函数的梯度,对于θ向量,其梯度表达式如下:

        ∂∂θJ(θ)

      2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即α∂∂θJ(θ)对应于前面登山例子中的某一步。

      3)确定θ向量里面的每个值,梯度下降的距离都小于ε,如果小于ε则算法终止,当前θ向量即为最终结果。否则进入步骤4.

      4)更新θ向量,其更新表达式如下。更新完毕后继续转入步骤1.

        θ=θ−α∂∂θJ(θ)

   

    还是用线性回归的例子来描述具体的算法过程。

    损失函数对于θ向量的偏导数计算如下:

      ∂∂θJ(θ)=XT(Xθ−Y)

    步骤4中θ向量的更新表达式如下:θ=θ−αXT(Xθ−Y)

    对于3.3.1的代数法,可以看到矩阵法要简洁很多。这里面用到了矩阵求导链式法则,和两个矩阵求导的公式。

      公式1:∂∂X(XXT)=2X

      公式2:∂∂θ(Xθ)=XT

    如果需要熟悉矩阵求导建议参考张贤达的《矩阵分析与应用》一书。

 

3.4 梯度下降的算法调优

    在使用梯度下降时,需要进行调优。哪些地方需要调优呢?

    1. 算法的步长选择。在前面的算法描述中,我提到取步长为1,但是实际上取值取决于数据样本,可以多取一些值,从大到小,分别运行算法,看看迭代效果,如果损失函数在变小,说明取值有效,否则要增大步长。前面说了。步长太大,会导致迭代过快,甚至有可能错过最优解。步长太小,迭代速度太慢,很长时间算法都不能结束。所以算法的步长需要多次运行后才能得到一个较为优的值。

    2. 算法参数的初始值选择。 初始值不同,获得的最小值也有可能不同,因此梯度下降求得的只是局部最小值;当然如果损失函数是凸函数则一定是最优解。由于有局部最优解的风险,需要多次用不同初始值运行算法,关键损失函数的最小值,选择损失函数最小化的初值。

    3.归一化。由于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望和标准差std(x),然后转化为:

      x−x¯std(x)

    这样特征的新期望为0,新方差为1,迭代次数可以大大加快。

4. 梯度下降法大家族(BGD,SGD,MBGD)

4.1 批量梯度下降法(Batch Gradient Descent)

    批量梯度下降法,是梯度下降法最常用的形式,具体做法也就是在更新参数时使用所有的样本来进行更新,这个方法对应于前面3.3.1的线性回归的梯度下降算法,也就是说3.3.1的梯度下降算法就是批量梯度下降法。  

    θi=θi−α∑j=0m(hθ(x0j,x1j,...xnj)−yj)xij

    由于我们有m个样本,这里求梯度的时候就用了所有m个样本的梯度数据。

4.2 随机梯度下降法(Stochastic Gradient Descent)

    随机梯度下降法,其实和批量梯度下降法原理类似,区别在与求梯度时没有用所有的m个样本的数据,而是仅仅选取一个样本j来求梯度。对应的更新公式是:

    θi=θi−α(hθ(x0j,x1j,...xnj)−yj)xij

    随机梯度下降法,和4.1的批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

    那么,有没有一个中庸的办法能够结合两种方法的优点呢?有!这就是4.3的小批量梯度下降法。

4.3 小批量梯度下降法(Mini-batch Gradient Descent)

  小批量梯度下降法是批量梯度下降法和随机梯度下降法的折衷,也就是对于m个样本,我们采用x个样子来迭代,1<x<m。一般可以取x=10,当然根据样本的数据,可以调整这个x的值。对应的更新公式是:

    θi=θi−α∑j=tt+x−1(hθ(x0j,x1j,...xnj)−yj)xij

5. 梯度下降法和其他无约束优化算法的比较

    在机器学习中的无约束优化算法,除了梯度下降以外,还有前面提到的最小二乘法,此外还有牛顿法和拟牛顿法。

    梯度下降法和最小二乘法相比,梯度下降法需要选择步长,而最小二乘法不需要。梯度下降法是迭代求解,最小二乘法是计算解析解。如果样本量不算很大,且存在解析解,最小二乘法比起梯度下降法要有优势,计算速度很快。但是如果样本量很大,用最小二乘法由于需要求一个超级大的逆矩阵,这时就很难或者很慢才能求解解析解了,使用迭代的梯度下降法比较有优势。

    梯度下降法和牛顿法/拟牛顿法相比,两者都是迭代求解,不过梯度下降法是梯度求解,而牛顿法/拟牛顿法是用二阶的海森矩阵的逆矩阵或伪逆矩阵求解。相对而言,使用牛顿法/拟牛顿法收敛更快。但是每次迭代的时间比梯度下降法长。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值