老饼讲解:一步一步上手学习
上节我们已经讲了梯度算法的原理,那么这节我们就来讲下梯度算法的实现,作为初步上手,我们先手算一遍,加深理解,然后再用代码来实现,这样就彻底弄懂梯度下降算法的具体实现步骤了。
梯度下降算法简单来说,就是将解按负梯度方向不断迭代,直到满足终止条件,由于需要用到目标函数梯度,所以一般需要先算出梯度公式,以方便迭代过程中计算梯度

总的来说,梯度下降算法在实现过程中,需要如下四步:
1. 梯度公式准备 :计算目标函数的梯度
2. 初始化解与参数:设置好解的初始值和学习率
3. 按负梯度更新解:按照负梯度将解不断迭代
4. 终止条件判断 :直到梯度极小,就停止迭代
我们就以一个简单的二元函数为例,用梯度下降算法来求函数在什么时候取得最小值,下面我们先一步一步地的算,来看看具体过程是怎么样的。
求 为何值时,取得最小值,其中:
易知道, 在 处取得的最小值为0 ,下面展示用梯度下降法寻找解的具体过程,看结果是否与我们预期一致。
使用梯度算法求解上面的问题是较为简单的,下面我们就一步一步来手算一下。
1、梯度公式计算
梯度下降算法要用到目标函数的梯度,所以我们要先算出梯度,如下:
,
因此有:
2、参数设定
接下来我们初始化一下x,以及设置一下学习率。
不妨初始化,
此时
3、迭代
好了,下面我们就可以开始迭代x了,使它一步一步迫近最优解。
迭代1:
计算梯度 :
更新 x :
查看 y值 :
迭代2:
计算梯度 :
更新x :
查看 y值 :
...............
...............
迭代40:
计算梯度 :
更新x :
查看 y值 :
4、结果
第40次迭代时,与都极小,我们退出迭代 ,以 作为最终结果,此时函数值 ,易知,与预期的 x= [2,3] , y=0 几乎一致。
好了,我们仍然用手算的例子,来看看梯度下降算法代码是如何实现的,具体代码如下:
"""
本代码用于展示,梯度下降求y= (x1-2)^2+(x2-3)^2的最小解
本代码来自老饼讲解-机器学习:www.bbblearn.com
"""
x1 = 0 # 初始化x1
x2 = 0 # 初始化x2
for i in range(100): # 迭代100次
#------计算梯度--------
dx1 = 2*x1-4 # 计算x1的梯度
dx2 = 2*x2-6 # 计算x2的梯度
#----- 往负梯度方向更新x------
x1 = x1 - 0.1*dx1 # 将x1往负梯度方向更新
x2 = x2 - 0.1*dx2 # 将x2往负梯度方向更新
#----- 判断终止条件 --------
if((abs(dx1)< 0.001) & (abs(dx2)< 0.001)): # 如果梯度过小
break # 则退出迭代
print("第",i+1,"轮迭代:x=[",x1,",",x2,"],y=",(x1-2)**2+(x2-3)**2) # 打印结果 代码运行结果如下:

这其实跟我们上面手算的结果是一样的,就不再过多解说啦。
梯度下降算法的实现,其实只要先算法目标函数的梯度公式,然后再初始化一个解,之后只要不断地往负梯度方向迭代就可以了,非常的简单,在优化的过程中,我们就会看到目标函数一步一步的下降了。
评论