人工智能00015 深度学习与图像识别书评15 图像分类识别预备
4.2.2 梯度下降法
接下来要重点介绍的梯度下降法。
首先带大家简单认识一下梯度下降法。
梯度下降算法(GradientDescent Optimization)是常用的最优化方法之一。
“最优化方法”属于运筹学方法,是指在某些约束条件下,为某些变量选取哪些值,可以使得设定的目标函数达到最优的问题。
最优化方法有很多种,常见的有梯度下降法、牛顿法、共轭梯度法,等等。
由于本书的重点在于带领大家快速掌握“图像识别”的技能,因此暂时不对最优化方法进行展开,感兴趣的读者可以自行查阅相关资料进行学习。
由于梯度下降是一种比较常见的最优化方法,而且在后续第5章、第7章的神经网络中我们也将使用梯度下降法来进行优化,因此我们将在本章详细介绍该方法。
接下来我们以图形化的方式带领读者学习梯度下降法。
首先在Pycharm中新建一个Python文件,然后输入以下代码:
import numpy as np
import matplotlib.pyplot as plt
if __name__ == '__main__':
plot_x = np.linspace(-1, 6, 141) #从-1到6选取141个点
plot_y = (plot_x - 2.5) ** 2 – 1 #二次方程的损失函数
plt.scatter(plot_x[5], plot_y[5], color='r') #设置起始点,颜色为红色
plt.plot(plot_x, plot_y)
#设置坐标轴名称
plt.xlabel('theta', fontproperties='simHei', fontsize=15)
plt.ylabel('损失函数', fontproperties='simHei', fontsize=15)
plt.show()
通过上述代码,运行后,x轴代表的是我们待学习的参数θ(theta),y轴代表的是损失函数的值(即Loss值),曲线y代表的是损失函数。
我们的目标是希望通过大量的数据训练和调整参数θ,使损失函数的值最小。
可以通过求导数的方式,达到二次方程的最小值点,使得导数为0即可。
也就是说,横轴上2.5的位置所对应的损失函数值最小,在该点上一元二次方程(x-2.5)2-1切线的斜率为0。
暂且将导数描述为,其中J为损失函数,为待求解的参数。 梯度下降中有个比较重要的参数:学习率η(读作eta,有时也称其为步长),它控制着模型寻找最优解的速度。
加入学习率之后其数学表达为。
1)首先定义损失函数及其导数,代码如下: def J(theta): #损失函数
return (theta-2.5)**2 -1
def dJ(theta): #损失函数的导数
return 2 * (theta - 2.5) 2)通过Matplotlib绘制梯度下降迭代过程,具体代码如下:
theta = 0.0 #初始点
theta_history = [theta]
eta = 0.1 #步长
epsilon = 1e-8 #精度问题或者eta的设置无法使得导数为0
while True:
gradient = dJ(theta) #求导数
last_theta = theta #先记录下上一个theta的值
theta = theta - eta * gradient #得到一个新的theta
theta_history.append(theta)
if(abs(J(theta) - J(last_theta)) < epsilon):
break #当两个theta值非常接近的时候,终止循环
plt.plot(plot_x,J(plot_x),color='r')
plt.plot(np.array(theta_history),J(np.array(theta_history)),color='b',marker='x')
plt.show() #一开始的时候导数比较大,因为斜率比较陡,后面慢慢平缓了
print(len(theta_history))
#一共走了46步接下来我们看一下所绘制的图像是什么样子,可以观察到θ从初始值0.0开始不断地向下前进,一开始下降的幅度比较大,之后慢慢趋于缓和,逐渐接近导数为0,一共走了46步。