深度学习中的优化算法采用的原理是梯度下降法,选取适当的初值params,不断迭代,进行目标函数的极小化,直到收敛。由于负梯度方向时使函数值下降最快的方向,在迭代的每一步,以负梯度方向更新params的值,从而达到减少函数值的目的。

Gradient descent in deep learning

Optimizer

class Optimizer:"""优化器基类,默认是L2正则化"""def __init__(self, lr, weight_decay):self.lr = lrself.weight_decay = weight_decaydef step(self, grads, params):# 计算当前时刻下降的步长decrement = self.compute_step(grads)if self.weight_decay:decrement += self.weight_decay * params# 更新参数params -= decrementdef compute_step(self, grads):raise NotImplementedError

SGD

随机梯度下降
θ t = θ − η ⋅ g t \theta_t = \theta-\eta \cdot g_t θt​=θ−η⋅gt​

  • 每次随机抽取一个batch的样本进行梯度下降

  • 对学习率敏感,太小收敛速度很慢,太大会在极小值附近震荡

  • 对于非凸函数,容易陷入局部最小值或鞍点

class SGD(Optimizer):"""stochastic gradient descent"""def __init__(self, lr=0.1, weight_decay=0.0):super().__init__(lr, weight_decay)def compute_step(self, grads):return self.lr * grads

SGDm

SGD中加入动量(momentum)模拟是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。这样一来,可以在一定程度上增加稳定性,从而学习地更快,并且还有一定摆脱局部最优的能力。
υ t = γ υ t − 1 + g t θ t = θ t − 1 − η υ t \upsilon_t = \gamma \upsilon_{t-1} + g_t \qquad \theta_t=\theta_{t-1} - \eta \upsilon_t υt​=γυt−1​+gt​θt​=θt−1​−ηυt​

  • gt是当前时刻的梯度,vt是当前时刻参数的下降距离
  • 带动量的小球滚下山坡,可能会错过山谷
class SGDm(Optimizer):"""stochastic gradient descent with momentum"""def __init__(self, lr=0.1, momentum=0.9, weight_decay=0.0):super().__init__(lr, weight_decay)self.momentum = momentumself.beta = 0def compute_step(self, grads):self.beta = self.momentum * self.beta + (1 - self.momentum) * gradsreturn self.lr * self.beta

Adagrad

θ t = θ t − 1 − η ∑ i = 0 t − 1 ( g i ) 2 g t − 1 \theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{\sum^{t-1}_{i=0}{(g_i)^2}}}g_{t-1} θt​=θt−1​−∑i=0t−1​(gi​)2 ​η​gt−1​

  • 自适应调节学习率
  • 对低频的参数做较大的更新,对高频的做较小的更新,也因此,对于稀疏的数据它的表现很好,很好地提高了 SGD 的鲁棒性
  • 缺点是分母梯度的累积,最后梯度消失
class Adagrad(Optimizer):"""Divide the learning rate of each parameter by theroot-mean-square of its previous derivatives"""def __init__(self, lr=0.1, eps=1e-8, weight_decay=0.0):super().__init__(lr, weight_decay)self.eps = epsself.state_sum = 0def compute_step(self, grads):self.state_sum += grads ** 2decrement = grads / (self.state_sum ** 0.5 + self.eps) * self.lrreturn decrement

RMSProp

指数滑动平均更新梯度的平方,为解决Adagrad 梯度急剧下降而提出
υ 1 = g 0 2 υ t = α υ t − 1 + ( 1 − α ) ( g t − 1 ) 2 \upsilon_1 = g_0^2 \qquad \upsilon_t = \alpha\upsilon_{t-1} + (1-\alpha)(g_{t-1})^2 υ1​=g02​υt​=αυt−1​+(1−α)(gt−1​)2

θ t = θ t − 1 − η υ t g t − 1 \theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{\upsilon_t}} g_{t-1} θt​=θt−1​−υt​ ​η​gt−1​

class RMSProp(Optimizer):"""Root Mean Square Prop optimizer"""def __init__(self, lr=0.1, alhpa=0.99, eps=1e-8, weight_decay=0.0):super().__init__(lr, weight_decay)self.eps = epsself.alpha = alhpaself.state_sum = 0def compute_step(self, grads):self.state_sum = self.alpha * self.state_sum + (1 - self.alpha) * grads ** 2decrement = grads / (self.state_sum ** 0.5 + self.eps) * self.lrreturn decrement

Adam

SGDmRMSProp的结合,Adam 算法通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。

  • SGDm

θ t = θ t − 1 − m t m t = β 1 m t − 1 + ( 1 − β 1 ) g t − 1 \theta_t=\theta_{t-1} - m_t \qquad m_t = \beta_1 m_{t-1} + (1-\beta_1)g_{t-1} θt​=θt−1​−mt​mt​=β1​mt−1​+(1−β1​)gt−1​

  • RMSProp

θ t = θ t − 1 − η υ t g t − 1 \theta_t=\theta_{t-1} - \frac{\eta}{\sqrt{\upsilon_t}} g_{t-1} θt​=θt−1​−υt​ ​η​gt−1​

υ 1 = g 0 2 υ t = β 2 υ t − 1 + ( 1 − β 2 ) ( g t − 1 ) 2 \upsilon_1 = g_0^2 \qquad \upsilon_t = \beta_2\upsilon_{t-1} + (1-\beta_2)(g_{t-1})^2 υ1​=g02​υt​=β2​υt−1​+(1−β2​)(gt−1​)2

  • Adam

θ t = θ t − 1 − η υ t ′ + ε m t ′ \theta_t = \theta_{t-1} - \frac{\eta}{\sqrt{\upsilon_t'+\varepsilon}} m_t' θt​=θt−1​−υt′​+ε ​η​mt′​

m t ′ = m t 1 − β 1 t v t ′ = v t 1 − β 2 t β 1 = 0.9 β 2 = 0.999 m_t' = \frac{m_t}{1-\beta_1^t} \qquad v_t' = \frac{v_t}{1-\beta_2^t} \qquad \beta_1=0.9 \quad \beta_2=0.999 mt′​=1−β1t​mt​​vt′​=1−β2t​vt​​β1​=0.9β2​=0.999

class Adam(Optimizer):"""combination of SGDm and RMSProp"""def __init__(self, lr=0.1, betas=(0.9, 0.999), eps=1e-8, weight_decay=0.0):super().__init__(lr, weight_decay)self.eps = epsself.beta1, self.beta2 = betasself.mt = self.vt = 0self._t = 0def compute_step(self, grads):self._t += 1self.mt = self.beta1 * self.mt + (1 - self.beta1) * gradsself.vt = self.beta2 * self.vt + (1 - self.beta2) * (grads ** 2)mt = self.mt / (1 - self.beta1 ** self._t)vt = self.vt / (1 - self.beta2 ** self._t)decrement = mt / (vt ** 0.5 + self.eps) * self.lrreturn decrement

我平时做视觉任务主要用SGDm和Adam两个优化器,感觉带正则化的SGDm的效果非常好,然后调一下学习率和衰减策略


参考资料:

torch.optim — PyTorch documentation
tinynn: A lightweight deep learning library

手撕深度学习中的优化器相关推荐

  1. 深度学习算法(第5期)----深度学习中的优化器选择

    欢迎关注微信公众号"智能算法" – 原文链接(阅读体验更佳): 深度学习算法(第5期)----深度学习中的优化器选择 上一期,我们一起学习了TensorFlow在训练深度网络的时候 ...

  2. 深度学习中常用优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    本文转载自:https://www.cnblogs.com/guoyaohua/p/8542554.html 在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagr ...

  3. 手撕深度学习中的损失函数(上)

    面试中经常会问到损失函数的相关问题,本文推导了深度学习中常用损失函数的计算公式和反向传播公式,并使用numpy实现. 定义损失函数基类: class Loss:def loss(self, predi ...

  4. 深度学习三人行(第5期)----深度学习中的优化器选择

    上一期,我们一起学习了TensorFlow在训练深度网络的时候怎么解决梯度消失或梯度爆炸的问题,以及怎么尽可能的减少训练时间. 深度学习三人行(第4期)---- TF训练DNN之进阶 这期我们继续学习 ...

  5. 【深度学习】超强优化器如何与网络有机结合

    [深度学习]超强优化器如何与网络有机结合 1 Ranger优化器 2 一个例子(基于CNN和pytorch) 3 剪枝(减小优化器压力) 1 Ranger优化器 RAdam + Lookahead + ...

  6. nfa确定化 dfa最小化_深度学习中的优化:梯度下降,确定全局最优值或与之接近的局部最优值...

    深度学习中的优化是一项极度复杂的任务,本文是一份基础指南,旨在从数学的角度深入解读优化器. 一般而言,神经网络的整体性能取决于几个因素.通常最受关注的是网络架构,但这只是众多重要元素之一.还有一个常常 ...

  7. 深度学习中的优化算法串讲

    Datawhale原创 作者:谢文睿,Datawhale成员 寄语:优化算法是一个超参数,一个优化算法不是适合所有损失函数的,没有哪个优化算法是绝对的好或绝对的坏,是要根据损失函数判断的 本文对深度学 ...

  8. 【深度学习】协同优化器和结构化知识蒸馏

    [深度学习]协同优化器和结构化知识蒸馏 文章目录 1 概述 2 什么是RAdam(Rectified Adam) 3 Lookahead - 探索损失面的伙伴系统=更快,更稳定的探索和收敛. 4 Ra ...

  9. 深度学习训练营之优化器对比

    深度学习训练营之优化器对比 原文链接 环境介绍 前置工作 设置GPU 数据处理 导入数据 数据集处理 数据集可视化 模型构造 模型训练 结果可视化 原文链接

最新文章

  1. Myeclipse中项目没有代码错误提示,jsp页面无编译迹象?如何解决
  2. Linux文件系统目录
  3. .html天气预报上蔡,上蔡天气预报15天
  4. 大数据实践的 6 个阶段
  5. 巨鲸任务调度平台:spark flink任务调度
  6. 如何判断Linux load的值是否过高
  7. 解决xlwt保存的xlsx文件无法打开的问题
  8. 小明交友第五次2018.6.24
  9. Django框架(十九)—— drf:序列化组件(serializer)
  10. Bailian4003 十六进制转十进制【十六进制】
  11. CB Insights,201608月174家独角兽榜单出炉,上榜的33家中国公司都是谁?
  12. Windows操作系统原理笔记
  13. 小程序内容安全API
  14. 如何重新编辑排版错乱的PDF文件
  15. 室友还不知道FAST中国天眼是什么,快把这篇文章推给他,浅学一手卫星通信
  16. 将Linux 标准输出,错误输出重定向到文件
  17. [zz] 基于sinc的音频重采样(一):原理
  18. 几张“有趣”的简图带你理解面试题:String、StringBuffer、StringBuilder区别
  19. HTML与CSS详细介绍
  20. Linux部署lamp(centos 7),照做就行

热门文章

  1. 怎么清理mysql的死链接_网站死链如何解决?其实很简单
  2. python去除Excel重复项
  3. 使用Nodejs+Protractor搭建测试环境
  4. Geoffrey Hinton:放弃反向传播,我们的人工智能需要重头再来
  5. python怎么批量下载年报_Python+Wind 批量下载上市公司年报 - Part 1/2
  6. 在 jetson nano 上构建 isaac SDK 示例时出错:JetPack43 未在任何 .rc 文件中定义
  7. python中使用opencv的HSV颜色空间提取物体
  8. 《转》前端开发面试题
  9. Linux-打包、压缩命令
  10. Vue报错:VueCompilerError: Attribute name cannot contain U+0022 (“), U+0027 (‘), and U+003C (<).