python - 分布式训练产生的神经网络是否是每个分布式节点中训练的神经网络的平均值?

标签 python tensorflow machine-learning neural-network mxnet

我目前正在筛选大量有关神经网络分布式训练(反向传播训练)的 Material 。我越深入地研究这些 Material ,我就越发现,本质上每个分布式神经网络训练算法只是一种结合分布式节点产生的梯度(通常使用平均值完成)相对于执行环境(即网络)的约束的一种方法。拓扑,节点性能平等,...)。

底层算法的所有优点都集中在对执行环境约束的假设的利用上,目的是减少整体滞后,从而减少完成训练所需的总时间。

因此,如果我们只是以某种巧妙的方式使用权重平均将梯度与分布式训练结合起来,那么整个训练过程(或多或少)相当于对每个分布式节点内的训练产生的网络进行平均。

如果我对上述事情的看法是正确的,那么我想尝试手动组合分布式节点产生的权重。

所以我的问题是: 如何使用任何主流技术(例如tensorflow/caffe/mxnet/...)生成两个或多个神经网络权重的平均值

提前谢谢

编辑@Matias Valdenegro

Matias 我明白你在说什么:你的意思是,一旦应用梯度,新梯度就会改变,因此不可能进行并行化,因为旧梯度与新更新的权重没有关系。因此,现实世界的算法会评估梯度,对其进行平均,然后应用它们。

现在,如果您只是在这个数学运算中展开括号,那么您会注意到您可以在本地应用渐变。如果对增量(向量)进行平均或对 NN 状态(点)进行平均,本质上没有区别。请引用下图:

enter image description here

假设 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)
----------------------------------

所以结果是一样的......

最佳答案

标题中的问题与正文中的问题不同:)我都会回答:

标题问题:“分布式训练产生的神经网络是否是每个分布式节点中训练的神经网络的平均值?”

没有。在使用小批量 SGD 进行模型训练时,分布式训练通常是指数据并行分布式训练,它将小批量记录的梯度计算分配给 N 个工作人员,然后生成用于更新中心模型的平均梯度权重,以异步或同步方式。从历史上看,平均发生在一个称为参数服务器的单独进程中(MXNet 和 TensorFlow 中的历史默认值),但现代方法使用更加网络节俭的点对点环式全归约,通过 Uber's Horovod extension 实现民主化。 ,最初是为 TensorFlow 开发的,但是 now available for Keras, PyTorch and MXNet too 。请注意,模型并行分布式训练(模型的不同部分托管在不同设备中)也存在,但数据并行训练在实践中更常见,可能是因为更容易实现(分配平均值很容易)并且因为完整模型通常适合轻松地存储在现代硬件中。然而,对于非常大的模型偶尔会看到模型并行训练,例如 Google's GNMT .

正文问题:“如何使用任何主流技术生成两个或多个神经网络权重的平均值?”

这取决于每个框架 API,例如:

在 TensorFlow 中: Tensorflow - Averaging model weights from restored models

在 PyTorch 中: How to take the average of the weights of two networks?

在 MXNet 中(虚拟代码假设初始化的 gluon nn.Sequential() 模型具有类似的架构):

# create Parameter dict storing model parameters
p1 = net1.collect_params()
p2 = net2.collect_params()
p3 = net3.collect_params()

for k1, k2, k3 in zip(p1, p2, p3):
    p3[k3].set_data(0.5*(p1[k1].data() + p2[k2].data()))

关于python - 分布式训练产生的神经网络是否是每个分布式节点中训练的神经网络的平均值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56824036/

相关文章:

python - 存在哪些模板系统适合编写服务创建配方

python - pyGame 在简单循环中的完整核心用法

python - 无限运行服务器端python脚本?

c++ - tensorflow :转置需要一个大小为 1 的 vector 。但输入(1)是一个大小为 2 的 vector

python - Keras RNN(GRU、LSTM)产生平稳期然后改进

python - “Code against an interface, not an object” 的 Python 版本是什么?

tensorflow - tensorflow-gpu 2.0alpha0 错误

python - TensorFlow tf.group 忽略依赖关系?

python - 用空格分隔值到 ndarray

python - 在这个LSTM示例代码中如何计算可训练参数数量为335872?