0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

深度学习中多种优化算法

深度学习自然语言处理 来源:Python遇见机器学习 2020-08-28 09:52 次阅读

本文旨在优化一维函数,实际上模型参数有数百万维以上,差距很大,因此本文最好作为辅助法的理解,而非对算法优劣的判断依据。 在深度学习中,有很多种优化算法,这些算法需要在极高维度(通常参数有数百万个以上)也即数百万维的空间进行梯度下降,从最开始的初始点开始,寻找最优化的参数,通常这一过程可能会遇到多种的情况,诸如: 1、提前遇到局部最小值从而卡住,再也找不到全局最小值了。 2、遇到极为平坦的地方:“平原”,在这里梯度极小,经过多次迭代也无法离开。同理,鞍点也是一样的,在鞍点处,各方向的梯度极小,尽管沿着某一个方向稍微走一下就能离开。 3、“悬崖”,某个方向上参数的梯度可能突然变得奇大无比,在这个地方,梯度可能会造成难以预估的后果,可能让已经收敛的参数突然跑到极远地方去。 为了可视化&更好的理解这些优化算法,我首先拼出了一个很变态的一维函数: 其导数具有很简单的形式: 具体长得像:

具有悬崖和大量的局部最小值,足以模拟较为复杂的优化情况了。
算法1:纯粹的梯度下降法 该算法很简单,表述如下:

首先给出学习率lr,初始x while True: x = x - lr*df/dx 根据学习率的不同,可以看到不同的效果。学习率过小,卡在局部极小值,学习率过大,压根不收敛。

梯度下降法

算法2:梯度下降法+动量 算法在纯粹的梯度下降法之上,外加了梯度,从而记录下了历史的梯度情况,从而减轻了卡在局部最小值的危险,在梯度=0的地方仍然会有一定的v剩余,从而在最小值附近摇摆。

首先给出学习率lr,动量参数m 初始速度v=0,初始x while True: v = m * v - lr * df/dx x += v 下面可以看图:

梯度下降+动量, lr=0.05

梯度下降+动量, lr=0.01

梯度下降+动量, lr=0.002 从中我们可以看出: 1、lr越小越稳定,太大了很难收敛到最小值上,但是太小的话收敛就太慢了。 2、动量参数不能太小,0.9以上表现比较好,但是又不能太大,太大了无法停留在最小值处。

算法3:AdaGrad算法 AdaGrad算法的思想是累计历史上出现过的梯度(平方),用积累的梯度平方的总和的平方根,去逐元素地缩小现在的梯度。某种意义上是在自行缩小学习率,学习率的缩小与过去出现过的梯度有关。 缺点是:刚开始参数的梯度一般很大,但是算法在一开始就强力地缩小了梯度的大小,也称学习率的过早过量减少。 算法描述:

给出学习率lr,delta=1e-7累计梯度r=0,初始xwhile True: g = df/dx r = r + g*g x = x - lr / (delta+ sqrt(r)) * g

效果并不是很好......

算法4:RMSProp AdaGrad算法在前期可能会有很大的梯度,自始至终都保留了下来,这会使得后期的学习率过小。RMSProp在这个基础之上,加入了平方梯度的衰减项,只能记录最近一段时间的梯度,在找到碗状区域时能够快速收敛。 算法描述:

给出学习率lr,delta=1e-6,衰减速率p累计梯度r=0,初始xwhile True: g = df/dx r = p*r + (1-p)*g*g x = x - lr / (delta+ sqrt(r)) * g

RMSProp,p=0.99

RMSProp,p=0.9

RMSProp,p=0.8 衰减速率情况复杂,建议自行调参.......

算法5:Adam算法 Adam算法和之前类似,也是自适应减少学习率的算法,不同的是它更新了一阶矩和二阶矩,用一阶矩有点像有动量的梯度下降,而用二阶矩来降低学习率。 此外还使用了类似于s = s / (1-p1^t)这样的公式,这样的公式在t较为小的时候会成倍增加s,从而让梯度更大,参数跑的更快,迅速接近期望点。而后续t比较大的时候,s = s / (1-p1^t)基本等效于s=s,没什么用。 算法如下:

给出学习率lr,delta=1e-8,衰减速率p1=0.9,p2=0.999 累计梯度r=0,初始x ,一阶矩s=0,二阶矩r=0时间t = 0while True: t += 1 g = df/dx s = p1*s + (1-p1) *g r = p2*r +(1-p2)*g*g s = s / (1-p1^t) r = r / (1-p2^t) x = x - lr / (delta+ sqrt(r)) * s

Adam算法,鬼一样的表现 是的,你没有看错,这玩意压根不收敛......表现极差。 在算法中仔细研究后才发现,是在t很小的前几步的时候,p2=0.999太大了,导致r = r / (1-p2^t) 中,1-p2^t接近0,r迅速爆炸,百步之内到了inf。后来修改p2=0.9后效果就好得多了。

Adam算法,神级表现 最后还是Adam效果最好了 :),尽管学习率还是需要相当的调参。

算法6:牛顿法 牛顿法是二阶近似方法的一种,其原理类似于将某函数展开到二次方(二次型)项: 如果幸运的话,这个展开式是一个开口向上的曲面,一步就走到这个曲面的最低点:

初始x while True: g = df(x) # 一阶导数 gg = ddf(x) # 二阶导数 x = x - g/gg # 走到曲面的最低点

可怜的牛顿法,静态图 图片如上,看了真可怜........其实牛顿法要求的是H矩阵正定(一维情况下是二阶导数大于零),在多维中,这样的情况难以满足,大量出现的极小值,悬崖,鞍点都会造成影响,导致无法顺利进行下去,为了更好地进行牛顿法,我们需要正则化它。

算法7:牛顿法+正则化 牛顿法加上正则化可以避免卡在极小值处,其方法也很简单:更新公式改成如下即可。 一维的算法如下:

初始x ,正则化强度alphawhile True: g = df(x) # 一阶导数 gg = ddf(x) # 二阶导数 x = x - g/(gg+alpha) # 走到曲面的最低点 效果图:

牛顿法+正则化 看了真可怜.........二次方法真心在非凸情况很糟糕。此外算法涉及H矩阵的逆,这需要O(n^3)的计算量,非深度学习可用。 参考文献 [1]Ian Goodfellow,深度学习Deep Learning,人民邮电出版社,170-190 代码

#coding:utf-8from __future__ import print_functionimport numpy as npimport matplotlib.pyplot as plt def f(x): return (0.15*x)**2 + np.cos(x) + np.sin(3*x)/3 + np.cos(5*x)/5 + np.sin(7*x)/7 def df(x): return (9/200)*x - np.sin(x) -np.sin(5*x) + np.cos(3*x) + np.cos(7*x) points_x = np.linspace(-20, 20, 1000)points_y = f(points_x) # 纯粹的梯度下降法,GDfor i in range(10): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 lr = pow(2,-i)*16 x = -20.0 GD_x, GD_y = [], [] for it in range(1000): GD_x.append(x), GD_y.append(f(x)) dx = df(x) x = x - lr * dx plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(GD_x, GD_y, c="r", linestyle="-") plt.title("Gradient descent,lr=%f"%(lr)) plt.savefig("Gradient descent,lr=%f"%(lr) + ".png") plt.clf() # 动量 + 梯度下降法for i in range(10): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 lr = 0.002 m = 1 - pow(0.5,i) x = -20 v = 1.0 GDM_x, GDM_y = [], [] for it in range(1000): GDM_x.append(x), GDM_y.append(f(x)) v = m * v - lr * df(x) x = x + v plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(GDM_x, GDM_y, c="r", linestyle="-") plt.scatter(GDM_x[-1],GDM_y[-1],90,marker = "x",color="g") plt.title("Gradient descent + momentum,lr=%f,m=%f"%(lr,m)) plt.savefig("Gradient descent + momentum,lr=%f,m=%f"%(lr,m) + ".png") plt.clf() # AdaGradfor i in range(15): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 lr = pow(1.5,-i)*32 delta = 1e-7 x = -20 r = 0 AdaGrad_x, AdaGrad_y = [], [] for it in range(1000): AdaGrad_x.append(x), AdaGrad_y.append(f(x)) g = df(x) r = r + g*g # 积累平方梯度 x = x - lr /(delta + np.sqrt(r)) * g plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(AdaGrad_x, AdaGrad_y, c="r", linestyle="-") plt.scatter(AdaGrad_x[-1],AdaGrad_y[-1],90,marker = "x",color="g") plt.title("AdaGrad,lr=%f"%(lr)) plt.savefig("AdaGrad,lr=%f"%(lr) + ".png") plt.clf() # RMSPropfor i in range(15): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 lr = pow(1.5,-i)*32 delta = 1e-6 rou = 0.8 x = -20 r = 0 RMSProp_x, RMSProp_y = [], [] for it in range(1000): RMSProp_x.append(x), RMSProp_y.append(f(x)) g = df(x) r = rou * r + (1-rou)*g*g # 积累平方梯度 x = x - lr /(delta + np.sqrt(r)) * g plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(RMSProp_x, RMSProp_y, c="r", linestyle="-") plt.scatter(RMSProp_x[-1],RMSProp_y[-1],90,marker = "x",color="g") plt.title("RMSProp,lr=%f,rou=%f"%(lr,rou)) plt.savefig("RMSProp,lr=%f,rou=%f"%(lr,rou) + ".png") plt.clf() # Adamfor i in range(48): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 lr = pow(1.2,-i)*2 rou1,rou2 = 0.9,0.9 # 原来的算法中rou2=0.999,但是效果很差 delta = 1e-8 x = -20 s,r = 0,0 t = 0 Adam_x, Adam_y = [], [] for it in range(1000): Adam_x.append(x), Adam_y.append(f(x)) t += 1 g = df(x) s = rou1 * s + (1 - rou1)*g r = rou2 * r + (1 - rou2)*g*g # 积累平方梯度 s = s/(1-pow(rou1,t)) r = r/(1-pow(rou2,t)) x = x - lr /(delta + np.sqrt(r)) * s plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(Adam_x, Adam_y, c="r", linestyle="-") plt.scatter(Adam_x[-1],Adam_y[-1],90,marker = "x",color="g") plt.title("Adam,lr=%f"%(lr)) plt.savefig("Adam,lr=%f"%(lr) + ".png") plt.clf() # 牛顿法for i in range(72): # 绘制原来的函数 plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法开始 alpha= pow(1.2,-i)*20 x = -20.0 Newton_x, Newton_y = [], [] for it in range(1000): Newton_x.append(x), Newton_y.append(f(x)) g = df(x) gg = ddf(x) x = x - g/(gg+alpha) plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(Newton_x, Newton_y, c="r", linestyle="-") plt.scatter(Newton_x[-1],Newton_y[-1],90,marker = "x",color="g") plt.title("Newton,alpha=%f"%(alpha)) plt.savefig("Newton,alpha=%f"%(alpha) + ".png") plt.clf()

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4453

    浏览量

    90746
  • 可视化
    +关注

    关注

    1

    文章

    1018

    浏览量

    20551
  • 深度学习
    +关注

    关注

    73

    文章

    5236

    浏览量

    119895

原文标题:深度学习中7种最优化算法的可视化与理解

文章出处:【微信号:zenRRan,微信公众号:深度学习自然语言处理】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Nanopi深度学习之路(1)深度学习框架分析

    学习,也就是现在最流行的深度学习领域,关注论坛的朋友应该看到了,开发板试用活动中有【NanoPi K1 Plus试用】的申请,介绍NanopiK1plus的高大上优点之一就是“可运行
    发表于 06-04 22:32

    什么是深度学习?使用FPGA进行深度学习的好处?

    什么是深度学习为了解释深度学习,有必要了解神经网络。神经网络是一种模拟人脑的神经元和神经网络的计算模型。作为具体示例,让我们考虑一个输入图像并识别图像
    发表于 02-17 16:56

    深度模型中的优化学习课件下载

    深度模型中的优化学习课件下载
    发表于 04-07 16:21 3次下载
    <b class='flag-5'>深度</b>模型中的<b class='flag-5'>优化</b>与<b class='flag-5'>学习</b>课件下载

    移植深度学习算法模型到海思AI芯片

    本文大致介绍将深度学习算法模型移植到海思AI芯片的总体流程和一些需要注意的细节。海思芯片移植深度学习算法
    发表于 01-26 19:42 11次下载
    移植<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>算法</b>模型到海思AI芯片

    机器学习深度学习算法流程

    但是无可否认的是深度学习实在太好用啦!极大地简化了传统机器学习的整体算法分析和学习流程,更重要的是在一些通用的领域任务刷新了传统机器
    的头像 发表于 04-26 15:07 4151次阅读

    深度学习算法进行优化的处理器——NPU

    NPU(Neural-network Processing Unit,嵌入式神经网络处理器)是针对深度学习*算法进行优化的处理器。它能像人类神经网络一样快速、高效地处理大量数据,因此它
    发表于 10-17 10:53 1901次阅读

    什么是深度学习优化算法

    先大致讲一下什么是深度学习优化算法吧,我们可以把模型比作函数,一种很复杂的函数:h(f(g(k(x)))),函数有参数,这些参数是未知的,深度
    的头像 发表于 02-13 15:31 1114次阅读
    什么是<b class='flag-5'>深度</b><b class='flag-5'>学习</b>中<b class='flag-5'>优化</b><b class='flag-5'>算法</b>

    PyTorch教程12.1之优化深度学习

    电子发烧友网站提供《PyTorch教程12.1之优化深度学习.pdf》资料免费下载
    发表于 06-05 15:08 0次下载
    PyTorch教程12.1之<b class='flag-5'>优化</b>和<b class='flag-5'>深度</b><b class='flag-5'>学习</b>

    PyTorch教程-12.1. 优化深度学习

    12.1. 优化深度学习¶ Colab [火炬]在 Colab 中打开笔记本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的头像 发表于 06-05 15:44 353次阅读
    PyTorch教程-12.1. <b class='flag-5'>优化</b>和<b class='flag-5'>深度</b><b class='flag-5'>学习</b>

    从浅层到深层神经网络:概览深度学习优化算法

    优化算法一直以来是机器学习能根据数据学到知识的核心技术。而好的优化算法可以大大提高学习速度,加快
    的头像 发表于 06-15 11:20 428次阅读
    从浅层到深层神经网络:概览<b class='flag-5'>深度</b><b class='flag-5'>学习</b><b class='flag-5'>优化</b><b class='flag-5'>算法</b>

    深度学习算法简介 深度学习算法是什么 深度学习算法有哪些

    深度学习算法简介 深度学习算法是什么?深度
    的头像 发表于 08-17 16:02 6797次阅读

    深度学习算法工程师是做什么

    深度学习算法工程师是做什么 深度学习算法工程师是一种高级技术人才,是数据科学中创新的推动者,也是
    的头像 发表于 08-17 16:03 803次阅读

    什么是深度学习算法深度学习算法的应用

    什么是深度学习算法深度学习算法的应用 深度
    的头像 发表于 08-17 16:03 1468次阅读

    深度学习算法库框架学习

    深度学习算法库框架的相关知识点以及它们之间的比较。 1. Tensorflow Tensorflow是Google家的深度学习框架,已经成为
    的头像 发表于 08-17 16:11 432次阅读

    深度学习框架和深度学习算法教程

    深度学习框架和深度学习算法教程 深度学习是机器
    的头像 发表于 08-17 16:11 710次阅读