zoukankan      html  css  js  c++  java
  • 梯度下降算法的简单理解

    梯度下降算法的简单理解

    1 问题的引出

    在线性回归模型中,先设一个特征x与系数θ1,θ0,最后列出的误差函数如下图所示:

    手动求解

    目标是优化得到其最小化的J(θ1),下图中的×为y(i),下面给出TrainSet:{(1,1),(2,2),(3,3)}通过手动寻找来找到最优解,由图可见当θ1取1时,与y(i)完全重合,J(θ1) = 0

    下面是θ1的取值与对应的J(θ1)变化情况

    由此可见,最优解即为0,现在来看通过梯度下降法来自动找到最优解,对于上述待优化问题,下图给出其三维图像,可见要找到最优解,就要不断向下探索,使得J(θ)最小即可。

    2 梯度下降的几何形式

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

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

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

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

    3 梯度下降的原理

    导数的概念

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

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

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

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

    下图就是寻找过程

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

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

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

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

    小结

    梯度下降法是最早最简单,也是最为常用的最优化方法。当目标函数是凸函数时,梯度下降法的解是全局解。一般情况下,其解不保证是全局最优解,梯度下降法的速度也未必是最快的。梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是”最速下降法“。最速下降法越接近目标值,步长越小,前进越慢,步长越大,误差越大。梯度下降法的搜索迭代示意图如下图所示:

    梯度下降法的缺点:

      (1)靠近极小值时收敛速度减慢,如下图所示;

      (2)直线搜索时可能会产生一些问题;

      (3)可能会“之字形”地下降。

    4 两种方法

    在机器学习中,基于基本的梯度下降法发展了两种梯度下降方法,分别为随机梯度下降法和批量梯度下降法。

    比如对一个线性回归(Linear Logistics)模型,假设下面的h(x)是要拟合的函数,J(theta)为损失函数,theta是参数,要迭代求解的值,theta求解出来了那最终要拟合的函数h(theta)就出来了。其中m是训练集的样本个数,n是特征的个数。

     

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

    (1)将J(theta)对theta求偏导,得到每个theta对应的的梯度:

    (2)由于是要最小化风险函数,所以按每个参数theta的梯度负方向,来更新每个theta:

    (3)从上面公式可以注意到,它得到的是一个全局最优解,但是每迭代一步,都要用到训练集所有的数据,如果m很大,那么可想而知这种方法的迭代速度会相当的慢。所以,这就引入了另外一种方法——随机梯度下降。

    对于批量梯度下降法,样本个数m,x为n维向量,一次迭代需要把m个样本全部带入计算,迭代一次计算量为m*n2

    2)随机梯度下降(Stochastic Gradient Descent,SGD)

    (1)上面的风险函数可以写成如下这种形式,损失函数对应的是训练集中每个样本的粒度,而上面批量梯度下降对应的是所有的训练样本:

    (2)每个样本的损失函数,对theta求偏导得到对应梯度,来更新theta:

    (3)随机梯度下降是通过每个样本来迭代更新一次,如果样本量很大的情况(例如几十万),那么可能只用其中几万条或者几千条的样本,就已经将theta迭代到最优解了,对比上面的批量梯度下降,迭代一次需要用到十几万训练样本,一次迭代不可能最优,如果迭代10次的话就需要遍历训练样本10次。但是,SGD伴随的一个问题是噪音较BGD要多,使得SGD并不是每次迭代都向着整体最优化方向。

    随机梯度下降每次迭代只使用一个样本,迭代一次计算量为n2,当样本个数m很大的时候,随机梯度下降迭代一次的速度要远高于批量梯度下降方法。两者的关系可以这样理解:随机梯度下降方法以损失很小的一部分精确度和增加一定数量的迭代次数为代价,换取了总体的优化效率的提升。增加的迭代次数远远小于样本的数量。

    对批量梯度下降法和随机梯度下降法的总结:

    批量梯度下降---最小化所有训练样本的损失函数,使得最终求解的是全局的最优解,即求解的参数是使得风险函数最小,但是对于大规模样本问题效率低下。

    随机梯度下降---最小化每条样本的损失函数,虽然不是每次迭代得到的损失函数都向着全局最优方向, 但是大的整体的方向是向全局最优解的,最终的结果往往是在全局最优解附近,适用于大规模训练样本情况。   

    5 其他

    对于样本数量额非常之多的情况,Batch Gradient Descent算法会非常耗时,因为每次迭代都要遍历所有样本,可选用Stochastic Gradient Descent 算法,需要注意外层循环Loop,因为只遍历一次样本,不见得会收敛。

    随机梯度算法就可以用作在线学习了,但是注意随机梯度的结果并非完全收敛,而是在收敛结果处波动的,可能由非线性可分的样本引起来的:

    可以有如下解决办法:(来自MLIA)

    1. 动态更改学习速率a的大小,可以增大或者减小

    2. 随机选样本进行学习 

  • 相关阅读:
    jQuery里的$.ajax()方法详解
    express框架使用axios进行post请求, 两次请求问题
    electron-vue 报错 Unresolved node modules: bufferutil, utf-8-validate, canvas
    electron-vue离线打包
    个推技术:性能提升60%↑ 成本降低50%↓ Spark性能调优看这篇就够了!
    百亿级日志流分析实践 | 剖析个推后效分析功能实现原理
    iOS开发常用国外网站清单
    一篇文章搞定Git——Git代码管理及使用规范
    音视频技术入门——音频处理
    Java内存空间知识点梳理
  • 原文地址:https://www.cnblogs.com/jayechan/p/9510981.html
Copyright © 2011-2022 走看看