常用算法之:2、梯度下降_两参数 梯度下降-程序员宅基地

技术标签: 基础算法程序设计  

在求解机器学习算法的模型参数,即无约束优化问题时,梯度下降(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),采用线性回归,损失函数为:

                              

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

3.3 梯度下降的详细算法

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

 

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

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

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

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

                                   

 

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

    3. 算法过程:

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

                   

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

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

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

                       

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

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

                            

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

                                    

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

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

                                     

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

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

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

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

    1. 先决条件: 和3.3.1类似, 需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数                     的矩阵表达方式为:

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

             损失函数的表达式为:      , 其中   是样本的输出向量,维度为mx1.

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

    3. 算法过程:

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

           

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

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

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

           

   

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

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

           

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

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

      公式1:     

      公式2:     

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

 

3.4 梯度下降的算法调优

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

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

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

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

             

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

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

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

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

                             

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

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

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

                          

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

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

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

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

                             

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

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

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

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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/solar_Lan/article/details/78287840

智能推荐

MySQL安装配置教程最全详解,一步一图解_mysql安装教程图解-程序员宅基地

文章浏览阅读820次,点赞14次,收藏6次。这个方向初期比较容易入门一些,掌握一些基本技术,拿起各种现成的工具就可以开黑了。知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。(img-tcUzaO6d-1713163585912)]同时非常期待小伙伴们能够关注,后面慢慢推出更好的干货~嘻嘻。如果有写得不正确的地方,麻烦指出,感激不尽。

node-sass 安装失败解决办法_nodesass安装报错-程序员宅基地

文章浏览阅读3.5k次,点赞2次,收藏6次。很多小伙伴在安装node-sass的时候都失败了,主要的原因是node版本和项目依赖的node-sass版本不匹配。node-sass依赖node版本,而sass则不需要。解决方案:卸载node-sass,安装sass,项目全局搜索/deep/, 把/deep/替换为::v-deep即可。_nodesass安装报错

map 和 flatMap 区别_flatmap和map区别-程序员宅基地

文章浏览阅读1.9w次,点赞30次,收藏47次。区别这两个在本质上是一样的,都是 map 操作,即对流形式的传入数据进行处理返回一个数据。但是区别方面从字面上就可以体现出来,flatMap 比 map 多了一个 flat 操作,也就是 “展平/扁平化” 处理的意思。所以 flatMap 是一个 map 和一个 flat 操作的组合。其首先将一个函数应用于元素,然后将其展平,当你需要将 [[a,b,c],[d,e,f],[x,y,z]] 具有两个级别的数据结构转换为 [a,b,c,d,e,f,x,y,z] 这样单层的数据结构时,就选择使用 flatMa_flatmap和map区别

Unigine入门知识散记(一)_unigine怎么在y轴移动-程序员宅基地

文章浏览阅读1k次,点赞2次,收藏2次。1、Unigine里面的node相当于Unity里面的gameObject,在Unity中,gameObject至少有一个Transform组件,Unigine的开发者可能认为既然Transform是必有的组件,那把这个组件做成node的属性算了,所以在Unigine中node自带Transform的主要功能。2、Unigine中的Input类和Unity中的Input类非常类似,很多功能可以对照一下:Unity的Input方法 Unigine的Input方法 GetKeyDown _unigine怎么在y轴移动

oracle数据库查看版本号_navicat查看oracle版本-程序员宅基地

文章浏览阅读6.6k次。1、使用Navicat连接数据库。oracle数据库查看版本号。2、打开数据库并新建查询。_navicat查看oracle版本

视频教程-19年微信小程序教程零基础入门到项目实战教程-微信开发-程序员宅基地

文章浏览阅读335次。19年微信小程序教程零基础入门到项目实战教程 7年的开发架构经验,曾就职于国..._微信小程序开发零基础入门+项目案例视频教学

随便推点

踏板车的节油措施汇总-程序员宅基地

文章浏览阅读314次。四冲踏板摩托节油措施汇总 [08年版本]    〔序〕四冲活塞式内燃机是一种结构比较麻烦的发动机,靠皮带变速传动的踏板车是一种结构复杂毛病较多的车种;08年在ZJ搞研发的日子里,对这些踏板车又有了些新的进展;在此增添些新内容,仅供版内车友参考。  一、踏板车节油的意义:虽然有些人不在乎多消耗点燃油费,但机动车辆节油的意义不只是私人经济开销问题,而是事关环保大局。有点机车常识的人都应该知道,多供给发..._关闭电热加浓

gitlab仓库完整迁移(代码,分支,提交记录)_gitlab new directory-程序员宅基地

文章浏览阅读2.7k次。背景代码仓库所在服务器因为异常断电关机,无法启动,需要进行gitlab工程代码迁移命令git clone --mirror <URL to my OLD repo location>cd <New directory where your OLD repo was cloned>git remote set-url origin <URL to my NEW repo location>git push -f origin..._gitlab new directory

完美解决丨 - [SyntaxError: invalid syntax](#SyntaxError-invalid-syntax)_invalid create index syntax, use `create index for-程序员宅基地

文章浏览阅读3.6k次,点赞76次,收藏5次。「SQL面试题库」是由不吃西红柿发起,全员免费参与的SQL学习活动。我每天发布1道SQL面试真题,从简单到困难,涵盖所有SQL知识点,我敢保证只要做完这100道题,不仅能轻松搞定面试,代码能力和工作效率也会有明显提升。_invalid create index syntax, use `create index for ...` instead. (line 1, co

[网络安全自学篇] 三十五.恶意代码攻击检测及恶意样本分析_如何在数据包中分析那些是带有恶意攻击的和正常语句-程序员宅基地

文章浏览阅读1.7w次,点赞14次,收藏78次。本文主要结合作者的《系统安全前沿》作业,相关论文及绿盟李东宏老师的博客,从产业界和学术界分别详细讲解恶意代码攻击溯源的相关知识。在学术界方面,用类似于综述来介绍攻击追踪溯源的不同方法;在产业界方面,主要参考李东宏老师从企业恶意样本分析的角度介绍溯源工作。关于攻击溯源的博客和论文都比较少,希望这篇文章对您有所帮助,如果文章中存在错误或理解不到位的地方,还请告知作者与海涵~_如何在数据包中分析那些是带有恶意攻击的和正常语句

如何带好一个团队?团队管理的要点有哪些?_如何管理好一个团队-程序员宅基地

文章浏览阅读2k次。以目标为基准,以结果为导向,一个目标明确的团队,项目成员的个人目标也会更加明确,从而发挥最大的效率。合理运用自己的权限是管理者必修的一门功课,因为你的一个决策会影响到员工的工作态度、发展等要素,所以一定要深思熟虑,对团队和团队中的每一个人负责。在项目管理中,使用项目管理软件可以实现全面,可视化管理,在软件上制定计划,统一分配任务,不仅能够提高效率,还能够实现更好的管理。作为管理者,要学会适度的放权,有的放矢,管理者手中的权限是为了团队更好的发展,肩负着重要的责任。实现有效沟通,避免信息孤岛的出现。_如何管理好一个团队

暗影精灵9休眠时间间歇性风扇转动解决方法_暗影精灵9睡眠风扇突然转-程序员宅基地

文章浏览阅读1.3k次。HP最近一次更新后本人的暗影精灵9在休眠的时候风扇经常性地突然高速转动,带来了不小的噪音困扰,查阅惠普社区后先是安装了最新的BIOS文件F.11版本,仍不能解决问题。目前方法:惠普管家上找到之前版本的BIOS文件(本人使用F.08)并下载,按向导安装并重启电脑,即可解决问题。即回退BIOS版本文件。这两天电脑不再出现休眠后风扇时不时地疯狂转动的现象,应该是个有效的方法。_暗影精灵9睡眠风扇突然转

推荐文章

热门文章

相关标签