frommymind 2019-12-13
梯度下降法是目前最常用的优化算法之一,也是目前最常用的神经网络优化方法。同时,每个最先进的深度学习库都包含各种优化梯度下降算法的实现。但大多数都是针对单个节点的训练——假设训练发生在单个GPU/CPU上。随着神经网络规模的日益增大,一些分布式和并行的训练算法已经被开发出来。这篇文章的目的是探索分布式训练的一些基本技术。在这篇文章中,我们将使用随机梯度下降法作为一个特例。但是,对于大多数其他优化算法,总体概念是相同的。
神经网络的并行性主要有两种实现方式:数据并行性和模型并行性。数据并行是在并行计算环境中跨多个节点的并行化。它侧重于将数据分布在不同的节点上,这些节点并行地操作数据。在模型并行性中,模型的各个部分分布在不同的节点上。可能是这样的:1/4的层位于计算机A上,1/4的层位于B上,1/2的层位于C上,我们将主要关注数据并行性,也可以进一步关注随机梯度下降算法。
数据并行v模型并行
SGD本质上是一种顺序算法。权重在算法开始时初始化为零。对于每一步(一次传递一批训练数据),梯度都会朝着导致成本函数最小的方向更新。通常,运行它可以提供良好的收敛性,但是运行速度会很慢,尤其是在大型机器学习数据集上。这就是并行方法的用武之地。
并行方法可以有两种类型——同步,即所有计算节点在执行过程中彼此同步,异步,这里每台机器以自己的速度工作。在这两种情况下,我们要考虑的参数是模型的权重——因为每个节点在数据的不同部分上训练,所以权重是不同的。同时,我们的最终目标是对整个数据集进行训练——所有这些不同的权重集必须组合多次才能生成最终的模型。关键的区别在于——我们是否同时更新所有操作的权重,如果是的话,在什么时候更新。
同步训练是指我们以规则的时间间隔更新所有节点上的权重。根据触发更新的时间,它可以分为三大类:完全同步,K同步和K-batch同步。
同步SGD的三种基本类型
请记住,以上每一种方法都会影响模型的准确度——完全同步执行得最好,K-batch获得接近完全同步的准确度,而k-sync最少。
异步SGD
让我们仔细观察第一个worker完成执行后会发生什么。鉴于权重已更新,我们应将这些权重发送给所有其他workers。但是现在,其他workers还没有完成他们的工作,还没有准备好接受权重。这称为“Staleness”。这种现象增加了收敛时间。
通过多种方法可以弥补上述不足,但不能完全解决。一种方法是修改学习率,即为Staleness组件分配较小的学习率。
高效的沟通在训练期间起着重要作用,可以通过多种方式来实现。有两种主要的方法,一种是让一个集中的服务器收集所有的参数并分发它们,另一种是使用分散的版本,其中节点与一组要共享的其他节点进行通信。
基于参数服务器的设置
去中心化的架构(没有单独的参数服务器)
随着神经网络的使用呈指数级增长,训练快速、准确的模型变得势在必行。像谷歌、Facebook和IBM这样的巨头都在积极地研究这个领域,并且每天都在提出解决方案。流行的深度学习框架也开始支持分布式训练,如Tensorflow、Caffe和PyTorch。
在上面的文章中,我们对顺序算法(SGD)如何转换为并行算法进行了概述。
theta = np.zeros #theta = array,构造全为零的行向量。grad[0,j] = np.sum/len #∑term / m. return value > threshol