一文搞懂梯度下降

什么是梯度下降

梯度下降是机器学习中的常用算法,通过不断迭代计算函数的梯度,判断该点的某一方向和目标之间的距离,最终求得最小的损失函数和相关参数,为建立线性模型提供支持。

梯度下降是一种广泛用于求解线性和非线性模型最优解的迭代算法,它的中心思想在于通过迭代次数的递增,调整使得损失函数最小化的权重。

它的作用是用于优化一个目标函数,如果要最小化一个损失函数,使用的就是梯度下降法,如果要最大化一个效用函数,使用的是梯度上升法。

简而言之:

  1. 梯度下降就是用来求某个函数最小值时自变量对应取值
  2. 损失函数就是一个自变量为算法的参数,函数值为误差值的函数。所以梯度下降就是找让误差值最小时候算法取的参数。

梯度下降的几何形式

下图为梯度下降的目的,找到J(θ)的最小值。
在这里插入图片描述
其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解

在这里插入图片描述
直到了要找到图形中的最小值之后,下面介绍自动求解最小值的办法,这就是梯度下降法

在这里插入图片描述
对参数向量θ中的每个分量θj,迭代减去速率因子a* (dJ(θ)/dθj)即可,后边一项为J(θ)关于θj的偏导数

3 梯度下降的原理

导数的概念

在这里插入图片描述
由公式可见,对点x0的导数反映了函数在点x0处的瞬时变化速率,或者叫在点x0处的斜度。推广到多维函数中,就有了梯度的概念,梯度是一个向量组合,反映了多维图形中变化速率最快的方向。

下图展示了对单个特征θ1的直观图形,起始时导数为正,θ1减小后并以新的θ1为基点重新求导,一直迭代就会找到最小的θ1,若导数为负时,θ1的就会不断增到,直到找到使损失函数最小的值。

在这里插入图片描述
有一点需要注意的是步长a的大小,如果a太小,则会迭代很多次才找到最优解,若a太大,可能跳过最优,从而找不到最优解。

在这里插入图片描述
另外,在不断迭代的过程中,梯度值会不断变小,所以θ1的变化速度也会越来越慢,所以不需要使速率a的值越来越小

在这里插入图片描述
下图就是寻找过程

在这里插入图片描述
当梯度下降到一定数值后,每次迭代的变化很小,这时可以设定一个阈值,只要变化小鱼该阈值,就停止迭代,而得到的结果也近似于最优解。

在这里插入图片描述
若损失函数的值不断变大,则有可能是步长速率a太大,导致算法不收敛,这时可适当调整a值

在这里插入图片描述
为了选择参数a,就需要不断测试,因为a太大太小都不太好。

在这里插入图片描述
如果想跳过的a与算法复杂的迭代,可以选择 Normal Equation。

梯度下降的相关概念

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

在这里插入图片描述

梯度下降的详细算法

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

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

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

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

在这里插入图片描述
同样是线性回归,对应于上面的假设函数,损失函数为:
在这里插入图片描述

2. 算法相关参数初始化:

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

3. 算法过程:

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

在这里插入图片描述

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

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

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

在这里插入图片描述

下面用线性回归的例子来具体描述梯度下降。假设我们的样本是
 在这里插入图片描述

损失函数如前面先决条件所述:

在这里插入图片描述

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

在这里插入图片描述

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

步骤4中θi的更新表达式如下:
在这里插入图片描述

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

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

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

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

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

损失函数的表达式为:
在这里插入图片描述

其中Y是样本的输出向量,维度为mx1.
2.算法相关参数初始化: θ向量可以初始化为默认值,或者调优后的值。算法终止距离ε,步长α和3.3.1比没有变化。

3.算法过程:
1)确定当前位置的损失函数的梯度,对于θ向量,其梯度表达式如下:
在这里插入图片描述

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

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

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

在这里插入图片描述

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

损失函数对于θ向量的偏导数计算如下:
在这里插入图片描述

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

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

这里面用到了矩阵求导链式法则,和两个个矩阵求导的公式。
在这里插入图片描述

梯度下降的算法调优

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

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

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

梯度下降法大家族

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

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

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

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

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

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

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

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_45066628/article/details/123761421