未完成!!!!!!

神经网络的训练主要是通过优化损失函数来更新参数,而面对庞大数量的参数的更新,优化函数的设计就显得尤为重要,下面介绍一下几种常用的优化器及其演变过程:

【先说明一下要用到符号的含义】:

损失函数里一般有两种参数,一种是控制输入信号量的权重(Weight, 简称$ w $),另一种是调整函数与真实值距离的偏差(Bias,简称$ b $),在这里我们将参数统一表示为$ \theta_t \in R^{d} $,损失函数为$J(\theta)$,学习率为$\eta$ 。损失函数关于当前参数的梯度:$g_t = \nabla J(\theta_t)$

损失函数用来衡量机器学习模型的精确度。一般来说,损失函数的值越小,模型的精确度就越高。想要使损失函数最小化,就要用到梯度的概念。梯度是指向变化最快的方向。知道了该往哪里走,接下来就是该走多长,这用学习率$\eta$来控制

【1】梯度下降

参数更新公式:$\theta_{t+1} = \theta_t - g_t $

原始梯度下降法在迭代每一次梯度下降的过程中,都对所有样本数据的梯度进行计算,理论上可以找到全局最优解。虽然最终得到的梯度下降的方向较为准确,但是运算会耗费过长的时间。两种改进方法为:

1.小批量样本梯度下降(Mini Batch GD)

小批量的意思就是算法在每次梯度下降的过程中,只选取一部分的样本数据进行计算梯度,可以明显地减少梯度计算的时间。

2. 随机梯度下降(Stochastic GD)

随机梯度下降算法只随机抽取一个样本进行梯度计算,每次都是往局部最优的方向下降,由于每次梯度下降迭代只计算一个样本的梯度,因此运算时间比小批量样本梯度下降算法还要少很多,但由于训练的数据量太小(只有一个),因此下降路径很容易受到训练数据自身噪音的影响。(只选取一个样本求梯度也能基本收敛的原因好像和期望有关)。

随着每次传入样本的不同,计算得到的梯度也会不同,这就造成了偏差,所以Mini Batch和SGD都不可避免会发生震荡

虽然梯度是指向变化最快的方向,但还是有优化空间的,主要是因为我们算的是每个点的梯度,而我们梯度的步长并不是无限小。而有了这个确定的步长,下降路径就不会和最优路径重合。

![](https://img2022.cnblogs.com/blog/1923060/202209/1923060-20220911101035785-1555472239.jpg)

从上图我们可以看到,梯度的下降过程是震荡的,一次梯度的下降是横向向量和纵向向量的和,我们的目的是使梯度指向最优点的方向并增加步长,而这可以通过将横向向量变长,纵向向量变短来实现,而考虑到向量是有方向的,在垂直方向上,前后两个向量是反向的,相加后就可以实现纵向向量变短的目的,在水平方向上,前后两个向量是同向的,相加后就可以实现横向向量的变长,这正是接下来介绍的动量法的思想,将历史信息考虑进去。

【2】Momentum--动量法

Momentum认为梯度下降过程可以加入惯性,就是将历史梯度考虑进来:

参数更新公式如下:

$m_{t+1} = \beta m_t + \eta g_t $

$\theta_{t+1} = \theta_t - m_{t+1} $

如果将$m_{t+1} $写开来就是:$m_{t+1} = \eta\sum_{i=1}^t g_t $

此时$\theta_{t+1} = \theta_t -\eta\sum_{i=1}^t g_t $

【3】Nesterov Accelerated Gradient

![](https://img2022.cnblogs.com/blog/1923060/202209/1923060-20220911112134320-698141291.png)

上述图片来自论文《An overview of gradient descent optimization algorithms》
Momentum首先计算当前的梯度(图3中的蓝色小矢量),然后向更新的累积梯度(蓝色大矢量)方向大跳,而NAG首先向之前的累积梯度(棕色矢量)方向大跳,测量梯度,然后进行校正(绿色矢量)。这种预见性的更新可以防止我们走得太快,并导致反应能力的提高。

在Momentum的基础上将当前时刻的梯度$g_t$换成下一时刻的梯度$\nabla J(\theta_t - \beta m_{t-1})$

参数更新公式为:

$m_{t+1} = \beta m_t + \eta\nabla J(\theta_t - \beta m_{t-1}) $

$\theta_{t+1} = \theta_t - m_{t+1} $

【4】AdaGrad(Adaptive gradient algorithm 自适学习率应梯度下降)

Adagrad 算法解决的问题:算法不能根据参数的重要性而对不同的参数进行不同程度的更新的问题。

SGD及其变种均以同样的学习率更新每个纬度的参数,但深度神经网络往往包含大量的参数,这些参数并不是总会用得到。对于经常更新的参数,我们已经积累了大量关于它的只是,不希望受到单个样本太大的影响,希望学习速率慢一些;对于偶尔更新的参数,我们了解的信息太少,希望能从每个偶然出现的样本身上多学一些,即学习速率大一些。因此,AdaGrad诞生了,它就是考虑了对不同维度的参数采用不同的学习率。

以前,一次性对所有参数$\theta$ 进行更新,因为每个参数$\theta_i $ 都使用相同的学习率$\eta$ 。由于Adagrad在每个时间步骤$t$对每个参数$\theta_i $使用不同的学习率,我们首先展示Adagrad的每个参数更新,然后将其矢量化。为简洁起见,定义$g_{t,i}$为目标函数的梯度,即在时间步长$t$时对参数$\theta_i $的梯度。

参数更新公式:

$ v_{t,i} = \sum_{i=1}^t{g_{t,i}^2} $

$V_t = diag(v_{t,1},v_{t,2},\cdots,v_{t,d}\in R^{d \times d}) $

$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt V_t+\epsilon} $

另一种公式表示:

$ E[g^2]_t=E[g^2]_{t-1}+g_t^2$

$\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}\times g_t$

特点:前期:较小的时候,分母较大,能够放大梯度。后期:较大的时候,分母较小,能够约束梯度。适合处理稀疏梯度 \\
缺点:因为所有梯度一直是累加的,故学习率会一直减小趋于0

【5】RMSprop

RMSprop和下一个提到的优化器都是要解决Adagrad的缺点提出的改进算法,既然Adagrad的缺点是梯度平方的累加,那我们就减少累加的梯度,具体使用指数衰减移动平均算法来实现。

参数更新:

$ v_{t,i} = \beta v_{t-1,i} + (1-\beta)g_{t,i}^2 $

$V_t = diag(v_{t,1},v_{t,2},\cdots,v_{t,d}\in R^{d \times d}) $

$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt V_t+\epsilon} $

另一种公式表示:

$ E[g^2]_t=\beta E[g^2]_{t-1}+(1-\beta)g_t^2$

$\theta_{t+1}=\theta_t-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}\times g_t$

【6】Adadelta

RMSprop优化器虽然可以对不同的权重参数自适应的改变学习率,但仍要指定超参数$\eta$,AdaDelta优化器对RMSProp算法进一步优化:AdaDelta算法额外维护一个状态变量$\delta x_t$,并使用$RMS[\delta x]_t$代替RMSprop中的学习率参数$\eta$,使AdaDelta优化器不需要指定超参数.

参数更新公式:

$ E[g^2]_t = \beta E[g^2]_{t-1} + (1-\beta )g_t^2 $ \ 注:符号$E[]$表示期望

$E[\Delta x^2]_{t-1}=\beta \times E[\Delta x^2]_{t-2}+(1-\beta)\times \Delta x_{t-2}^2$

$RMS[g]_t=\sqrt{E[g^2]_t+\epsilon}$

$RMS[\Delta x]_{t-1}=\sqrt{E[\Delta x^2]_{t-1}+\epsilon}$

$\theta_{t+1} = \theta_t - \frac {RMS[\Delta x]_{t-1}}{RMS[g]_t} \otimes g_t$

【7】Adam

$ m_t = \beta_1 m_{t-1}+(1-\beta_1)g_t $

$ v_t = \beta_2 v_{t-1}+(1-\beta_2)g_t^2 $

$ \hat m_t = \frac{m_t}{1-\beta_1^t} $

$ \hat v_t = \frac{v_t}{1-\beta_2^t} $

$ \theta_{t+1} = \theta_t - \frac{\eta}{\sqrt{\hat v_t} +\epsilon} \hat m_t $

【8】AdaMaX

$ m_t = \beta_1 m_{t-1}+(1-\beta_1)g_t $

$ \begin{equation}\begin{split} u_t &= \beta_2^{\infty}v_{t-1} + (1-\beta_2^\infty)\vert g_t \vert^\infty \\ &=max(\beta_2 \cdot v_{t-1},\vert g_t \vert) \end{split}\end{equation} $

$ \theta_{t+1}=\theta_t - \frac{\eta}{u_t}\hat m_t $

【9】Nadam

$ m_t=\gamma m_{t-1}+\eta g_t $

Adam为:$ \theta_{t+1}=\theta-(\gamma m_{t-1}+\eta g_t) $

对Adam的改进为:$ \theta_{t+1}=\theta-(\gamma m_t+\eta g_t) $

$\theta_{t+1}=\theta_t - \frac{\eta}{\sqrt{\hat v_t} + \epsilon}(\beta_1 \hat m_t + \frac{(1-\beta_1)g_t}{1-\beta_1^t}) $

参考资料:

[https://zhuanlan.zhihu.com/p/110104333]([论文阅读] 综述梯度下降优化算法)

[https://zhuanlan.zhihu.com/p/68468520](梯度下降算法(Gradient Descent)的原理和实现步骤)

https://zhuanlan.zhihu.com/p/351134007

论文《An overview of gradient descent optimization algorithms》

优化器Optimal的更多相关文章

  1. 0104探究MySQL优化器对索引和JOIN顺序的选择

    转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...

  2. MongoDB 优化器MongoDB Database Profiler(12)

    优化器profile 在MySQL 中,慢查询日志是经常作为我们优化数据库的依据,那在MongoDB 中是否有类似的功能呢?答案是肯定的,那就是MongoDB Database Profiler. 1 ...

  3. ORACLE优化器RBO与CBO介绍总结

    RBO和CBO的基本概念 Oracle数据库中的优化器又叫查询优化器(Query Optimizer).它是SQL分析和执行的优化工具,它负责生成.制定SQL的执行计划.Oracle的优化器有两种,基 ...

  4. Oracle的优化器介绍

    Oracle优化器介绍 本文讲述了Oracle优化器的概念.工作原理和使用方法,兼顾了Oracle8i.9i以及最新的10g三个版本.理解本文将有助于您更好的更有效的进行SQL优化工作. RBO优化器 ...

  5. MySQL追踪优化器小试

    首先看一下MySQL追踪优化器的典型用法: 打开:SET optimizer_trace="enabled=on"; 查询优化器的信息:SELECT * FROM INFORMAT ...

  6. SQL Server优化器特性-动态检索

    前段时间我写的文章SQL Server 隐式转换引发的躺枪死锁 中有的朋友评论回复说在SQL2008R2测试时并未出现死锁,自己一测果然如此,因此给大家带来的疑惑表示抱歉,这里我就解释下其原因. 回顾 ...

  7. SQL Server 优化器特性导致的内存授予相关BUG

    我们有时会遇到一些坑,要不填平,要不绕过.这里为大家介绍一个相关SQL Server优化器方面的特性导致内存授予的相关BUG,及相关解决方式,也顺便回答下邹建同学的相关疑问. 问题描述 一个简单的查询 ...

  8. SQL Server优化器特性-隐式谓词

    我们都知道,一条SQL语句提交给优化器会产生相应的执行计划然后执行输出结果,但他的执行计划是如何产生的呢?这可能是关系型数据库最复杂的部分了.这里我为大家介绍一个有关SQL Server优化器的特性- ...

  9. 手动purge优化器的统计信息与AWR快照,减少对sysaux表空间的占用

    1.运行以下脚本,计算当前优化器统计信息和AWR快照表占用sysaux的空间 SQL> conn / as sysdba SQL> @?/rdbms/admin/awrinfo.sql 2 ...

随机推荐

  1. 论文解读(AGC)《Attributed Graph Clustering via Adaptive Graph Convolution》

    论文信息 论文标题:Attributed Graph Clustering via Adaptive Graph Convolution论文作者:Xiaotong Zhang, Han Liu, Qi ...

  2. Lua5.4源码剖析:二. 详解String数据结构及操作算法

    概述 lua字符串通过操作算法和内存管理,有以下优点: 节省内存. 字符串比较效率高.(比较哈希值) 问题: 相同的字符串共享同一份内存么? 相同的长字符串一定不共享同一份内存么? lua字符串如何管 ...

  3. Lambda表达式的无参数无返回值的练习和Lambda表达式有参数有返回值的练习

    使用Lambda(无参无返回) 说明:给定一个厨师(Cook)接口,内含唯一的抽象方法makeFood,且无参数.无返回值.如下: public interface Cook{ public abst ...

  4. SQLZOO练习三--SELECT within SELECT Tutorial

    This tutorial looks at how we can use SELECT statements within SELECT statements to perform more com ...

  5. 部署yum仓库

    YUM介绍 YUM(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及CentOS中的Shell前端软件包管理器. 基于RPM包管理,能够从指定的 ...

  6. react 吸顶实现

    今天获取到一个需求,其实就是吸顶的需求,页面下滑,某一块dom隐藏时发生吸顶现象.这种特效其实老生常谈了,但是在这次做的时候,突发奇想,能否将其做成一个 hook ,从而实现出传递ref即可使得 do ...

  7. mysql 跨库事务XA

    前一段时间在工作中遇到了跨库事务问题,后来在网上查询了一下,现在做一下整理和总结. 1.首先要确保mysql开启XA事务支持 SHOW VARIABLES LIKE '%XA%' 如果innodb_s ...

  8. Odoo14 一些用的熟手的函数

    # Odoo14 一些用的熟手的函数 # from odoo.tools import config # 这是直接访问配置文件,也就是当你执行./odoo-bin -c odoo.cfg的时候 # c ...

  9. 美女 Committer 手把手教你部署 Apache DolphinScheduler 单机版

    还在为如何部署Apache DolphinScheduler 发愁么?自上篇<美女 Committer 手把手教你使用海豚调度>的视频发布后,受到社区伙伴们的热烈欢迎.但个别小伙伴在部署这 ...

  10. 删除MySQL数据用户

    mysql删除用户的方法: 1.使用"drop user 用户名;"命令删除: 2.使用"delete from user where user='用户名' and ho ...