我目前正在筛选关于神经网络的分布式训练(向后传播训练)的大量材料。而且,我越深入研究这种材料,对我来说似乎越多,基本上每种分布式神经网络训练算法都只是一种结合分布式节点(通常使用平均值完成)相对于执行环境(即网络)约束而生成的梯度的方法。拓扑,节点性能平等...)。
基础算法的所有精髓都集中在对执行环境约束的假设的开发上,目的是减少整体滞后,从而减少完成训练所需的整体时间。
因此,如果我们仅以某种巧妙的方式将权重平均与梯度训练与分布式训练相结合,则整个过程训练(或多或少)就等同于每个分布式节点中训练所产生的网络平均。
如果我对上述情况是正确的,那么我想尝试手工组合分布式节点产生的权重。
所以我的问题是: 您如何使用任何主流技术(例如tensorflow / caffe / mxnet / ...)产生两个或多个神经网络权重的平均值
提前谢谢
编辑@Matias Valdenegro
Matias我明白您在说什么:您的意思是,一旦应用渐变,新的渐变就会改变,因此无法进行并行化,因为旧的渐变与新的更新权重无关。因此,现实世界中的算法会评估梯度,对其进行平均然后再应用。
现在,如果您仅在此数学运算中扩展括号,则会注意到您可以在本地应用渐变。如果对增量(向量)求平均值或对NN状态(点)求平均值,则基本上没有区别。请参考下图:
假设NN权重是二维向量。
Initial state = (0, 0)
Deltas 1 = (1, 1)
Deltas 2 = (1,-1)
-----------------------
Average deltas = (1, 1) * 0.5 + (1, -1) * 0.5 = (1, 0)
NN State = (0, 0) - (1, 0) = (-1, 0)
现在,如果在节点上局部应用渐变,并且中心节点将平均权重而不是增量,则可以实现相同的结果:
--------- Central node 0 ---------
Initial state = (0, 0)
----------------------------------
------------- Node 1 -------------
Deltas 1 = (1, 1)
State 1 = (0, 0) - (1, 1) = (-1, -1)
----------------------------------
------------- Node 2 -------------
Deltas 2 = (1,-1)
State 2 = (0, 0) - (1, -1) = (-1, 1)
----------------------------------
--------- Central node 0 ---------
Average state = ((-1, -1) * 0.5 + (-1, 1) * 0.5) = (-1, 0)
----------------------------------
所以结果是一样的...
答案 0 :(得分:1)
标题中的问题与正文中的问题不同:)我将同时回答这两个问题:
标题问题:“分布式培训产生的NN是每个分布式节点内受训的NN的平均值吗?”
不。在使用minibatch SGD进行模型训练的情况下,分布式训练通常是指数据并行分布式训练,该训练将N个worker上的微型记录的梯度计算分布在N个工作者上,然后生成用于更新中心模型的平均梯度权重,以异步或同步方式。从历史上看,平均发生在一个单独的过程中,该过程称为参数服务器(MXNet和TensorFlow中的历史默认值),但是现代方法使用的网络节俭,点对点环形全缩减,通过{{3} },最初是为TensorFlow开发的,但Uber's Horovod extension。请注意,还存在模型并行分布训练(在不同设备中托管模型的不同部分),但实际上,数据并行训练更为常见,这可能是因为易于实现(分布平均值很容易)并且因为完整模型通常很适合舒适地纪念现代硬件。但是,偶尔会在非常大的模型(例如now available for Keras, PyTorch and MXNet too)中看到模型并行训练。
身体问题:“如何使用任何主流技术平均产生两个或多个神经网络权重?”
这取决于每个框架API,例如:
在TensorFlow中: Google's GNMT
在PyTorch中: Tensorflow - Averaging model weights from restored models
在MXNet中(虚拟代码假定已初始化具有类似架构的 <div class="ion-padding">
<ion-item *ngFor="let contactInfo of contactList">
<ion-thumbnail slot="start">
<ion-img [src]="contactInfo.image"></ion-img>
</ion-thumbnail>
<ion-label>
<h2>{{ contactInfo.name }}</h2>
<p>{{ contactInfo.number }}</p>
</ion-label>
</ion-item>
</div>
gluon
模型)
nn.Sequential()