使用Numpy进行深度学习中5大反向传播优化算法的性能比较

OSC开源社区 昨天

以下文章来源于DeepHub IMBA ,作者P**nHub兄弟网站

在本文中,我们将通过计算二次凸函数的最优点来比较主要的深度学习优化算法的性能。

简介

深度学习被称为人工智能的未来。现在,神经网络被称为通用函数逼近器,也就是说,它们有能力表示这个宇宙中任何复杂的函数。计算这个具有数百万个参数的通用函数的想法来自优化的基本数学。优化可以通过多种方式完成,但在本文中,我们将重点讨论基于梯度下降的优化技术。

非凸函数的优化是研究的主要领域。多年来,不同的科学家提出了不同的优化算法来优化神经网络的成本函数。这些算法大部分都是基于梯度的方法,稍作修改。在这篇文章中,我们将讨论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()

正如我们在上面的图中看到的,梯度下降经历了很多振荡,收敛速度非常慢。所以在后面的部分,我们将学习梯度下降的改进,它将帮助我们实现稳定和更快的收敛。

2、Momentum

动量梯度下降是一种常用的优化器,它消除了标准梯度下降引起的振荡,加速了收敛最优点。当它在水平方向上加速时,它在垂直方向上减速。在这种杰出行为的帮助下,它使我们在学习率的方向上迈出了一大步。此外,动量比标准梯度下降要稳定得多。

下面给出的方程式解释了更新规则-

 v1,v2=0,0 gamma,lr=0.5,0.4 x1,x2=-4,-6 l1_gd_m,l2_gd_m=[],[] for i in range(20):  l1_gd_m.append(x1)  l2_gd_m.append(x2)  v1=gamma*v1+(0.2*x1)  v2=gamma*v2+(4*x2)  x1=x1-lr*v1  x2=x2-lr*v2

Gradient Descent vs Momentum

 import matplotlib.pyplot as plt import numpy as np

 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.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)")

 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()

3、Adagrad

自适应梯度下降算法(adaptive gradient descent)是一种学者梯度下降算法。其主要区别在于Adagrad根据网络中参数的重要性对每个权值利用不同的学习速率。换句话说,用较高的学习率训练不必要的参数,用较小的学习率训练重要参数,使其更稳定地收敛。在不允许失真的情况下,实现了算法的加速。更新公式类似于动量,这里每一步的动量是用之前的动量和梯度的平方来计算的。下面的公式显示了Adagrad中的更新规则。

Gt是一个对角矩阵组成的平方和过去的渐变和ϵ平滑项。此外,表示矩阵-向量积运算。

 v1,v2=0,0 gamma,lr=0.9,0.4 x1,x2=-4,-6 l1_adagrad,l2_adagrad=[],[] for i in range(20):  l1_adagrad.append(x1)  l2_adagrad.append(x2)  v1=v1+(0.2*x1)**2  v2=v2+(4*x2)**2  x1=x1-(lr/math.sqrt(v1+c))*0.2*x1  x2=x2-(lr/math.sqrt(v2+c))*4*x2

Momentum vs Adagrad

 import matplotlib.pyplot as plt import numpy as np

 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.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)") plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad") 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()

从上图中可以看出,Adagrad虽然运动平稳无振荡,但收敛能力不足。为了解决这个问题,Geoffrey Hinton引入了一个更有效的优化器RMSprop。

4、RMSprop

Rmsprop是由著名计算机科学家Geoffrey Hinton (Hinton et al., 2012)提出的另一种高效优化算法。该算法的工作原理与Adagrad相似,只是稍加修改。不像AdaGrad那样取梯度平方的累积和,我们取这些梯度的指数移动平均值。使用指数平均的原因是为了给最近更新的梯度权重大于最近更新的梯度。下面的方程式显示了Rmsprop的更新规则。

 v1,v2=0,0 gamma,lr=0.9,0.4 x1,x2=-4,-6 l1,l2=[],[] for i in range(20):  l1.append(x1)  l2.append(x2)  v1=gamma*v1+(1-gamma)*(0.2*x1)**2  v2=gamma*v2+(1-gamma)*(4*x2)**2  x1=x1-(lr/math.sqrt(v1+c))*0.2*x1  x2=x2-(lr/math.sqrt(v2+c))*4*x2

Momentum vs Adagrad vs RMSprop

 import matplotlib.pyplot as plt import numpy as np

 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.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)") plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad") plt.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm") 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()

显而易见,当收敛到最优点时,梯度下降算法在垂直方向上产生巨大的振荡,RMSprop限制了垂直运动,加速了水平方向。此外,虽然动量减小了振荡,RMSprop提供了更可靠和更快的收敛。

5、Adam

自适应矩估计是另一种计算每个参数的自适应学习率的优化器。与其他优化器相比,它更加健壮和可靠,因为它基本上结合了动量和RMSprop(即。移动类似梯度的动量的平均值,并使用梯度的平方来调整学习速率,如RMSprop)。更精确地说,Adam算法执行如下-

 v1,v2,s1,s2=0,0,0,0 gamma,beta,lr=0.9,0.999,0.4 x1,x2=-6,-6 l1_adam,l2_adam=[],[] for i in range(20):  l1_adam.append(x1)  l2_adam.append(x2)  v1=gamma*v1+(1-gamma)*(0.2*x1)  v2=gamma*v2+(1-gamma)*(4*x2)  s1=beta*s1+(1-beta)*(0.2*x1)**2  s2=beta*s2+(1-beta)*(4*x2)**2  m_hat_v1= v1 / (1 - np.power(gamma, i+1))  m_hat_v2 = v2 / (1 - np.power(gamma, i+1))  s_hat_s1= s1 / (1 - np.power(beta, i+1))  s_hat_s2 = s2 / (1 - np.power(beta, i+1))  x1=x1-(lr)*(m_hat_v1/math.sqrt((s_hat_s1)+c))  x2=x2-(lr)*(m_hat_v2/math.sqrt((s_hat_s2)+c))  print(x1,x2)  if abs(x1)<=0.1 and abs(x2)<0.1:    break

在收敛期间的轨迹汇总

 import matplotlib.pyplot as plt import numpy as np

 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.plot(l1_gd_m[:15],l2_gd_m[:15],color="yellow",marker="*",markeredgecolor="orange",linewidth=3,label="Gradient Descent (Momentum =0.5)") plt.plot(l1_adagrad[:15],l2_adagrad[:15],color="blue",marker="*",markeredgecolor="black",linewidth=3,label="Adagrad") plt.plot(l1[:15],l2[:15],color="g",marker="*",markeredgecolor="b",linewidth=3,label="RMSprop Algorithm") plt.plot(l1_adam[:20],l2_adam[:20],color="Brown",marker="*",markeredgecolor="pink",linewidth=3,label="Adam") 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()

正如在最后的图中所看到的,Adam优化器在直线路径上导致最快的收敛。在Adam的例子中,它通过累积之前梯度的总和来减弱振荡,并且由于梯度的平方项,它遵循一条直线,类似于RMSprop。这导致了一个明显的结论,即Adam是Momentum和RMSprop的结合版本。从上图中我们可以很容易地看出为什么Adam是deep learning中最流行的优化器。即使从离最优值(-6,-6)很远的地方开始,Adam也能以最小的迭代收敛得最快。

作者:Saket Thavanani

本文代码地址:https://github.com/Saket-Uoft/Deep-Learning-Optimizers

(0)

相关推荐

  • 基于阈值的车道标记

    重磅干货,第一时间送达 在这篇文章中,我将介绍如何从视频中查找并标记车道.被标记的车道会显示到视频上,并得到当前路面的曲率以及车辆在该车道内的位置.首先我们需要对图像进行相机失真校正,这里就不作详细介 ...

  • 优化器怎么选?一文教你选择适合不同ML项目的优化器

    选自 | lightly.ai 来自 | 机器之心  编辑 | 小舟.杜伟 为机器学习项目选择合适的优化器不是一件简单的事. 优化器是深度学习领域的重要组成模块之一,执行深度学习任务时采用不同的优化器 ...

  • 你还弄不懂的傅里叶变换,神经网络只用了30多行代码就学会了

    明敏 发自 凹非寺 在我们的生活中,大到天体观测.小到MP3播放器上的频谱,没有傅里叶变换都无法实现. 通俗来讲,离散傅里叶变换(DFT)就是把一串复杂波形中分成不同频率成分. 比如声音,如果用声波记 ...

  • 干货|通俗易懂讲解Deep Learning 最优化方法之AdaGrad

    干货|通俗易懂讲解Deep Learning 最优化方法之AdaGrad

  • 生命科学中的 UMAP(降维算法)

    UMAP应该说是目前最好的降维算法了,能最大程度的保留原始数据的特征同时大幅度的降低特征维数. 这是<生命科学的数理统计和机器学习>的相关探讨,我试图介绍生物信息学.生物医学.遗传学等常见 ...

  • PyTorch 学习笔记(七):PyTorch的十个优化器

    加入极市专业CV交流群,与6000+来自腾讯,华为,百度,北大,清华,中科院等名企名校视觉开发者互动交流!更有机会与李开复老师等大牛群内互动! 同时提供每月大咖直播分享.真实项目需求对接.干货资讯汇总 ...

  • 从实践的角度理解主成分分析

    主成分分析是提高机器学习算法处理大量数据和特征的性能的最常用方法之一.然而,有时PCA可能太复杂,太技术化,甚至太乏味,无法正确理解基本原理,因此,我决定写这篇文章,以实际的方式阐明每一步,并易于初学 ...

  • 深度学习中的知识蒸馏技术(下)

    本文概览: 写在前面: 这是一篇介绍知识蒸馏在推荐系统中应用的文章,关于知识蒸馏理论基础的详细介绍,请看上篇文章: 1. 背景介绍 1.1 简述推荐系统架构 如果从传统角度来看实际的工业推荐系统,粗略 ...

  • 深度学习中的知识蒸馏技术

    本文概览: 1. 知识蒸馏介绍 1.1 什么是知识蒸馏? 在化学中,蒸馏是一种有效的分离不同沸点组分的方法,大致步骤是先升温使低沸点的组分汽化,然后降温冷凝,达到分离出目标物质的目的.化学蒸馏条件:( ...

  • 一文概览深度学习中的激活函数

    人工智能算法与Python大数据 致力于提供深度学习.机器学习.人工智能干货文章,为AI人员提供学习路线以及前沿资讯 23篇原创内容 公众号 点上方人工智能算法与Python大数据获取更多干货 在右上 ...

  • 详解孩子学习中10大坏习惯的10张思维导图

    习惯是经过反复练习而形成的较为稳定的行为特征,好的习惯可以带来好的结果,而坏的习惯只能带来不好的结果.在许多时候,孩子的学习成绩不理想,就是由于有一些坏的习惯在作怪!这些图画出孩子学习中的10大坏习惯 ...

  • 总结 | 一文读懂深度学习中的各种卷积

    仅作学术分,如有侵权,联系删除 转载于 :机器之心,towardsdatascience 如果你听说过深度学习中不同种类的卷积(比如 2D / 3D / 1x1 /转置/扩张(Atrous)/空间可分 ...

  • 透过新视角理解深度学习中的泛化

    文 / Google Research 团队 Hanie Sedghi 和哈佛大学 Preetum Nakkiran 如何理解泛化是深度学习领域尚未解决的基础问题之一.为什么使用有限训练数据集优化模型 ...

  • 深度学习中的对抗性攻击都有哪些?怎么防御?

    2021-06-10 18:20 深度学习中的对抗性攻击都有哪些?怎么防御? 中国工程院院刊© 本文来自微信公众号:中国工程院院刊(ID:CAE-Engineering),作者:任奎.Tianhang ...

  • 深度学习中的 Attention 机制总结与代码实现(2017-2021年)

    作者丨mayiwei1998 来源丨GiantPandaCV 编辑丨极市平台 极市导读 由于许多论文中的网络结构通常被嵌入到代码框架中,导致代码比较冗余.本文作者对近几年基于Attention网络的核 ...

  • tensorflow 学习笔记-- 深度学习中epochs batchsize iteration的概念

    深度学习框架中涉及很多参数,如果一些基本的参数如果不了解,那么你去看任何一个深度学习框架是都会觉得很困难,下面介绍几个新手常问的几个参数. batch 深度学习的优化算法,说白了就是梯度下降.每次的参 ...