优化算法原理及实现

  • SGD
  • Momentum

无论是什么优化算法,最后都可以用一个简单的公式抽象:

w 是参数,而△w是参数的增量,而各种优化算法的主要区别在于对△w的计算不同,本文总结了下面十个优化算法的公式,以及简单的Python实现:

SGD

虽然有凑数的嫌疑,不过还是把SGD也顺带说一下,就算做一个符号说明了。常规的随机梯度下降公式如下:

其中η是学习率,J’(w)是损失关于参数的梯度,不过相比SGD,用的更多的还是小批量梯度下降(mBGD)算法,不同之处在于一次训练使用多个样本,然后取所有参与训练样本梯度的平均来更新参数,公式如下:

其中gi是第i次训练中m个样本损失关于参数梯度的均值,如无特别声明,下文所出现gi也遵循该定义
另外*J’(w)*或者gi在下面的优化算法中,只是作为一个传入的变量,其具体的计算是由其他模块负责,可以参考下面两个链接:
永远在你身后:Numpy实现神经网络框架(3)——线性层反向传播推导及实现zhuanlan.zhihu.com
永远在你身后:卷积核梯度计算的推导及实现​zhuanlan.zhihu.com

Momentum

Momentum,也就是动量的意思。该算法将梯度下降的过程视为一个物理系统,下图是在百度图片中找的(侵删)

如上图所示,在该物理系统中有一个小球(质点),它所处的水平方向的位置对应为w的值,而垂直方向对应为损失。设其质量m=1,在第i时刻,在单位时间内,该质点受外力而造成的动量改变为:

(1.1)到(1.2)是因为m=1,=1,所以约去了。另外受到的外力可以分为两个分量:重力沿斜面向下的力IG和粘性阻尼力IV



代入(1.2)式中: 然后对“位置”进行更新: 所以这里 ,另外 的方向与损失的梯度方向相反,并取系数为 ,得到: 代入(1.4),得到速度的更新公式: 进一步的,将(1.6)式展开,可以得到: 可以看出来是一个变相的等比数列之和,且公比小于1,所以存在极限,当 足够大时, 趋近于 实现代码import numpy as np

class Momentum(object):
def init(self, alpha=0.9, lr=1e-3):
self.alpha = alpha # 动量系数
self.lr = lr # 学习率
self.v = 0 # 初始速度为0

def update(self, g: np.ndarray):    # g = J'(w) 为本轮训练参数的梯度self.v = self.alpha * self.v - self.lr * g  # 公式return self.v    # 返回的是参数的增量,下同以上是基于指数衰减的实现方式,另外有的Momentum算法中会使用指数加权平均来实现,主要公式如下: 不过该方式因为  ,刚开始时  会比期望值要小,需要进行修正,下面的Adam等算法会使用该方式Nesterov Momentum Nesterov Momentum是Momentum的改进版本,与Momentum唯一区别就是,Nesterov先用当前的速度  更新一遍参数,得到一个临时参数  ,然后使用这个临时参数计算本轮训练的梯度。相当于是小球预判了自己下一时刻的位置,并提前使用该位置的梯度更新 : 为了更加直观,还是上几个图吧,以下是Momentum算法  的更新过程:假设下一个位置的梯度如下:那么Nesterov Momentum就提前使用这个梯度进行更新:整体来看Nesterov的表现要好于Momentum,至于代码实现的话因为主要变化的是  ,所以可以之前使用Momentum的代码AdaGradAdaGrad全称为Adaptive Subgradient,其主要特点在于不断累加每次训练中梯度的平方,公式如下: 其中  是一个极小的正数,用来防止除0,而  ,  是矩阵的哈达玛积运算符,另外,本文中矩阵的平方或者两矩阵相乘都是计算哈达玛积,而不是计算矩阵乘法从公式中可以看出,随着算法不断迭代,  会越来越大,整体的学习率会越来越小。所以,一般来说AdaGrad算法一开始是激励收敛,到了后面就慢慢变成惩罚收敛,速度越来越慢对于代码实现,首先将  展开得到: 通常  ,所以在第一次训练时(2.2)式为: 因为每次训练  的值是不确定的,所以要防止处0,但是可以令  ,这样就可以在(2.2)式中去掉    将  代入(2.3)式,可以得到: 可知  恒大于0,因此不必在计算  中额外加入  ,代码如下:class AdaGrad(object):
def __init__(self, eps=1e-8, lr=1e-3):self.r = eps    # r_0 = epsilonself.lr = lrdef update(self, g: np.ndarray):r = r + np.square(g)return -self.lr * g / np.sqrt(r)RMSPropRMSProp是AdaGrad的改进算法,其公式和AdaGrad的区别只有  的计算不同,先看公式 可以看出,与AdaGrad不同,RMSProp只会累积近期的梯度信息,对于“遥远的历史”会以指数衰减的形式放弃并且AdaGrad算法虽然在凸函数(Convex Functions)上表现较好,但是当目标函数非凸时,算法梯度下降的轨迹所经历的结构会复杂的多,早期梯度对当前训练没有太多意义,此时RMSProp往往表现更好以下是将  展开后的公式: 与AdaGrad一样,令  ,从而去掉计算  时的  ,实现代码:class RMSProp(object):
def __init__(self, lr=1e-3, beta=0.999, eps=1e-8):self.r = epsself.lr = lrself.beta = betadef update(self, g: np.ndarray):r = r * self.beta + (1-self.beta) * np.square(g)return -self.lr * g / np.sqrt(r)AdaDeltaAdaDelta是与RMSProp相同时间对立发展出来的一个算法,在实现上可以看作是RMSProp的一个变种,先看公式: 可以看到该算法不需要设置学习率  ,这是该算法的一大优势。除了同样以  来累积梯度的信息之外,该算法还多了一个  以指数衰减的形式来累积  的信息与前面相同,令: 然后去掉(3.1)中的  ,得到: 这样的话可以减少一些计算,代码如下:class AdaDelta(object):
def __init__(self, beta=0.999, eps=1e-8):self.r = epsself.s = epsself.beta = betadef update(self, g: np.ndarray):g_square = (1-self.beta) * np.square(g)     # (1-beta)*g^2r = r * self.beta + g_squarefrac = s / rres = -np.sqrt(frac) * gs = s * self.beta + frac * g_squaretmp      # 少一次乘法。。。return res关于以上几个算法的对比:其中NAG是Nesterov Momentum更多关于AdaDelta的信息,可以参考这篇文章:自适应学习率调整:AdaDeltaAdamAdam的名称来自Adaptive Momentum,可以看作是Momentum与RMSProp的一个结合体,该算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率,公式如下: (4.1)和(4.2)在Momentum和RMSProp中已经介绍过了,而不直接使用  计算  却先经过(4.3)和(4.4)式是因为通常会设  ,所以此时梯度的一阶矩估计和二阶矩估是有偏的,需要进行修正虽然没办法避免修正计算,但是还是可以省去一些计算过程,初始化时令: 然后(4.5)式变为: 因为  ,可知当  足够大时修正将不起作用(也不需要修正了): 代码如下:class Adam(object):
def __init__(self, lr=1e-3, alpha=0.9, beta=0.999, eps=1e-8):self.s = 0self.r = epsself.lr = lrself.alpha = alphaself.beta = betaself.alpha_i = 1self.beta_i = 1def update(self, g: np.ndarray):self.s = self.s * self.alpha + (1-self.alpha) * gself.r = self.r * self.beta + (1-self.beta) * np.square(g)self.alpha_i *= self.alphaself.beta_i *= self.beta_ilr = -self.lr * (1-self.beta_i)**0.5 / (1-self.alpha_i)return lr * self.s / np.sqrt(self.r)AdaMax首先回顾RSMSProp中  的展开式并且令  ,得到:可以看到这相当于是一个  的  范数,也就是说  的各维度的增量是根据该维度上梯度的  范数的累积量进行缩放的。如果用  范数替代就得到了Adam的不同变种,不过其中  范数对应的变种算法简单且稳定对于  范数,第  轮训练时梯度的累积为:然后求无穷范数: 由此再来递推  : 需要注意,这个max比较的是梯度各个维度上的当前值和历史最大值,具体可以结合代码来看,最后其公式总结如下: 另外,因为  是累积的梯度各个分量的绝对值最大值,所以直接用做分母且不需要修正,代码如下:class AdaMax(object):
def __init__(self, lr=1e-3, alpha=0.9, beta=0.999):self.s = 0self.r = 0self.lr = lrself.alpha = alphaself.alpha_i = 1self.beta = betadef update(self, g: np.ndarray):self.s = self.s * self.alpha + (1-self.alpha) * gself.r = np.maximum(self.r*self.beta, np.abs(g))self.alpha_i *= self.alphalr = -self.lr / (1-self.alpha_i)return lr * self.s / self.rNadamAdam可以看作是Momentum与RMSProp的结合,既然Nesterov的表现较Momentum更优,那么自然也就可以把Nesterov Momentum与RMSProp组合到一起了,首先来看Nesterov的主要公式: 为了令其更加接近Momentum,将(5.1)和(5.2)修改为: 然后列出Adam中Momentum的部分: 将(5.5)和(5.6)式代入到(5.7)式中: 将上式中标红部分进行近似: 代入原式,得到: 接着,按照(5.4)式的套路,将  替换成  ,得到: 整理一下公式: 同样令  ,消去(5.8)式种的  : 代码class Nadam(object):
def __init__(self, lr=1e-3, alpha=0.9, beta=0.999, eps=1e-8):self.s = 0self.r = epsself.lr = lrself.alpha = alphaself.beta = betaself.alpha_i = 1self.beta_i = 1def update(self, g: np.ndarray):self.s = self.s * self.alpha + (1-self.alpha) * gself.r = self.r * self.beta + (1-self.beta) * np.square(g)self.alpha_i *= self.alphaself.beta_i *= self.beta_ilr = -self.lr * (1-self.beta_i)**0.5 / (1-self.alpha_i)return lr * (self.s * self.alpha + (1-self.alpha) * g) / np.sqrt(self.r) NadaMax按照同样的思路,可以将Nesterov与AdaMax结合变成NadaMax,回顾以下(5.8)式: 然后是AdaMax的二阶矩估计部分: 用(6.2)式替换掉(6.1)式中标红部分,得到: 最后,整理公式: 代码实现:class NadaMax(object):
def __init__(self, lr=1e-3, alpha=0.9, beta=0.999):self.s = 0self.r = 0self.lr = lrself.alpha = alphaself.alpha_i = 1self.beta = betadef update(self, g: np.ndarray):self.s = self.s * self.alpha + (1-self.alpha) * gself.r = np.maximum(self.r*self.beta, np.abs(g))self.alpha_i *= self.alphalr = -self.lr / (1-self.alpha_i)return lr * (self.s * self.alpha + (1-self.alpha) * g) / self.r

链接:https://zhuanlan.zhihu.com/p/81020717
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

SGD,Momentum,优化算法原理及实现相关推荐

  1. rbf神经网络原理_【新书推荐】【2012.12】智能优化算法原理与应用(李士勇)...

    智能优化算法是指通过计算机软件编程模拟自然界.生物界乃至人类自身的长期演化.生殖繁衍.竞争.适应.自然选择中不断进化的机制与机理,从而实现对复杂优化问题求解的一大类算法的统称.李士勇编著的<智能 ...

  2. 萤火虫算法_40多种智能优化算法原理和代码分享

    40多种智能优化算法原理和代码分享 <智能优化算法讲解>PDF下载地址: <智能优化算法原理讲解>PDF​mianbaoduo.com 包括: 1.海鸥算法SOA 智能优化算法 ...

  3. 详解鲸鱼优化算法原理、数学模型和实例代码

    鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提出的一种新的群体智能优化算法,其优点在于操作简单,调整 ...

  4. 【最全干货】从SGD到NadaMax,十种机器学习优化算法原理及实现

    点击上方,选择星标或置顶,不定期资源大放送! 阅读大概需要15分钟 Follow小博主,每天更新前沿干货 作者丨永远在你身后@知乎 来源丨https://zhuanlan.zhihu.com/p/81 ...

  5. 收藏 | 从SGD到NadaMax,深度学习十种优化算法原理及实现

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:作者丨永远在你身后@知乎 来源丨https://zhuanl ...

  6. 深度学习必备:随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  7. 深度学习系列之随机梯度下降(SGD)优化算法及可视化

    补充在前:实际上在我使用LSTM为流量基线建模时候,发现有效的激活函数是elu.relu.linear.prelu.leaky_relu.softplus,对应的梯度算法是adam.mom.rmspr ...

  8. PyTorch-Adam优化算法原理,公式,应用

    概念:Adam 是一种可以替代传统随机梯度下降过程的一阶优化算法,它能基于训练数据迭代地更新神经网络权重.Adam 最开始是由 OpenAI 的 Diederik Kingma 和多伦多大学的 Jim ...

  9. MATLAB应用实战系列NSGA-II多目标优化算法原理及应用实例(附MATLAB代码)

    前言 NSGA-Ⅱ是最流行的多目标遗传算法之一,它降低了非劣排序遗传算法的复杂性,具有运行速度快,解集的收敛性好的优点,成为其他多目标优化算法性能的基准. NSGA-Ⅱ算法是 Srinivas 和 D ...

  10. GRASP优化算法原理梳理和应用细节

    文章目录 1.简介-Introduction 2.算法流程和概念引入 3.RCL的构建细节和技巧 3.1 静态构建RCL 3.2 基于均匀分布构建RCL 3.3 非均匀离散分布构建RCL 3.4 Re ...

最新文章

  1. Yii-mongo操作
  2. 【学亮IT手记】SpringMVC增删改查+map数据返回Controller层代码示例
  3. 题目:[NOIP2008]火柴棒等式
  4. [html] html的img标签为什么要添加alt属性呢?
  5. Spark Streaming之运行架构
  6. 刘意 java基础视频_传智播客 2015年 刘意_Java基础视频-深入浅出精华版 笔记(day21~day23)(2016年4月8日13:28:21)...
  7. 传智播客java费用_传智播客java费用
  8. 兄弟9020cdn提示更换粉盒_兄弟打印机提示更换墨粉盒怎么办
  9. win10 安装dig工具与使用dig命令
  10. c语言二级考试成绩查询,全国计算机二级考试成绩查询
  11. 请求指纹认证授权秘钥使用
  12. java list 时间排序吗_java collection.sort()根据时间排序list | 学步园
  13. 《让子弹飞》系列——《让子弹飞》中最大的彩蛋
  14. R语言实战应用精讲50篇(十二)-正态分布与方差齐性的检验方法与SPSS操作
  15. ffmpeg 4.2.1 版本升级日志 APIChanges
  16. 杭州职业技术学院计算机教研室主任,课题名称杭州地区农村小学教师运用现代教育技术现状调查和对策的研究.doc...
  17. 以下是三套目前Web 2.0网站流行试用的颜色元素
  18. xv6 makefile详解
  19. 太厉害了,竟然用 Python 给英语老师开发了个英语作文批改的神器
  20. IEEE期刊LaTeX模板

热门文章

  1. popwindow的显示层面
  2. 数据库技术与应用课程设计-学生信息管理系统
  3. Eucalyptus云平台搭建
  4. 拖动滑块验证 php,基于JS组件实现拖动滑块验证功能
  5. 因一纸设计稿,我把竞品APP扒得裤衩不剩(上)
  6. 未越狱苹果设备抓包方法
  7. 会声会影x4素材_怎么给视频打马赛克?运用会声会影2019
  8. 杨永强“兑”现承诺 乐视云发力VaaS
  9. SaaS vs 低代码,谁在成为中国产业服务的楔子?
  10. 全球餐厅库存管理软件行业调研及趋势分析报告