简介
深度学习被称为人工智能的未来。现在,神经网络被称为通用函数逼近器,也就是说,它们有能力表示这个宇宙中任何复杂的函数。计算这个具有数百万个参数的通用函数的想法来自优化的基本数学。优化可以通过多种方式完成,但在本文中,我们将重点讨论基于梯度下降的优化技术。
非凸函数的优化是研究的主要领域。多年来,不同的科学家提出了不同的优化算法来优化神经网络的成本函数。这些算法大部分都是基于梯度的方法,稍作修改。在这篇文章中,我们将讨论5个专业的下降基于算法-Gradient Descent,Momentum,Adagrad, RMSprop, Adam。
方法
为了了解每个算法在实际中是如何工作的,我们将使用一个凸二次函数。我们将对每个算法进行固定次数的迭代(20次),以比较它们在达到最优点时的收敛速度和轨迹。下面给出了为此任务选择的函数的方程,以及使用Matplotlib绘制的函数的三维图和级别集。
import matplotlib.pyplot as plt fig = plt.figure(figsize=(13,6)) ax = plt.axes(projection="3d") start, stop, n_values = -8, 8, 800 x_vals = np.linspace(start, stop, n_values) y_vals = np.linspace(start, stop, n_values) X, Y = np.meshgrid(x_vals, y_vals) Z = np.sqrt(0.1*X**2 + 2*Y**2) plt.contourf(X,Y,Z,) ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap='winter', edgecolor='none') ax.set_xlabel('x') ax.set_ylabel('y') ax.set_zlabel('z')
首先,我们将从最基本的梯度下降算法开始,然后我们将跟随它们发展的趋势来支持每个算法发展背后的想法。所以趋势是这样的
1-Gradient Descent
2-Momentum
3-Adagrad
4-RMSprop
5-Adam
因为所有这些算法在更新规则的每次迭代时都需要梯度。因此,下面给出了函数的梯度,用于在每次迭代时更新两个变量。我们将对所有算法使用固定的学习率值=0.4。
1、Gradient Descent
梯度下降法是求解最优解的最传统的方法。在这个算法中,使用当前梯度(gt)乘以一些称为学习率的因子来更新当前权值。更新规则的公式如下所示。
lr=0.4 x1=-4 x2=-6 l1_gd=[] l2_gd=[] for i in range(20): l1_gd.append(x1) l2_gd.append(x2) x1=x1-lr*0.2*x1 x2=x2-lr*4*x2
使用梯度下降的轨迹
fig = plt.figure(figsize=(13,6)) left, bottom, width, height = 100, 0.1, 0.8, 0.8 ax = fig.add_axes([left, bottom, width, height]) start, stop, n_values = -8, 8, 100 x_vals = np.linspace(start, stop, n_values) y_vals = np.linspace(start, stop, n_values) X, Y = np.meshgrid(x_vals, y_vals) Z = np.sqrt(0.1*X**2 + 2*Y**2) plt.contourf(X,Y,Z,) plt.plot(l1_gd[:15],l2_gd[:15],color="red",marker="*",markeredgecolor="black",linewidth=3,label="Gradient Descent") plt.figure(figsize=(15,10)) plt.figure(figsize=(15,10)) ax.set_title('Level Sets of the Function',size=20) ax.set_xlabel('x (cm)') ax.set_ylabel('y (cm)') ax.legend() plt.show()
正如我们在上面的图中看到的,梯度下降经历了很多振荡,收敛速度非常慢。所以在后面的部分,我们将学习梯度下降的改进,它将帮助我们实现稳定和更快的收敛。