看到了一个概念,叫做异步更新优化器,也就是使用异步的方式实现deep learning中的参数优化的method,这个概念比较新奇,虽然看到的异步更新神经网络的代码比较多,但是很少见到有人单独把异步优化器这个概念单独提出来,大部分实现异步更新的算法中都是对各个线程加锁以实现异步更新神经网络参数的。

那么这种单独的异步优化器(RMSpropAsync)加Lock锁的异步更新参数的方法有什么不同呢?

看了一下其实没啥不同的,可以说基本就是一个东西,只不过实现方法不同而已。我们现在所使用的优化器除了SGD(随机梯度下降)方法外都是要保存之前计算梯度下降的过程结果的,这个过程结果也叫做“二阶动量部分”,使用异步优化器(RMSpropAsync)方法则是在不同线程进行梯度更新时从全局中取出这个之前的计算结果,保存在自己的线程中,因此每个线程在更新时都会单独从全局中取出并保存一份过程结果,并在线程内进行计算并得到更新后的神经网络参数,但是要注意,由于异步优化器(RMSpropAsync)一般不采用加锁的方法,因此在更新“二阶动量部分”和神经网络参数部分已经可能与其他线程发生竞争,因此如果不加锁异步优化器(RMSpropAsync)是不能完全保证线程安全的。

可以说,不加锁的异步优化器(RMSpropAsync)只能一定程度上减少线程竞争带来的不同步问题,但是根据一些网上的资料显示,该种方式其最大优点时加快异步优化器的运算,也就是说提速才是该方法的主要目的。

============================================

不过也有些代码实现对异步优化器(RMSpropAsync)采用了一些微小的差异改变,如:

代码地址:

https://github.com/chainer/chainerrl/blob/master/chainerrl/optimizers/rmsprop_async.py

异步优化器(RMSpropAsync)代码:

    def init_state(self, param):
xp = cuda.get_array_module(param.array)
with cuda.get_device_from_array(param.array):
self.state['ms'] = xp.zeros_like(param.array) def update_core_cpu(self, param):
grad = param.grad
if grad is None:
return
hp = self.hyperparam
ms = self.state['ms'] ms *= hp.alpha
ms += (1 - hp.alpha) * grad * grad
param.array -= hp.lr * grad / numpy.sqrt(ms + hp.eps) def update_core_gpu(self, param):
grad = param.grad
if grad is None:
return
cuda.elementwise(
'T grad, T lr, T alpha, T eps',
'T param, T ms',
'''ms = alpha * ms + (1 - alpha) * grad * grad;
param -= lr * grad / sqrt(ms + eps);''',
'rmsprop')(grad, self.hyperparam.lr, self.hyperparam.alpha,
self.hyperparam.eps, param.array, self.state['ms'])

优化器(RMSpropAsync)代码:

----------------------------------------------------------------------

可以看到在这个框架下所实现的差别是epsilon变量是否在开方运算内:

RMSprop for asynchronous methods.
    The only difference from chainer.optimizers.RMSprop in that the epsilon is
    outside the square root.

================================================

附注:

Deep Learning —— 异步优化器 —— RMSpropAsync —— 异步RMSprop的更多相关文章

  1. (1)Deep Learning之感知器

    What is deep learning? 在人工智能领域,有一个方法叫机器学习.在机器学习这个方法里,有一类算法叫神经网络.神经网络如下图所示: 上图中每个圆圈都是一个神经元,每条线表示神经元之间 ...

  2. 深度学习(deep learning)优化调参细节(trick)

    https://blog.csdn.net/h4565445654/article/details/70477979

  3. 机器学习(Machine Learning)&深度学习(Deep Learning)资料

    机器学习(Machine Learning)&深度学习(Deep Learning)资料 機器學習.深度學習方面不錯的資料,轉載. 原作:https://github.com/ty4z2008 ...

  4. Tensorflow-各种优化器总结与比较

    优化器总结 机器学习中,有很多优化方法来试图寻找模型的最优解.比如神经网络中可以采取最基本的梯度下降法. 梯度下降法(Gradient Descent) 梯度下降法是最基本的一类优化器,目前主要分为三 ...

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

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  6. 【深度学习】深入理解优化器Optimizer算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  7. Deep Learning基础--参数优化方法

    1. 深度学习流程简介 1)一次性设置(One time setup)          -激活函数(Activation functions) - 数据预处理(Data Preprocessing) ...

  8. 【python实现卷积神经网络】优化器的实现(SGD、Nesterov、Adagrad、Adadelta、RMSprop、Adam)

    代码来源:https://github.com/eriklindernoren/ML-From-Scratch 卷积神经网络中卷积层Conv2D(带stride.padding)的具体实现:https ...

  9. Yarn源码分析之事件异步分发器AsyncDispatcher

    AsyncDispatcher是Yarn中事件异步分发器,它是ResourceManager中的一个基于阻塞队列的分发或者调度事件的组件,其在一个特定的单线程中分派事件,交给AsyncDispatch ...

  10. 优化器,SGD+Momentum;Adagrad;RMSProp;Adam

    Optimization 随机梯度下降(SGD): 当损失函数在一个方向很敏感在另一个方向不敏感时,会产生上面的问题,红色的点以“Z”字形梯度下降,而不是以最短距离下降:这种情况在高维空间更加普遍. ...

随机推荐

  1. es6.6.1 rest常规操作

    ES 内置的REST接口/ 获取版本信息/index/_search 搜索指定索引下的数据 test/_search/_aliases 获取或者操作索引下的别名 _aliases/index/ 查看指 ...

  2. Lecture6

    Smiling & Weeping ---- 我渴望你的在场,又渴望你的缺席,你终究是我深藏的借口 第六章 GitFlow工作流实战 6.0 引言 在实际项目开发工作中,常常会有自测.联调.提 ...

  3. 阅读mmdetection3d框架的源码探索其构建dataset的流程

    在查看一些基于mmdetection3d构建的代码的时候,一开始会摸不着头脑,它的dataset到底是怎么构造的? 接下来就直接下载mmdetection3d这个仓库,然后去分析里面的代码. 可以看到 ...

  4. Ubuntu 18.04 安装OneDrive自动同步

    Ubuntu 18.04 安装OneDrive自动同步 Windows10系统已经自带了OneDrive的自动同步功能,对于多设备用户而言已经成为了一个非常方便传输保存文件的途径,在Ubuntu下也有 ...

  5. python中dict和list的数据结构

    要理解dict的有关内容需要你理解哈希表(map)的相关基础知识,这个其实是<算法与数据结构>里面的内容. 1.list和tuple其实是用链表顺序存储的,也就是前一个元素中存储了下一个元 ...

  6. 跟我一起学习和开发动态表单系统-后端用spring boot、mybatis实现方法(4)

    ## 动态表单系统:利用 Spring Boot 和 MyBatis 实现后端服务 在现代企业应用中,表单是数据收集和处理的核心部分.然而,传统的表单系统难以适应快速变化的需求.为了解决这个问题,我们 ...

  7. sed 进阶使用

    sed 进阶使用 工作原理 sed 维护两个数据缓冲区: 活动模式空间 和 辅助保持空间 两者最初都是空的 sed 通过对每一行输入执行以下循环进行操作 从输入流中读取一行,删除任何尾随的换行符,并将 ...

  8. odoo 通过Javascript显示或隐藏form自带按钮

    实践环境 Odoo 14.0-20221212 (Community Edition) 需求描述 如下,根据条件对form视图自带按钮的显示.隐藏进行控制 代码实现 隐藏.显示编辑和创建按钮为例 od ...

  9. Nginx $remote_addr和$proxy_add_x_forwarded_for变量详解

    $remote_addr 代表客户端IP.注意,这里的客户端指的是直接请求Nginx的客户端,非间接请求的客户端.假设用户请求过程如下: 用户客户端--发送请求->Nginx1 --转发请求-- ...

  10. Python 利用argparse模块实现脚本命令行参数解析

    利用argparse模块实现脚本命令行参数解析 By:授客 QQ:1033553122 #代码实践1 study.py内容如下 #!/usr/bin/env python # -*- coding:u ...