梯度下降法(Gradient Descent)是求解无约束最优化问题最常用的方法之一,它是一种迭代方法,每一步的主要操作就是求解目标函数的梯度向量,将当前位置的负梯度方向作为搜索方向。

直观的表示可用下图来表示:

这里每一个圈代表一个函数梯度,最中心表示函数极值点,每次迭代根据当前位置求得的梯度(用于确定搜索方向以及与步长共同决定前进速度)和步长找到一个新的位置,这样不断迭代最终到达目标函数局部最优点(如果目标函数是凸函数,则到达全局最优点)。

梯度下降法其本质就是在不停的求偏导、更新损失函数,直至收敛

1、 梯度

梯度向量求出来有什么意义???从几何意义来讲,就是函数变化增加最快的地方。具体来说,对于函数f(x,y),在点\((x_0,y_0)\)沿梯度向量的方向就是\((\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial y_0})^T\)的方向是f(x,y)增加最快的地方。或者说,沿着梯度向量的方向,更容易找到函数的最大值。反过来说,沿着梯度向量相反的方向,也就是\(-(\frac{\partial f}{\partial x_0},\frac{\partial f}{\partial y_0})^T\)的方向,梯度减少最快,也就是更容易找到函数的最小值。

2、梯度下降和梯度上升

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

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

3、梯度下降算法详解

3.1 梯度下降的直观理解

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

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

3.2 梯度下降的相关概念

  1. 步长(learning rate):步长决定梯度下降过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。
  2. 特征(feature):指样本中输入部分,比如2个单特征的样本\((x^{(0)},y^{(0))}),(x^{(1)},y^{(1))})\),则第一个样本特征为\(x^{(0)}\),第一个样本输出为\(y^{(0)}\)
  3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为\(h_\theta(x)\)。比如对于单个特征的m个样本\((x^{(i)},y^{(i)})(i = 1,2,...,m)\)可以采用拟合函数如下:\(h_\theta(x)=\theta_0+\theta_1x。\)
  4. 损失函数(loss function):为评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本\((x_i,y_i)(i=1,2,3...,m)\),采用线性回归,损失函数为:
\[J(\theta_0,\theta_1)=\sum_{i=1}^m(h_\theta(x_i)-y_i)^2
\]

其中,\(x_i表示第i个样本特征,y_i表示第i个样本对应的输出,h_\theta(x_i)\)为假设函数

3.3 梯度下降的详细算法

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

1、先决条件:确定优化模型的假设函数和损失函数

比如对于线性回归,假设函数表示为:\(h_\theta(x_1, x_2, ...x_n) = \theta_0 + \theta_{1}x_1 + ... + \theta_{n}x_{n}\),其中>>\(\theta_i(i=0,1,2,...,n)\)为模型参数,\(x_i(i=0,1,2...,n)\)为每个样本的n个特征值,增加一个特征\(x_0=1\),可简化为:

\[h_\theta(x_0, x_1, ...x_n) = \sum\limits_{i=0}^{n}\theta_{i}x_{i}
\]

对应于上面的假设函数,损失函数为:

\[J(\theta_0, \theta_1..., \theta_n) = \frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)^2
\]

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

3、算法过程:

1) 确定当前位置的损失函数的梯度,对于\(\theta_i\)其梯度表达式为:

\[\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1...,\theta_n)
\]
  1. 用步长乘以损失函数的梯度,得到当前下降的距离,即\(\alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)\)对应于前面登山例子中的某一步。
  2. 确定是否所有的\(θ_i\),梯度下降的距离都小于ε,如果小于ε则算法终止,当前所有的\(θ_i(i=0,1,...n)\)即为最终结果。否则进入步骤4.
  3. 更新所有的θ,对于\(θ_i\),其更新表达式如下。更新完毕后继续转入步骤1.
\[\theta_i = \theta_i - \alpha\frac{\partial}{\partial\theta_i}J(\theta_0, \theta_1..., \theta_n)
\]

以线性回归为例来具体描述梯度下降。

假设样本是:\((x_1^{(0)},x_2^{(0)},...x_n^{(0)},y_0),(x_1^{(1)}, x_2^{(1)},...x_n^{(1)},y_1),...(x_1^{(m)},x_2^{(m)}, ...x_n^{(m)}, y_m)\)

损失函数如前面先决条件所讲的:\(J(\theta_0,\theta_1...,\theta_n)=\frac{1}{2m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)},x_1^{(j)}, ...x_n^{(j)})- y_j)^2\)

则在算法过程步骤1中对于\(θ_i\) 的偏导数计算如下

\[\frac{\partial}{\partial\theta_i}J(\theta_0,\theta_1...,\theta_n)=\frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)}, x_1^{(j)}, ...x_n^{(j)}) - y_j)x_i^{(j)}
\]

由于样本中没有x0上式中令所有的\(x^j_0\)为1.

步骤4中的\(\theta_i\)的更新表达式如下:

\[\theta_i=\theta_i-\alpha\frac{1}{m}\sum\limits_{j=0}^{m}(h_\theta(x_0^{(j)},x_1^{(j)}, ...x_n^{j}) - y_j)x_i^{(j)}
\]

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

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

  1. 先决条件: 和3.3.1类似,需要确认优化模型的假设函数和损失函数。

对于线性回归,假设函数\(h_\theta(x_1, x_2, ...x_n)=\theta_0+\theta_{1}x_1+...+\theta_{n}x_{n}\)的矩阵表达式是:

\[h_\mathbf{\theta}(\mathbf{X})=\mathbf{X\theta}
\]

其中,假设函数\(h_\mathbf{\theta}(\mathbf{X})\)为m x 1的向量,里面有n+1个代数法的模型参数。X为mx(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。

损失函数表达式为:\(J(\mathbf\theta)=\frac{1}{2}(\mathbf{X\theta}-\mathbf{Y})^T(\mathbf{X\theta}-\mathbf{Y})\),其中Y是样本的输出向量,,维度为mx1

  1. 算法相关参数初始化:和代数法一样
  2. 算法过程:
  1. 确定当前位置的损失函数的梯度,对于\(\theta\)向量,其梯度表达式如下:
\[\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta)
\]
  1. 用步长乘以损失函数的梯度,得到当前位置下降的距离,即\(\alpha\frac{\partial}{\partial\theta}J(\theta)\)对于前面登山例子中的某一步
  2. 确定\(\theta\)向量里面的每个值,梯度下降的距离都小于\(\varepsilon\),如果小于\(\varepsilon\)则算法停止,当前\(\theta\)向量即为最终结果。否则进入第4步
  3. 更新\(\theta\)向量,其更新表达式如下。更新完毕后继续转步骤1
\[\mathbf\theta=\mathbf\theta-\alpha\frac{\partial}{\partial\theta}J(\mathbf\theta)
\]

以线性回归为例:

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

\[\frac{\partial}{\partial\mathbf\theta}J(\mathbf\theta)=\mathbf{X}^T(\mathbf{X\theta}-\mathbf{Y})
\]

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

\[\mathbf\theta=\mathbf\theta-\alpha\mathbf{X}^T(\mathbf{X\theta}-\mathbf{Y})
\]

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

\[公式1:\frac{\partial}{\partial\mathbf{x}}(\mathbf{x^Tx}) =2\mathbf{x}\;\;x为向量
\]
\[公式2:\nabla_Xf(AX+B) = A^T\nabla_Yf,\;\; Y=AX+B,\;\;f(Y)为标量
\]

3.4 梯度下降的算法调优

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

  1. 算法步长选择。
  2. 算法参数的初始值选择。
  3. 归一化。于样本不同特征的取值范围不一样,可能导致迭代很慢,为了减少特征取值的影响,可以对特征数据归一化,也就是对于每个特征x,求出它的期望\(\overline{x}\)和标准差std(x),然后转化为:
\[\frac{x - \overline{x}}{std(x)}
\]

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

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

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

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

\[\theta_i=\theta_i-\alpha\sum\limits_{j=1}^{m}(h_\theta(x_0^{(j)},x_1^{(j)},...x_n^{(j)})-y_j)x_i^{(j)}
\]

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

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

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

\[\theta_i=\theta_i-\alpha(h_\theta(x_0^{(j)},x_1^{(j)},...x_n^{(j)})-y_j)x_i^{(j)}
\]

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

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

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

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

\[\theta_i=\theta_i-\alpha\sum\limits_{j=t}^{t+x-1}(h_\theta(x_0^{(j)},x_1^{(j)},...x_n^{(j)})-y_j)x_i^{(j)}
\]

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

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

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

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

参考:https://www.cnblogs.com/pinard/p/5970503.html

梯度下降(Gradient Descent)法的更多相关文章

  1. 梯度下降(Gradient Descent)小结 -2017.7.20

    在求解算法的模型函数时,常用到梯度下降(Gradient Descent)和最小二乘法,下面讨论梯度下降的线性模型(linear model). 1.问题引入 给定一组训练集合(training se ...

  2. 机器学习(1)之梯度下降(gradient descent)

    机器学习(1)之梯度下降(gradient descent) 题记:最近零碎的时间都在学习Andrew Ng的machine learning,因此就有了这些笔记. 梯度下降是线性回归的一种(Line ...

  3. 梯度下降(gradient descent)算法简介

    梯度下降法是一个最优化算法,通常也称为最速下降法.最速下降法是求解无约束优化问题最简单和最古老的方法之一,虽然现在已经不具有实用性,但是许多有效算法都是以它为基础进行改进和修正而得到的.最速下降法是用 ...

  4. (二)深入梯度下降(Gradient Descent)算法

    一直以来都以为自己对一些算法已经理解了,直到最近才发现,梯度下降都理解的不好. 1 问题的引出 对于上篇中讲到的线性回归,先化一个为一个特征θ1,θ0为偏置项,最后列出的误差函数如下图所示: 手动求解 ...

  5. CS229 2.深入梯度下降(Gradient Descent)算法

    1 问题的引出 对于上篇中讲到的线性回归,先化一个为一个特征θ1,θ0为偏置项,最后列出的误差函数如下图所示: 手动求解 目标是优化J(θ1),得到其最小化,下图中的×为y(i),下面给出TrainS ...

  6. 梯度下降(Gradient descent)

    首先,我们继续上一篇文章中的例子,在这里我们增加一个特征,也即卧室数量,如下表格所示: 因为在上一篇中引入了一些符号,所以这里再次补充说明一下: x‘s:在这里是一个二维的向量,例如:x1(i)第i间 ...

  7. 机器学习中的数学(1)-回归(regression)、梯度下降(gradient descent)

    版权声明: 本文由LeftNotEasy所有,发布于http://leftnoteasy.cnblogs.com.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 前言: ...

  8. 回归(regression)、梯度下降(gradient descent)

    本文由LeftNotEasy所有,发布于http://leftnoteasy.cnblogs.com.如果转载,请注明出处,在未经作者同意下将本文用于商业用途,将追究其法律责任. 前言: 上次写过一篇 ...

  9. 吴恩达深度学习:2.3梯度下降Gradient Descent

    1.用梯度下降算法来训练或者学习训练集上的参数w和b,如下所示,第一行是logistic回归算法,第二行是成本函数J,它被定义为1/m的损失函数之和,损失函数可以衡量你的算法的效果,每一个训练样例都输 ...

  10. 梯度下降算法 Gradient Descent

    梯度下降算法 Gradient Descent 梯度下降算法是一种被广泛使用的优化算法.在读论文的时候碰到了一种参数优化问题: 在函数\(F\)中有若干参数是不确定的,已知\(n\)组训练数据,期望找 ...

随机推荐

  1. tortoiseGit no git.exe found

    运行tortoiseGit之后显示找不到git.exe 原因:没有安装git,tortoiseGit是在安装了git的基础上运行的 到这里下载git并安装:https://gitforwindows. ...

  2. 海康SDK报错Structure.getFieldOrder()

    就是你调用的这个结构体以及其引用的其他结构体,可能没有getFieldOrder()的方法,你只要按照顺序把他填上去就好了.比如 public static class NET_DVR_TIME ex ...

  3. Data Warehouse - [00] 参考文献

    浪尖大数据:什么是数据仓库的架构?企业数据仓库架构如何建设? 浪尖大数据:元数据管理在数据仓库的实践应用 - 要养成终生学习的习惯 -

  4. Processing多窗口程序范例(一)

    Processing学习到一定程度必定会关注源码,关注扩展功能,其中窗口创建是值得关注的技术点(实现多窗口).下面就以一个简单范例来展开讨论. 范例代码 主程序先上: package syf.demo ...

  5. SpringCloud带你走进微服务的世界

    认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构.这些架构之间有怎样的差别呢? 单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打 ...

  6. kubernetes failed to create kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"

    错误原因 kubernetes 的文件驱动与 docker 不一致,导致镜像无法启动. docker info 可以看到驱动方式 Cgroup Driver: systemd. 解决方案 统一资源管理 ...

  7. 使用Win32控制台实现命名管道通信

    接收端: //server //命名管道采用基于连接的可靠传输方式,只能一对一传输 #include <windows.h> #include <iostream> #defi ...

  8. 面试题-RabbitMQ

    前言 在面试题系列文章中,笔者本着效率的原则,没有总结RabbitMQ相关的知识,但是当其他知识点都总结完毕后,我发现如果面试中针对我们实际使用的RabbitMQ进行深入原理的提问或者说说框架使用的注 ...

  9. Object类--toString方法--java进阶day05

    1.Object类.以及通用的类 2.toString方法 默认的toString方法,返回的是地址值(全类名再加上通过地址值算出来的十六进制哈希值) . 为什么打印语句会自动调用toString方法 ...

  10. 多态的前提--java进阶day02

    1.多态的前提条件 第一点和第二点都很好理解,第三点父类引用指向子类对象是什么意思?以下图进行讲解 我们以前的写法,如下图,叫做子类引用指向子类 那父类引用呢?就是把左边换成父类Animal即可 因为 ...