更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/

梯度下降法

在求解机器学习算法模型参数的时候,梯度下降法(gradient descent)和最小二乘法(least squares)是最经常使用的方法,由于梯度下降法衍生出的分支较多,所以在这里对梯度下降法单独做一个总结。

一、梯度下降法详解

1.1 梯度

梯度是在微积分中对多元函数的各个参数求偏导数,并且把求得的各个参数的偏导数用向量的形式表达出来。

例如函数\(L(\omega,b)\),分别对\(\omega\)和\(b\)求偏导数,梯度向量就是\(({\frac{\partial{L}}{\partial{\omega}}},{\frac{\partial{L}}{\partial{b}}})^T\),简称\(grad{L(\omega,b)}\)或者\(\nabla{L(\omega,b)}\)。对于某个具体的点\((\omega_i,b_i)\)的具体梯度向量就是\(({\frac{\partial{L}}{\partial{\omega_i}}},{\frac{\partial{L}}{\partial{b_i}}})^T\)或者\(\nabla{L(\omega_i,b_i)}\),如果是多参数的函数则是\(({\frac{\partial{L}}{\partial{x}}},{\frac{\partial{L}}{\partial{y}}},{\frac{\partial{L}}{\partial{z}}})^T\)。

1.2 梯度下降法和梯度上升法

在机器学习算法中,如果需要最小化目标函数时,则可以通过梯度下降法一步一步的迭代求解,得到最小化的目标函数和模型参数值;如果要最大化目标函数时,则可以通过梯度上升法迭代求解。

梯度下降算法和梯度上升法之间也可以互相转化,可以通过梯度下降迭代最小化目标函数,同时也可以反向梯度上升迭代最小化目标函数;同理也可以反向梯度下降迭代最大化目标函数。

1.3 梯度下降

假设我们处在某座不知名的大山上的某处位置,由于我们不知道该怎么下山,于是决定走一步算一步,即每走到一个位置的时候便求解当前位置的梯度,沿着梯度的负方向即当前最陡峭的位置向下走一步,然后继续求解当前位置的梯度……直到我们认为我们已经到了山脚才停下来。从下图可以看出,通过该方法我们有可能走到了这座大山的某一个局部的最低处(山腰处),而没有走到真正的山脚。

从下山这个实例中可以得出:梯度下降不一定能够找到全局的最优解,有可能会找到局部最优解。

但是如果代价函数为凸函数的时候梯度下降得到的则一定是全局最优解。

1.4 相关概念

1.4.1 步长

步长决定了梯度下降迭代的时候每一步沿梯度负方向前进的长度,下山实例中则表示每一步的长度。

如果步长过长,则可能会错过最优解;如果步长过小,迭代速度会变慢,很长时间算法都不会结束。因此可以从大到小的尝试步长的大小,如果目标函数值在变小,说明取值有效,否则需要增大步长。

1.4.2 假设函数

以线性模型举例,线性模型的假设函数为预测值的预测函数,即通过输入特征\((x_1,x_2,\ldots,x_n)\)输出一个对应的预测值\(\hat{y}\),线性模型的假设函数为
\[
\hat{y} = f(x) = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b
\]

1.4.3 目标函数

目标函数常用来度量模型拟合的程度,以线性模型举例,线性模型一般使用均方误差度量模型性能,线性模型的目标函数为
\[
J(\omega,b) = \sum_{i=1}^m (y_i - \hat{y_{i}})^2
\]

二、梯度下降法流程

2.1 梯度下降法——代数法

假设现有一个目标函数\(J(\omega_0,\omega_1,\ldots,\omega_n)\)。

  1. 初始化参数\(\omega_0=0,\omega_1=0,\ldots,\omega_n=0\),也可以初始化成趋近于\(0\)的较小值;自定义步长\(\alpha=1\);自定义阈值\(\epsilon\)
  2. 计算当前位置的目标函数的梯度\({\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)}\)
  3. 使用步长乘以目标函数的梯度得\(\alpha{\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)}\)
  4. 如果所有的\(\omega_i\)的梯度下降的距离都小于阈值,则算法停止,当前的\(\omega_0,\omega_1,\ldots,\omega_n\)即为最终结果;否则继续下一步
  5. 更新所有的\(\omega\),更新公式为\(\omega_i = \omega_i - \alpha{\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)}\)更新成功后从步骤2继续开始

2.2 梯度下降法——矩阵法

这一部分主要用到了矩阵的基本计算和求导,首先对假设函数和目标函数矩阵化。

假设现有一个假设函数
\[
\hat{y} = \omega_1x_1 + \omega_2x_2 + \cdots + \omega_nx_n + b = X^T\omega
\]
其中\(X^T\omega\)是假设函数的矩阵表达(把\(b\)看做\(\omega_0x_0, \quad x_0=1\)),其中\(X^T\)是\(m*(n+1)\)维的特征矩阵(\(m\)为样本数,\(n\)为特征数),\(\omega\)是\((n+1)*1\)维的向量,则通过矩阵的计算得知\(X^T\omega\)是一个\(m*1\)维的向量。

假设函数的转换即可得矩阵表达的目标函数,即
\[
J(\theta)={\frac{1}{2}}(X\omega-Y)^T(X\omega-Y)
\]
其中\(Y\)是\(m*1\)维的样本向量。

  1. 初始化向量\(\omega\)的每个元素为0,也可以初始化成趋近于\(0\)的较小值;自定义步长\(\alpha=1\);自定义阈值\(\epsilon\)
  2. 计算当前位置的目标函数的梯度,对于向量\(\omega\),其梯度表达式为\({\frac{\partial}{\partial\omega}}J(\omega)\)
  3. 使用步长乘以目标函数的梯度得\(\alpha{\frac{\partial}{\partial\omega}}J(\omega)\)
  4. 如果向量\(\omega\)内的每个元素都梯度下降的距离都小于阈值,则算法停止,当前的\(\omega\)即为最终结果;否则继续下一步
  5. 更新所有的\(\omega\),更新公式为\(\omega = \omega - \alpha{\frac{\partial}{\partial\omega}}J(\omega)\)更新成功后从步骤2继续开始

2.3 三种不同形式的梯度下降法

三种不同形式的梯度下降法步骤都是相同的,只是在更新参数的时候选择的样本数量不同,如果不关心样本数量,梯度下降法的更新公式为
\[
\omega_i = \omega_i - \alpha{\frac{\partial}{\partial{\omega_i}}J(\omega_0,\omega_1,\ldots,\omega_n)}
\]
接下来的参数更新公式以均方误差线性回归模型举例,均方误差线性回归模型的目标函数对参数\(\omega\)的求偏导公式为
\[
\nabla{L(\omega_i)}=\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)}
\]
其中\(m\)是样本数,\({x_j}^{i}\)是第\(j\)个样本的第\(i\)个特征。

2.3.1 批量梯度下降法

批量梯度下降法(batch gradient descent)是最常用的做法,它使用所有的样本更新参数,它的参数更新公式为
\[
\omega_i = \omega_i - \alpha\sum_{j=0}^m(\hat{y_j}-y_j){x_i}^{(j)}
\]

2.3.2 随机梯度下降法

随机梯度下降法(stochastic gradient descent)类似于批量梯度下降法,但是它随机的使用第\(j\)个样本更新参数,它的参数更新公式为
\[
\omega_i = \omega_i - \alpha(\hat{y_j}-y_j){x_i}^{(j)}
\]

2.3.3 小批量梯度下降法

小批量梯度下降法(mini-batch gradient descent)属于批量下降法和随机梯度下降法的折中方法,即对于\(m\)样本,随机选定\(x\)个样本更新参数,一般\(x=10\)。假设这\(x\)样本的集合为\(D\),它的参数更新公式为
\[
\omega_i = \omega_i - \alpha\sum_{j\in{D}} (\hat{y_j}-y_j){x_i}^{(j)}
\]

批量梯度下降法使用所有的样本更新参数,计算量大,准确度高,但是更新速度慢。

随机梯度下降法随机使用一个样本更新参数,计算量小,更新速度快,但是准确度不高,并且由于使用一个样本更新参数,算法收敛速度慢。

小批量梯度下降法属于批量梯度下降法和随机梯度下降法的折中方法,但是采用的错误样本数需要具体问题去分析,否则采用错误的样本数量容易导致更新速度慢而且准确度也不高。

三、梯度下降法优缺点

3.1 优点

  1. 如果目标函数是凸函数,可以获得全局最小值
  2. 样本量很大的时候可以选择随机梯度下降法或者小批量梯度下降法,相对于最小二乘法灵活
  3. 迭代时间相较于牛顿法更快

3.2 缺点

  1. 步长需要人为控制,如果步长小了则目标函数收敛速度会变慢;步长大了容易错过最优解
  2. 初始值设定不同获得的最小值也有可能不同,即梯度下降法只能获得局部最小值

A-02 梯度下降法的更多相关文章

  1. OpenACC 梯度下降法求解线性方程的优化

    ▶ 书上第二章,用一系列步骤优化梯度下降法解线性方程组.才发现 PGI community 编译器不支持 Windows 下的 C++ 编译(有 pgCC 命令但是不支持 .cpp 文件,要专业版才支 ...

  2. [Machine Learning] 梯度下降法的三种形式BGD、SGD以及MBGD

    在应用机器学习算法时,我们通常采用梯度下降法来对采用的算法进行训练.其实,常用的梯度下降法还具体包含有三种不同的形式,它们也各自有着不同的优缺点. 下面我们以线性回归算法来对三种梯度下降法进行比较. ...

  3. 机器学习基础——梯度下降法(Gradient Descent)

    机器学习基础--梯度下降法(Gradient Descent) 看了coursea的机器学习课,知道了梯度下降法.一开始只是对其做了下简单的了解.随着内容的深入,发现梯度下降法在很多算法中都用的到,除 ...

  4. 一种利用 Cumulative Penalty 训练 L1 正则 Log-linear 模型的随机梯度下降法

    Log-Linear 模型(也叫做最大熵模型)是 NLP 领域中使用最为广泛的模型之一,其训练常采用最大似然准则,且为防止过拟合,往往在目标函数中加入(可以产生稀疏性的) L1 正则.但对于这种带 L ...

  5. coursera机器学习笔记-机器学习概论,梯度下降法

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  6. 重新发现梯度下降法--backtracking line search

    一直以为梯度下降很简单的,结果最近发现我写的一个梯度下降特别慢,后来终于找到原因:step size的选择很关键,有一种叫backtracking line search的梯度下降法就非常高效,该算法 ...

  7. 梯度下降法VS随机梯度下降法 (Python的实现)

    # -*- coding: cp936 -*- import numpy as np from scipy import stats import matplotlib.pyplot as plt # ...

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

    Gradient Descent(Batch Gradient)也就是梯度下降法是一种常用的的寻找局域最小值的方法.其主要思想就是计算当前位置的梯度,取梯度反方向并结合合适步长使其向最小值移动.通过柯 ...

  9. 理解梯度下降法(Gradient Decent)

    1. 什么是梯度下降法?   梯度下降法(Gradient Decent)是一种常用的最优化方法,是求解无约束问题最古老也是最常用的方法之一.也被称之为最速下降法.梯度下降法在机器学习中十分常见,多用 ...

  10. [DeeplearningAI笔记]改善深层神经网络_优化算法2.1_2.2_mini-batch梯度下降法

    觉得有用的话,欢迎一起讨论相互学习~Follow Me 2.1 mini-batch gradient descent mini-batch梯度下降法 我们将训练数据组合到一个大的矩阵中 \(X=\b ...

随机推荐

  1. 修改,编译,GDB调试openjdk8源码(docker环境下)

    在上一章<在docker上编译openjdk8>里,我们在docker容器内成功编译了openjdk8的源码,有没有读者朋友产生过这个念头:"能不能修改openjdk源码,构建一 ...

  2. Django系列---使用MySql数据库

    目录 1. 创建数据库 1.1. 使用utf8mb4编码 1.1.1. 确定mysql的配置文件 1.1.2. 修改配置文件 1.1.3. 重启数据库服务,检查相关字段 1.1.4. 新建数据库 1. ...

  3. .net core 部署到windows上的方法与 系统中相关问题的解决

    前言 Net core 项目部门在Windows有很多种方式,大致有以下几种, dotnet 命令, iis(windowshosts), 一些开源的应用容器(docker ) 基于一些exe 程序, ...

  4. java 中for循环中断的办法

    /* 中断for循环的办法: 1.break ***2.return是结束方法的,不是结束循环的. 3.标签的方法. 格式: 表签名:语句 运行结果:D:\test\day0413>java T ...

  5. MapReduce案例运行及分词

    首先查询进程,发现hadoop并没有启动 如何配置hadoop,参考我的另外一篇博文<Hadoop环境准备> 接下来,启动hadoop start-all.sh 或者 start-dfs. ...

  6. go 学习笔记之学习函数式编程前不要忘了函数基础

    在编程世界中向来就没有一家独大的编程风格,至少目前还是百家争鸣的春秋战国,除了众所周知的面向对象编程还有日渐流行的函数式编程,当然这也是本系列文章的重点. 越来越多的主流语言在设计的时候几乎无一例外都 ...

  7. Nginx安装及详解

    Nginx简介: Nginx(发音engine x)专为性能优化而开发的开源软件,是HTTP.反向代理.邮件代理.TCP/UDP协议代理软件,由俄罗斯的作者Igor Sysoev开发,其最知名的优点是 ...

  8. 2010年NOIP普及组复赛题解

    题目及涉及的算法: 数字统计:入门题: 接水问题:基础模拟题: 导弹拦截:动态规划.贪心: 三国游戏:贪心.博弈论. 数字统计 题目链接:洛谷 P1179 这道题目是一道基础题. 我们只需要开一个变量 ...

  9. JDK 13 都已经发布了,Java 8 依然是最爱

    在 JDK 版本的世界里,从来都是 Oracle 发他的新版本,我们继续用我们的老版本.三年之前用 JDK 7,后来终于升级到了 JDK 8.自从升级了没多久,JDK 就开始了半年发一个新版本的节奏, ...

  10. Python连载40-协程定义及状态、send语句、yield用法

    一.协程 1.历史进程: (1)3.4引入协程,用yield来实现 (2)3.5引入协程语法 (3)实现协程比较好的包有asyncio,tornado,gevent 2.定义:协程是为非抢占式多任务产 ...