关于梯度下降有关的理解及表述

一、写在前面

    1、首先说明,本人是机器学习小白,刚开始接触这一个领域,很多知识会了解的不是特别全面,在今后的学习过程中,会和大家一起努力、进步,在本博客中仅仅写梯度下降的相关内容,并不会做相关的拓展。望周知。

    2、梯度法是求解无约束多元函数极值的最早的数值方法,很多机器学习的常用算法都是以它作为算法框架,进行改进和修正而导出更为复杂的优化方法。因此,梯度法可以认为是计算机求解优化问题的基本算法框架。其重要性不言而喻。

    3、经编写的博客如果发现了问题,望指正。

二、梯度下降原理

    1、梯度的数学表述

    在高等数学的学习过程中,由于方向导数的学习是在梯度之前开始的,这里由方向导数开始表述。

        1.1、方向导数定义

        设函数z=f(x,y)在点P(x,y)的某一邻域U(P)内有定义。自点P引射线L,设x轴正向到射线L的转角为ϕ,并设 P(x+Δx,y+Δy)为L上的另一点且P’∈U(P),考虑函数的增量f(x+Δx,y+Δy)-f(x,y)与P,P’两点间的距离ρ=的比值。当P沿着L趋于P时,如果这个比的极限存在,则称该极限为函数f(x,y)在点P沿方向L的方向导数,记作=

        1.2、方向导数的理解

        方向导数是函数z=f(x,y)在一点P沿某一方向的变化率,若函数在P0(x0,y0)的偏导数存在,则函数f(x,y)在点P0沿着x轴正向e1=(1,0)、y轴正向e2=(0,1)的方向导数分别为f’x(x0,y0),f’y(x0,y0)。

        1.3、梯度定义

        设函数z=f(x,y)在平面区域D内具有一阶连续偏导数,则对每一点(x,y)∈D,都可确定一个向量i+j,则该向量称为函数z=(x,y)在P(x,y)的梯度,记作gradf(x,y),即gradf(x,y)=i+j 。三元函数u=f(x,y,z)与二元函数z=f(x,y)大体一致,可通过类比推导得到。

        1.4、梯度的理解

        由定义易知,梯度的方向是函数f(x,y)或者f(x,y,z)在该点增长最快的方向。因为函数在某点的梯度是与该点的最大方向导数的方向一致的向量,它的模为方向导数的最大值。反之梯度的反方向则是函数f(x,y)或者f(x,y,z)在该店下降最快的方向。

    2、梯度下降的数学表述

    这里仅表述最速下降法的一种一般表示,即:

                    w(n+1)=w(n)-ηg(n)

    这里η是一个正常数,称为步长(stepsize)或学习率(learning-rate),g(n)是在w(n)处的梯度向量值。在从迭代n到n+1的过程中算法应用修正。

    3、梯度下降的理解

        梯度是一个向量场,标量场中某一点上的梯度指向的是标量场增长最快的方向,梯度的长度是这个最大的变化率。梯度下降,就是利用负梯度方向来决定每次迭代的新的搜索方向,从而使得在每次迭代过程中,都能让待优化的目标函数逐步减小。梯度下降法使用的是二范数下的最速下降法。在函数f(x)的2范数是x在区间(a,b)上f(x)平方的积分再开根号。最速下降法收敛到最优解w*的速度是很慢的,其中学习率参数η对收敛行为有重要影响:当η比较小的时候,算法的瞬时响应是较为平缓的;当η较大的时候,算法的瞬时响应是比较剧烈的,其轨迹为之字形;当η超出某一临界值时,算法将不收敛,达不到目标要求。分别如下图3.1、3.2、3.3所示(以二次函数f(x)=为例)




    4、梯度下降的几种使用策略

    由于梯度下降是由梯度的负方向作为变量的变化方向,所以在多个维度下使用梯度下降就容易产生局部最优解,为了合理的解决这种问题,便出现了BGD,SGD和MBGD三种调优策略(训练方式),它们依次分别为批量随机下降法、随机梯度下降法和小批量随机下降法。

        4.1 批量梯度下降法(BGD)

        该方法每次迭代所有样本,优点是迭代的结果精确,可以得到全局最优解,在样本量大的情况下,运行效率会很差,因为每次迭代会用到训练集中所有的数据。公式为:

                                w(n+1)=w(n)-η

        4.2 随机梯度下降法(SGD)

        该方法每次迭代仅使用一组样本,每次随机抽取,训练后按梯度更新一次,然后重复抽取更新的操作,在使用这种方法的时候不需要完全取到所有的数据样本便可以得到一个相对最优的迭代结果。公式为:

                                w(n+1)=w(n)-η

        4.3 小批量梯度下降法(MBGD)

        该方法结合了BGD和SGD的两种方法,每次迭代使用给定的数值t组样本,公式为:

                                w(n+1)=w(n)-η

    5、梯度下降的应用场景

    梯度下降法作为一种求解无约束最优化问题的常用方法。应用场景主要由以下两种:

    一种是对于多组数据(xi,yi)做线性拟合,特别是在机器学习中训练回归模型时使用Logistics回归算法时,可以对于高次多项式系数为零的情况下使用梯度下降法做降维处理。

    另一种是二分类模型中的线性分类模型,它是一种最简单和基本的分类器,深度学习、支持向量机、神经网络等非线性分类器都以其为理论基础,线性分类器也是最早的神经网络模型也被称作为感知器模型。

三、梯度下降图形与代码表述

    1、有关梯度下降的一维图例(使用的函数为y=x^2+3*x+2):

# _*_ coding:utf-8 _*_
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt

#此处已将matplotlib默认字体修改,所以只添加了如下一行设置中文显示问题的代码
mpl.rcParams['axes.unicode_minus']=False

#原函数与导函数
def f1(x):
    return x**2+3*x+2
def h1(x):
    return 2*x+3

#初始值设置
X = []
Y = []
x = 4
alpha = 0.2
y_current = f1(4)
y_dis = y_current
X.append(x)
Y.append(y_current)
num_count = 0
#循环生成X、Y列表
while y_dis > 1e-6 and num_count < 30:
    num_count += 1
    x = x - alpha * h1(x)
    y_dis = np.abs(y_current - h1(x))
    y_current = f1(x)
    X.append(x)
    Y.append(y_current)

#设置原始数据
XX=np.arange(-7.3,4.4,0.1)
YY=np.array(list(map(lambda x:f1(x),XX)))

#设置画板颜色
plt.figure(facecolor='#abcdef')
#画出两条线
plt.plot(X,Y,'ro-')
plt.plot(XX,YY,'b-',linewidth=2)
#设置图像标题
plt.title('函数:$y=x^2+3*x+2$\n学习率:%.3f 最终解:(%.3f,%.3f)迭代次数:%d'%(alpha,x,y_current,num_count))
#设置y轴范围
plt.ylim(-5,45)
#设置x轴标签,此次用于生成图例
plt.xlabel('\n图4.1')
#设置网格线显示
plt.grid(True)
#显示图像
plt.show()

    2、有关梯度下降的二维图例(函数为z=sin(xy))


# _*_ coding:utf-8 _*_
import numpy as np
import matplotlib as mpl
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib.colors import LinearSegmentedColormap

#解决中文显示问题
mpl.rcParams['axes.unicode_minus']=False

#定义原函数与偏导函数
def f1(x,y):
    return np.sin(x*y)
def hx1(x,y):
    return y*np.cos(x*y)
def hy1(x,y):
    return x*np.cos(x*y)

#数据初始化
X=[]
Y=[]
Z=[]
x=3.8
y=3.7
alpha=0.01
z_current=f1(x,y)
z_dis=z_current
num_count=0
#列表更新
while z_dis>1e-3 and num_count<100:
    num_count+=1
    prx=x
    x=x-alpha*hx1(x,y)
    y=y-alpha*hy1(prx,y)
    z_dis=np.abs(z_current-f1(x,y))
    z_current=f1(x,y)
    X.append(x)
    Y.append(y)
    Z.append(z_current)
# print(X)
# print(Y)
# print(Z)

#原始图像数据
X1=np.arange(2.1,5.1,0.1)
Y1=np.arange(2.1,5.1,0.1)
X1,Y1=np.meshgrid(X1,Y1)
Z1=np.array(list(map(lambda a,b:f1(a,b),X1,Y1)))
Z1.shape=X1.shape


#Jupyter Notebook中使用时在行内显示
#%matplotlib tk

#绘图
fig=plt.figure(facecolor='#abcdef')
ax=Axes3D(fig)
ax.plot_surface(X1,Y1,Z1,rstride=1,cstride=1,cmap='rainbow')
#RGB颜色对照表
#colors=['#121856','#12564d']
#本想使用LinearSegmenttedColormap.from_list函数生成一条颜色渐变的直线便于观看但是并未解决
#cmap=LinearSegmentedColormap.from_list('jbs',colors,N=50,gamma=1.0)
ax.plot(X,Y,Z,'ro-',linewidth=2)
#ax.plot(X,Y,Z,cmap=cmap,alpha=0.9)

ax.set_xlabel('X轴\n图1.3')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
#设置图标题
ax.set_title('梯度下降y=sin(xy)\n学习率为%.3f,最终解为(%.3f,%.3f,%.3f),迭代次数为%d'%(alpha,x,y,z_current,num_count))
#展示图像
plt.show()

四、python版本说明

    本程序使用Anaconda3 4.2.0 64-bit运行,对应python3.5.2版本

五、参考文献及资料

    [1]陈秀,张霞. 高等数学. 北京:高等教育出版社2011年2月。

    [2]郑捷. 机器学习算法原理与编程实践. 北京:电子工业出版社2015年11月。

    [3]麦好. 机器学习实践指南案例应用解析. 北京:机械工业出版社,2014年4月。

    [4]Simon Haykin.申富饶等译.神经网络与机器学习. 北京:机械工业出版社,2011年1月。


猜你喜欢

转载自blog.csdn.net/qq_37972530/article/details/79434131