一文搞懂梯度下降

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

什么是梯度下降

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

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

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

简而言之:

1. 梯度下降就是用来求某个函数最小值时自变量对应取值

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

梯度下降的几何形式

下图为梯度下降的目的,找到J(θ)的最小值。

ae32d360c9d26b9dcbd6e298c7ffccbf.png

其实,J(θ)的真正图形是类似下面这样的,因为其是一个凸函数,只有一个全局最优解,所以不必担心像上图一样找到局部最优解

9acf0dad66eb81eee211a26a09088cf6.png

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

2a46c03afef42e34c1fd820b0a9a77ca.jpeg

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

梯度下降的原理

导数的概念

6c60f04f2ca3ef7c6d2b6d1c9ec28793.png

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

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

2c78bdedea63dfe4182868fa8af3f5bc.png

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

e02c364143f0b4e10cddcbb74874f4a7.png

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

24cc48fd4f388007706069c117c3ed17.png

下图就是寻找过程

9e46456b520a7ecb278d72de93418f76.png

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

5e197dae30cc3138bdd184469aa4b2bc.png

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

de450acf8f963d6896cc8209be0b74f4.png

为了选择参数a,就需要不断测试,因为a太大太小都不太好。

62e9cd8c62a877a8a990bd2af8d6cab6.png

如果想跳过的a与算法复杂的迭代,可以选择 Normal Equation。

梯度下降的相关概念

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

f2832a8dfa7d3a4e3f3bda1ee60cb21b.png

梯度下降的详细算法

梯度下降法的算法可以有代数法和矩阵法(也称向量法)两种表示,如果对矩阵分析不熟悉,则代数法更加容易理解。

不过矩阵法更加的简洁,且由于使用了矩阵,实现逻辑更加的一目了然。这里先介绍代数法,后介绍矩阵法。

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

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

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

6f949a94e8862fe9222b74e8c94511d2.png

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

e6a5f3da231a6f6a742c44b88e83d02e.png

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

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

3. 算法过程:

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

4f217b24b7b2a28f7fafebfde140c6f5.png

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

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

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

453b313c0d74555fa517571974079587.png

下面用线性回归的例子来具体描述梯度下降。假设我们的样本是

9e95f629f02ea2f62a6b9779e8075303.png

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

a766b2e8c6dc30a663c08b4aced0cd7b.png

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

4eeb54c9c52fdd362f77db163d8c2805.png

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

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

c31e0512e881e24ad89fe848f655cae3.png

从这个例子可以看出当前点的梯度方向是由所有的样本决定的,加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代表样本的特征数。

损失函数的表达式为:

41f0b0e0a118cb8a25270e4ba36fac9f.png

其中Y是样本的输出向量,维度为mx1.


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

764f8284d3fc0eeb2198cd47ce0d505e.png

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

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

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

70a71bcf901500a7db00ffd6589f18cc.png

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

a043e3536d187970051913d576826196.png

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

ce9624fe766a75b4d2e5f842983818ab.png

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

这里面用到了矩阵求导链式法则,和两个个矩阵求导的公式。

506cf772493fe82cd6cc39664e5daa21.png

梯度下降的算法调优

1.算法的步长选择

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

2. 算法参数的初始值选择

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

3.归一化

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

ee061e1106aafd3dbe68d8f71a87cbd4.png

梯度下降法大家族

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

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

2f3c2ff5cfbd86da94c58c978821ed2a.png

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

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

58f4ced0f79dc0ccc2b49863269fba76.png

随机梯度下降法,和4.1的批量梯度下降法是两个极端,一个采用所有数据来梯度下降,一个用一个样本来梯度下降。自然各自的优缺点都非常突出。

对于训练速度来说,随机梯度下降法由于每次仅仅采用一个样本来迭代,训练速度很快,而批量梯度下降法在样本量很大的时候,训练速度不能让人满意。

对于准确度来说,随机梯度下降法用于仅仅用一个样本决定梯度方向,导致解很有可能不是最优。对于收敛速度来说,由于随机梯度下降法一次迭代一个样本,导致迭代方向变化很大,不能很快的收敛到局部最优解。

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

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

ff5148cbfc0b59d7f4cf3842c53fa3f3.png

版权声明:本文为CSDN博主「kuokay」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:

https://blog.csdn.net/qq_45066628/article/details/123761421

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。


下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。


下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值