概念介绍

梯度下降法目的是为了“下降”,下降的方法是按照“梯度”。比如你在一座山上,当前你只能迈出一步,如何走才能使你的高度下降的最多呢,根据梯度的理论,我们沿着当前梯度的反方向走,会让我们的下降幅度最大。
上述例子中,山就是一个函数,在山上的你就是函数中待优化的变量,人的坐标表示变量初始值,我们要 求的是函数最小值即到达山底,人该如何走即如何迭代变量。所以我们只要沿着函数梯度的反方向,就能最快的到达我们要去的地方。
梯度下降是一种更新参数的方法,具体如何更新跟原函数的在某点的梯度有关。不会改变要求的最优解。
我们可以利用梯度下降法求最大值和最小值,求最大值沿着梯度方向走即可,求最小值则沿着梯度的反方向走。

公式

抽象的公式就一个
θnext=θnow−α▽f(θnow)\theta ^{next} = \theta ^{now} - \alpha\bigtriangledown f(\theta ^{now}) θnext=θnow−α▽f(θnow)
θnext\theta ^{next}θnext:x在下个时刻的坐标
θnow\theta ^{now}θnow:x在当前时刻的坐标
α\alphaα:步长,每一步走多远,即学习率
▽f(θnow)\bigtriangledown f(\theta ^{now})▽f(θnow):目标函数f(x)在θnow\theta ^{now}θnow点的导数
举个例子:
目标函数 y=x2y = x^{2}y=x2,学习率α\alphaα=0.1,当前位置x =1,要求y最小值,则下一时刻x的值应该更新为多少呢。根据梯度下降理论,下一时刻:
x = 1 - 0.1*2*1 = 0.8,此时的xx=1的时候更接近0这个最小值。这就是一元变量下的梯度下降算法,多元变量是也是一样的,只是求梯度时有些许不同而已。

算法实现

结合线性回归模型来实现梯度下降算法。梯度下降是线性回归求最优解的一种常用方法。
设我们的线性回归模型为:
hθ(x(i))=θ0+θ1x1(i)+θ2x2(i)+...+θnxn(i)h_{\theta}( x^{(i)}) =\theta_{0} +\theta_{1}x_{1}^{(i)} + \theta_{2}x_{2}^{(i)} +...+\theta_{n}x_{n}^{(i)} hθ​(x(i))=θ0​+θ1​x1(i)​+θ2​x2(i)​+...+θn​xn(i)​

即我们变量是n维的,对每个维度上都加了个权重,求所有维度上的带权和然后加上一个偏置项就是我们的回归函数。而我们的目的就是求出Θ0...Θn\Theta_{0}...\Theta_{n}Θ0​...Θn​这n+1个参数。
定义代价函数
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}( x^{(i)})-y^{(i)})^{2} J(θ)=2m1​i=1∑m​(hθ​(x(i))−y(i))2
这个代价函数就是预测值与实际值之间的距离的平方,m是样本的个数,求个平均更准确点嘛。分母的2是为跟后面平方项求导后的2约掉。
在程序中,多变量的运算都是通过矩阵来完成的,所以我们要将上述式子写成矩阵相乘的式子:
我们用Θ\ThetaΘ来表示[Θ0,...,Θn][\Theta_{0},...,\Theta_{n}][Θ0​,...,Θn​],用X来表示[0,x1,...,xn]X来表示[0,x_{1},...,x_{n}]X来表示[0,x1​,...,xn​],
这样,原来的回归模型就可以写成:
hΘ(X)=XΘh_{\Theta}( X) = X\Theta hΘ​(X)=XΘ
原来的代价函数可以写成:
J(Θ)=12m(XΘ−Y)T(XΘ−Y)J(\Theta) = \frac{1}{2m}(X\Theta-Y)^{T}(X\Theta-Y) J(Θ)=2m1​(XΘ−Y)T(XΘ−Y)
上述两式子中的变量全为矩阵表示。
将代价函数对我们要求的参数Θ\ThetaΘ求一阶导数得:
▽J(Θ)=1m(XΘ−Y)X\bigtriangledown J(\Theta) = \frac{1}{m}(X\Theta-Y) X ▽J(Θ)=m1​(XΘ−Y)X
这个一阶导数就是我们每次更新参数时需要的梯度。这样我们就从一元变量扩展到了多元变量上。可以对含有多元参数的目标函数利用梯度下降法求出最优解。
代码实现:

import numpy as nprow = 20
x0 = np.zeros((row,1))
x1 = np.arange(0,row+0).reshape(row,1)
x2 = np.arange(10,row+10).reshape(row,1)
x3 = np.arange(21,row+21).reshape(row,1)
x = np.hstack((x1,x2,x3))
y = 2*x1 +3*x2 + 4*x3 + np.random.random(row).reshape(row,1)#定义代价函数
def error_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./2*row) * np.dot(np.transpose(diff), diff)#求梯度的函数
def gradient_function(theta, x, y):diff = np.dot(x, theta) - yreturn (1./row) * np.dot(np.transpose(x), diff)#利用梯度下降法不断迭代参数
def gradient_descent(x, y, alpha):theta = np.array([1, 1, 1]).reshape(3, 1)gradient = gradient_function(theta, x, y)while not np.all(np.absolute(gradient) <= 1e-5):theta = theta - alpha * gradientgradient = gradient_function(theta, x, y)# print(gradient)return thetaalpa = 0.001
theta = gradient_descent(x,y,alpa)
print(theta)

输出结果:

[[1.        ][1.97155845][2.96137676][4.05017691]]

可以看到这个跟我们设定函数时x0,x1,x2,x3是非常接近的。

注意

上述代码中 ,学习率为0.001,把学习率改成1会发生什么呢,自己试试看,会发现程序会一直运行不停止,打印出梯度会发现,梯度一直增加最终变成了无限大。
这是因为,如果学习率过大,会导致不收敛,因为跨的步数太大,会越过那个最低点,并一直震荡。至于为什么梯度会变得越来越大以至于无限大,可以举个例子,函数y=2x2y=2x^{2}y=2x2,其一阶导数为y=4xy =4xy=4x

在A(10,200)点,梯度为40,所以下一时刻到B点的横坐标为10-140= -30,
在B(-30,1800)点,梯度为-120,所以下一时刻到达的点的横坐标为-30+1
120=90,这样会导致离最优值越来越远。
所以:

  • 学习率太大会导致不收敛
  • 学习率太小会导致到达最低点的迭代次数太大,费时

梯度下降法的原理与实现相关推荐

  1. 【梯度下降法】详解优化算法之梯度下降法(原理、实现)

    本文收录于<深入浅出讲解自然语言处理>专栏,此专栏聚焦于自然语言处理领域的各大经典算法,将持续更新,欢迎大家订阅! ​个人主页:有梦想的程序星空 ​个人介绍:小编是人工智能领域硕士,全栈工 ...

  2. 深度解析梯度下降法的原理

    虽然我们经常说梯度下降,但是你真的对梯度下降了解吗? 梯度下降利用到了一阶泰勒展开式. 以下图片是梯度下降原理的推导.

  3. 机器学习:用梯度下降法实现线性回归

    之前在 机器学习算法数学基础之 -- 线性代数篇 中,总结过求解线性回归的两种方法: 最小二乘法 梯度下降法 这篇文章重点总结一下梯度下降法中的一些细节和需要注意的地方. 梯度下降法是什么 假设有一个 ...

  4. 梯度下降法and随机梯度下降法

    1. 梯度下降法 梯度下降法的原理可以参考:斯坦福机器学习第一讲. 我实验所用的数据是100个二维点. 如果梯度下降算法不能正常运行,考虑使用更小的步长(也就是学习率),这里需要注意两点: 1)对于足 ...

  5. 【算法系列】非线性最小二乘求解-梯度下降法

    系列文章目录 ·[算法系列]卡尔曼滤波算法 ·[算法系列]非线性最小二乘求解-直接求解法 ·[算法系列]非线性最小二乘求解-梯度下降法 ·[算法系列]非线性最小二乘-高斯牛顿法 ·[算法系列]非线性最 ...

  6. 数值计算之 梯度下降法与函数极值

    数值计算之 梯度下降法与函数极值 前言 微积分基础 一元函数的极值,导数与泰勒展开 多元函数的泰勒展开 梯度下降法 梯度方向 终止条件 代码举例 后记 前言 本篇将开始介绍优化算法.首先是梯度下降法, ...

  7. 最清晰的讲解各种梯度下降法原理与Dropout

    一.梯度法思想 梯度法思想的三要素:出发点.下降方向.下降步长. 机器学习中常用的权重更新表达式为 :,这里的λ就是学习率,本文从这个式子出发来把机器学习中的各种"梯度"下降法阐释 ...

  8. 梯度下降法快速教程 | 第三章:学习率衰减因子(decay)的原理与Python实现

    北京 | 深度学习与人工智能 12月23-24日 再设经典课程 重温深度学习阅读全文> 正文共3017个字.11张图.预计阅读时间:8分钟 前言 梯度下降法(Gradient Descent)是 ...

  9. 梯度下降法快速教程 | 第二章:冲量(momentum)的原理与Python实现

    北京 | 深度学习与人工智能研修 12月23-24日 再设经典课程 重温深度学习阅读全文> 01 前言 梯度下降法(Gradient Descent)是机器学习中最常用的优化方法之一,常用来求解 ...

最新文章

  1. 【SQL Server学习笔记】变更数据捕获(Change Data Capture)
  2. 2018-2019-2 网络对抗技术 20165230 Exp9 :Web安全基础
  3. 麒麟操作系统配置网络_讲解银河麒麟桌面操作系统
  4. 【Python基础】学习用Pandas处理分类数据!
  5. 基于TerraExplorer Pro的校园三维浏览系统开发(转载)
  6. 力扣Java编译器_力扣--设计单链表
  7. sl animation sample
  8. dirname,basename的用法与用途
  9. branch and bound(分支定界)算法-基础概念
  10. c语言突然出现图片,c语言能显示图片吗
  11. linux的网卡部分
  12. 信息量、熵、相对熵与交叉熵的理解
  13. 轻松搭建Windows8云平台开发环境
  14. 教你用Python画简单的表情包(Turtle库的应用)
  15. 网络规划设计方案(模板)
  16. Web前端开发技术(第3版)储久良 12.6综合实例
  17. [转载]PT建站源码(PT服务器原程序)汇总(20100815更新)
  18. Matlab TreeBagger随机森林回归实例
  19. php 集成 spss,spss怎么导入数据
  20. 问道手游服务器修改密码,问道手游去哪改密码 问道手游怎么更换修改密码手机号...

热门文章

  1. Latex引用参考文献,要作者名、章节、页码等详细信息
  2. 太阳能飞机完成跨国飞行
  3. C语言控制台打印输出整齐问题
  4. 桨力传感器 赛艇控制器
  5. 刚来到大城市迷茫的你,最苦的日子是怎样的?
  6. MySQL5.6数据库多种安装方法及企业级安装实践
  7. 天冷危险,疫情暴增7.5倍,还有暴雪、碎冰伤人!
  8. 武汉新时标文化传媒有限公司短视频运营5要素分享
  9. C语言详解系列——循环语句详解(1)while语句的语法结构
  10. 谈字符串_以及单引号与双引号等问题