在正式进入学习之前梯度下降法之前,我们先看看下面的两个问题
1.梯度下降法是用来干嘛的?
梯度下降法常用来近似求解函数的最小值问题
2.什么是梯度?
简单来说,梯度就是由偏导数构成的向量一个向量,比如对函数f(x,y)来说,其梯度就是(f’x,f’y),根据其定义,函数沿着梯度的正方向,可以最快取得极大值,而沿着梯度的反方向,能最快获得极小值。
比如给定下面的函数,要使用梯度下降的方法来近似求解最小值
利用梯度下降的方法解题步骤如下:
1、求梯度▽=2(x-1),
2、向梯度相反的方向移动x ,如下x←x-α▽,其中, α为步长。如果步长足够小,则可以保证每一次迭代都在减小,但可能导致收敛太慢,如果步长太大,则不能保证每一次迭代都减少,也不能保证收敛。
3、循环迭代步骤2,直到x的值变化到使得 x在两次迭代之间的差值足够小,比如0.00000001,也就是说,直到两次迭代计算出来的x基本没有变化,则说明此时已经达到局部最小值了。
4、此时,输出x ,其对应的f(x)即为最小值
如下给出的是python实现的代码,为了简化问题,我们把补长设置为0.05,只进行了100迭代
import matplotlib.pyplot as plt
#y=(x-1)^2+2的最最小值
x=4 #x0初值
Alpha=0.05 #步长
n=100 #迭代的次数
list_x=[]
list_n=range(n) #迭代次数列表
for i in list_n:
x=x-Alpha*2*(x-1) #2*(x-1)为其在x点的梯度
list_x.append(x)
plt.figure()
plt.xlabel("i")# X轴的文字
plt.ylabel("x_value") # Y轴的文字
plt.plot(list_n,list_x)#画x和y对应的曲线图
plt.show()
对应的迭代次数和x的值曲线图如下,很明显在第60次迭代的时候,x的取值(x=1.00000000)就基本保持不变了(该处导数已经为0)
本篇仅仅只是一个抛砖引玉,原始梯度下降法本身具有很多局限性,但是很多改进的算法都是基于它的,如之后要学习神经网络中的基础感知器
有人可能会问,这个问题也可以用求f(x)导数为0来解决最小值,本例只是为了简单的介绍梯度下降法才选择了简单的一元二次函数,一元的偏导和导数无异。其实求偏导数为0来解决最小值问题是最小二乘法的范畴,之后我们有时间再论述。