梯度下降法

一.梯度下降法:

    1.梯度的由来:

        射线L的方向余弦是,二元函数沿着这个射线,自变量变化为;

        方向导数是这个函数沿着这个方向的变化率,它的方向导数为:

        

       沿着各个方向,二元函数始终有一个方向导数,它的大小决定这个函数的变化率

        上式可以写成两个向量的乘积:

        

        由于 是单位向量,所以当和  方向相同时,方向导数的值最大,函数的变化率最大;

        称为梯度;

    

    所以我们得到这个结论,沿着梯度的逆方向,二元函数一定是下降趋势,并且下降的最快;

    对于多元函数,可以类推;N元函数的图像在N+1维空间中表示,它的梯度是N维向量;


            2.机器学习的梯度下降

        在机器学习算法中,在最小化损失函数时,可以通过梯度下降法来一步步的迭代求解,得到最小化的损失函数,和模型参数值;

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

            

            下面是转载部分,写的很详细:

      

3.2 梯度下降的相关概念

    在详细了解梯度下降的算法之前,我们先看看相关的一些概念。

    1. 步长(Learning rate):步长决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。

    2.特征(feature):指的是样本中输入部分,比如2个单特征的样本,则第一个样本特征为x(0),第一个样本输出为y(0)

    3. 假设函数(hypothesis function):在监督学习中,为了拟合输入样本,而使用的假设函数,记为hθ(x)。比如对于单个特征的m个样本x(i),y(i)(i=1,2,...m),可以采用拟合函数如下: hθ(x)=θ0+θ1x

    4. 损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。比如对于m个样本xi,yi(i=1,2,...m),采用线性回归,损失函数为:

         

     其中xi表示第i个样本特征,yi表示第i个样本对应的输出,hθ(xi)为假设函数。   

3.3 梯度下降的详细算法

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

 

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

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

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

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

         

        注 :我们来 考察一下这个函数,当m=1,n=1时,函数变成:,这时一个凸函数,

            当m=1,x向量维度大于1时,J依然是凸函数;m大于1,意味着多个凸函数相加,还是凸函数;

            所以,线性回归模型loss函数是凸函数;可以放心使用梯度下降;

        

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

    3. 算法过程:

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

                     

      2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即

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

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

        

    下面用线性回归的例子来具体描述梯度下降。

    样本如下:


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

     

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

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

       

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

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

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

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

    1. 先决条件: 和3.3.1类似, 需要确认优化模型的假设函数和损失函数。对于线性回归,假设函数hθ(x1,x2,...xn)=θ0+θ1x1+...+θnxn的矩阵表达方式为:

     hθ(x)=Xθ ,其中, 假设函数hθ(X)为mx1的向量,θ为(n+1)x1的向量,里面有n个代数法的模型参数。X为mx(n+1)维的矩阵。m代表样本的个数,n+1代表样本的特征数。

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

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

    3. 算法过程:

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

       

      2)用步长乘以损失函数的梯度,得到当前位置下降的距离,即

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

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

                 


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

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

      

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

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

      公式1:

      公式2:

    

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

1. 批量梯度下降法

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

    

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

            注:x是n维向量,每次迭代需要m*n^2次计算,k次迭代,所以这个算法复杂度为k*m*n^2;

        当样本量(m,n)较大时,需很长时间计算才能得到一个较好的结果;


 2 随机梯度下降法

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

   

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

  

    对于随机梯度下降法的解释:

        

        对于每一个样本,loss函数可以看做为每一个样本自身误差之和:

        

         

        因为X和Y本身的一些相关性,每个具有相似性,每次使一个梯度下降,则使总体的有所下降;

    注意:1.“随机梯度下降法最终不能获得“批量梯度下降”的“最优解”,一般要稍差一点,往往是在全局最优解附近,

                数据样本越多,可能效果越好,适用于大规模训练样本情况

      2.随机梯度下降法并不是一直在下降,随机梯度可能使loss函数抖动,但是总体方向是下降的,如下图:

        

    3.随机梯度下降法的特殊应用场景:

            当有新的数据时,直接通过上式更新θ,这就是所谓的online learning。

    4.随机梯度下降法迭代次数比“批量梯度下降”多,增加的迭代次数远远小于样本的数量,所以“随机梯度下降法”时间是“批量梯度下降”的B/m;B是迭代次数倍数;

    

      3.小批量梯度下降法

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

    

       随机梯度下降法有相似之处;  

       
        三种方法python实现代码如下:
            
import numpy as np
import pandas as pd
#定义一个简单的数据,使得数据符合y=x1+x2
df = pd.DataFrame({'x1':[1,2,3,4,5,6],'x2':[1,2,1,2,1,2],'y':[2,4,4,6,6,8]})
x = df[['x1','x2']].values
y = df['y'].values.reshape([-1,1])
#print(df)

#批量梯度下降------迭代
the = 1e-6
max_iter = 500
theta = np.array([[0],[0]])
alpha = 0.01
for time in range(max_iter):
    theta = theta - alpha * x.T.dot(x.dot(theta)-y)
    loss = np.power(x.dot(theta)-y,2).sum()   #
    #print(x.dot(theta))
    print('loss值为%f \ntheta值为\n'%loss,theta)
    if loss < the:
        break
#随机梯度下降------迭代
theta = np.array([0,0])
alpha = 0.1
import random
for j in range(1000):
    for i in range(5):
        print(i)
        theta = theta - alpha* (x[i].dot(theta)-y[i])*x[i]
        loss = np.power(x.dot(theta)-y,2).sum()
        print('loss值为%f theta值为\n'%loss,theta)  
#小批量梯度下降------初始化theta,给定一个alpha
theta_m = np.array([[0],[0]])
alpha_m = 0.03
flag = True
for i in range(3):
    theta_m = theta_m - alpha_m * x[i:i+2].T.dot(x[i:i+2].dot(theta_m)-y[i:i+2])
    loss = np.power(x.dot(theta_m)-y,2).sum()
    print('loss值为%f theta值为\n'%loss,theta_m.values)  

    3.5  梯度下降的算法调优:

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

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

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

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

     

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



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

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

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

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


        


感谢各位大神:

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

    https://blog.csdn.net/pipisorry/article/details/23692455



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值