本篇笔记是听刘铁岩老师做Distributed Deep Learning:New Driving Force of Artificial Intelligence报告整理而成

深度学习梯度下降公式如下

常用的深度学习训练方法为:

Full batch -> SGD -> min-batch SGD

Stochastic Gradient Descent (SGD)

其中:

  • full batch是将所有的样本过一遍再更新参数,更新的效率较低。
  • SGD每一个样本更新一次参数,更新频率非常快。但是每一个样本对应的目标函数和整个数据集对应的目标函数是有差别的,因为这是一个随机抽样。可以证明,在随机抽样的时候SGD的目标函数对整个神经网络学习的目标函数来说是一个无偏估计,但这个无偏估计可能会有很大的方差,所以在学习的过程中会引入许多因方差导致的噪声,所以学习的收敛率不是很好。
  • mini-batch是在这两者之间达到一个平衡,一方面希望比较频繁地更新参数,另一方面希望mini-batch降低单个样本带来的方差。

以上是标准的神经网络的训练方法。


challenges of training deep networks

  • Overfitting: Too many parameters to learn from limited number of training examples 当一个网络变深的时候,该网络作为一个函数的容量程指数级增大,即当网络很深的时候,该网络的表达能力非常强。
  • Gradient vanishing or exploding

上图是sigmoid导数的图像,该最大值为0.25,因此当级联导数时就会造成梯度消失。

方法1、DropOut/DropConnect
Introduce noises to the training process
随机丢掉一些点或者丢掉一些边权
During training, multiply neuron output (or weight) by a random bit with probability of (1-p)
During test, multiply neuron output (or weight) by the expectation (1-p)

关于dropout的理论分析:
解释一、dropout使神经网络的容量变小,而且变小的程度和dropout rate相关,网络容量变小,泛化能力就会变好。
解释二、从优化的角度来解释。在训练的过程中,dropout引入了许多新的随机因素,本来神经网络是非凸的网络,它有特别多的局部最优点,当学习过程中引入随机因素,就会探索更多的局部最优。

方法二、Batch Normalization

在每一个隐节点做白化,并且是带参数的白化。做白化,让一批样本的均值为0。

sigmoid函数导数在x为0时取得最大值,因此让样本的均值为0,可以减缓梯度的vanishing
另一方面,通过对min-batch做白化,而不是对整个训练样本做,这样能有效地去除了不同的batch之间的差别。这样便去除了数据的复杂度,使得网络不用去费劲fit不同的样本,这样也能减缓overfit
方法3、在标准的cnn上加了直通通路,用带参的门函数控制网络是直连还是经过sigmoid。

Highway Network的思想来源于LSTM,它的作者也是LSTM的发明者。
类似地还有:


The Deeper, The Better ?

训练数据越大,最优层数越深。

大量数据如何训练?

经典结构:数据并行。把数据切成很多小份,每一份训练数据扔到一个机器上,在该机器上即可根据本地数据来做训练,通过梯度下降更新神经网络。当每一个局部得到一些神经网络的更新之后,希望大家共同协作训练。大家就会把自己学到的东西推送到一个公共的服务器上,服务器上就会看到所有的local machine送上来的东西,它会把他们做一个集成,集成了之后就会得到一个它认为考虑了所有的训练机器所有信息之后最好的模型的状态,然后再把最好的模型发送给每一个机器。然后每一个机器利用自己的局部参数去更新下一轮的数据。这样周而复始。这就是经典的参数服务器的构架。
Parameter Sever V.S. Data flow(tensor flow里面用的图计算)各有优缺点。

数据同步的好处:精确性
同步的并行实现等价于某一个串行的梯度下降法,只不过min-batch的size变了。
Synchronous data parallelization is slow due to the barrier, and will increase the effective mini-batch size of DNN training, which usually affects the classification accuracy.。但是训练速度总是受限于最慢的机器。

异步,每个机器算完自己的梯度就扔到服务器上,并不管服务器有没有来得及把大家加在一起更新模型,结果推送上去之后就继续往下走了,不去等别的机器,但过了一段时间觉得希望等别的机器的信息的时候,就把当时那个点上服务器上的模型拽下来,更新一下自己的起点,然后再往下走。每一台机器都这样走。

这个策略更新很快,而且不用担心服务器宕掉。但它的缺点是它的过程有点out of control,已经不是任何一种标准的Gradient Descent操作。一般称这种问题为delayed gradients。

Asynchronous data parallelization is fast due to no waiting time, but will suffer from delayed grandients(even if all machines have the same speed), which usually slows down the convergence.

有人证明过,因为有delayed gradients,虽然每一轮迭代的次数很快,但是整体的收敛的轮数变大了很多。

为了解决这个问题,人们使用了很多手段,包括SSP、AdaDelay等等。他们或者强制要求跑的快的机器停下来等待比较慢的机器,或者给延迟的梯度一个较小的学习率。

一台机器算得的g(W_(t))准备更新到服务器上的模型时,由于其他机器更新了模型,此时服务器上的W已经是W_(t+tao)。因为有delayed gradients,W_(t+tao)本来需要更新g(W_(t+tao)),而现在更新了g(W_(t))。

于是想到了泰勒展开。用g(W_(t))去表示g(W_(t+tao))。

一次项已经有了。二次项需要去计算。g(W_(t))是梯度,二次项就是梯度的梯度……这样就需要计算hessian matrix,而这个矩阵的计算复杂度远大于一次项梯度的计算。

首先,泰勒展开在什么时候有意义呢?Wt和Wt+τ距离不能太远,如果相差太远,那些高阶项就不是小量,有限泰勒展开就不准了。这决定了在训练的哪个阶段使用这项技术:在训练的后半程,当模型快要收敛,学习率较小的时候,可以保证每次模型变化不太大,从而安全地使用泰勒展开。
其次,即便是多加上一个一阶项,运算量也是很大的。因为梯度函数的一阶导数对应于原目标函数的二阶导数,也就是对应于海森阵。我们知道海森阵计算和存储的复杂度都很高,在模型很大的时候,实操性不强。

Is there any efficient way of computing the hissian matrix?

那么怎么解决这个挑战呢?我们证明了一个定理,在特定情况下,Hessen阵可以几乎0代价地计算出来,而且近似损失非常之小。具体而言,我们证明了对于一些特定的损失函数(负对数似然的形式),二阶导可以被一阶导的外积进行无偏估计。无偏估计虽然均值相同,方差可能仍然很大,为了进一步提升近似效果,我们通过最小化MSE来控制方差。做完之后我们就得到了一个新的公式,这个公式除了以前的异步的梯度下降以外还多引入一项,其中包含一个神奇的Φ函数和λ因子,只要通过调节他们就可以有效的补偿延迟。
在此基础上,我们进一步证明,使用延迟补偿的异步并行算法可以取得更好的收敛性质,其对延迟的敏感性大大降低。

这样就可以把异步的梯度下降做一个改进。

 

有了这样的思路后就可以做实验对比,通常单机版是收敛到最好的精度,一旦做多机并行,精度总会有所损失。如果做同步的多机并行,因为增大了batchsize所以会有精度损失,如果做异步的多机并行,因为其过程中会有gradient delay所以也会有精度损失。

实验效果:

类似的一些研究

后面总结一下

分布式深度学习之DC-ASGD的更多相关文章

  1. 使用horovod构建分布式深度学习框架

    最近两周一直在尝试着分布式深度学习的架构,主要的原因一方面是几台机子全是1060卡,利用深度网络在较大数据样本上训练的效率极其低下,所以尝试着将几台机子做成分布式,看看能否提高训练效率:第二方面是有人 ...

  2. 分布式深度学习DDL解析

    分布式深度学习DDL解析 一.概述 给一个庞大的GPU集群,在实际的应用中,现有的大数据调度器会导致长队列延迟和低的性能,该文章提出了Tiresias,即一个GPU集群的调度器,专门适应分布式深度学习 ...

  3. Horovod 分布式深度学习框架相关

    最近需要 Horovod 相关的知识,在这里记录一下,进行备忘: 分布式训练,分为数据并行和模型并行两种: 模型并行:分布式系统中的不同GPU负责网络模型的不同部分.神经网络模型的不同网络层被分配到不 ...

  4. (转)分布式深度学习系统构建 简介 Distributed Deep Learning

    HOME ABOUT CONTACT SUBSCRIBE VIA RSS   DEEP LEARNING FOR ENTERPRISE Distributed Deep Learning, Part ...

  5. [源码解析] 深度学习分布式训练框架 Horovod (1) --- 基础知识

    [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 目录 [源码解析] 深度学习分布式训练框架 Horovod --- (1) 基础知识 0x00 摘要 0x01 分布式并 ...

  6. [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入

    [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 目录 [源码解析] 深度学习分布式训练框架 horovod (2) --- 从使用者角度切入 0x00 摘要 0 ...

  7. [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么

    [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun背后做了什么 目录 [源码解析] 深度学习分布式训练框架 horovod (3) --- Horovodrun ...

  8. [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架

    [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 目录 [源码解析] 深度学习分布式训练框架 horovod (5) --- 融合框架 0x00 摘要 0x01 架构图 ...

  9. [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构

    [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 目录 [源码解析] 深度学习分布式训练框架 horovod (6) --- 后台线程架构 0x00 摘要 0x01 ...

随机推荐

  1. Java中Void占位符的測试及个人理解

    Java对Void类的说明是:Void 类是一个不可实例化的占位符类,它保持一个对代表 Java keyword void 的 Class 对象的引用. 代表的是: 代表主要的 Java 类型 voi ...

  2. 6581 Number Triangle

    6581 Number Triangle 时间限制:500MS  内存限制:1000K提交次数:57 通过次数:47 题型: 编程题   语言: G++;GCC Description 7 3 8 8 ...

  3. 总结一下这几节Java课的...重点!!!

    1.定义一个Person类,包含两个私有的属性(name.age).一个含参的方法setValue(int age,String name).一个不含参方法setValue()和一个普通方法tell( ...

  4. Element UI Form 每行显示多列,即多个 el-form-item

    Element UI Form组件使用问题. 每个 el-form-item 都会独占一行. 对于输入项很多的管理app, 能否在每个form中, 每行显示 2 个或者多个 el-form-item ...

  5. hdoj--1533--Going Home(KM)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  6. nyoj--106--背包问题(贪心,水题)

    背包问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<= ...

  7. 鸟哥的Linux私房菜笔记第六章(一)

    目录与路径 相对路径与绝对路径 上一章简单的提到绝对路径和相对路径 绝对路径:路径的写法一定是由根目录(/)写起的,例如:/home/user 这个目录 相对路径:路径的写法不是由根目录(/)写起,例 ...

  8. php 微信支付 回调通知不停的坑

    微信支付已完工,最后有点小问题就是微信的回调会重复9次 第一步: $return = "success"; echo $return; 不管用 第二步: $return = &qu ...

  9. [转]C# ListView 单击标题实现排序(在转载的基础上有所完善)

    using System; using System.Collections; using System.Windows.Forms; //在转载的基础上有所完善 namespace TDRFacto ...

  10. Nginx介绍及知识点(摘抄)

    正向代理是把自己的网络环境切换成代理的网络 反向代理是代理机器返回给我要我的资源 本文借鉴参考于http://tengine.taobao.org/book/chapter_02.html. 属于纯干 ...