- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在筛选大量有关神经网络分布式训练(反向传播训练)的 Material 。我越深入地研究这些 Material ,我就越发现,本质上每个分布式神经网络训练算法只是一种结合分布式节点产生的梯度(通常使用平均值完成)相对于执行环境(即网络)的约束的一种方法。拓扑,节点性能平等,...)。
底层算法的所有优点都集中在对执行环境约束的假设的利用上,目的是减少整体滞后,从而减少完成训练所需的总时间。
因此,如果我们只是以某种巧妙的方式使用权重平均将梯度与分布式训练结合起来,那么整个训练过程(或多或少)相当于对每个分布式节点内的训练产生的网络进行平均。
如果我对上述事情的看法是正确的,那么我想尝试手动组合分布式节点产生的权重。
所以我的问题是:如何使用任何主流技术(例如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)
----------------------------------
所以结果是一样的......
最佳答案
标题中的问题与正文中的问题不同:)我都会回答:
标题问题:“分布式训练产生的神经网络是否是每个分布式节点中训练的神经网络的平均值?”
没有。在使用小批量 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/
我在 Chrome 上做了一些测试,requestAnimationFrame 产生了 61 fps 而 setTimeOut( callback, 0 ) 产生了 233 fps。 如果一个人想要超
当我调试代码时,我发现 GCC 和 Clang 都为 0.0/0.0 产生 nan,这是我所期望的,但 GCC 产生的 nan 将符号位设置为 1,而Clang 将其设置为 0(如果我没记错的话,与
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
我在 R Studio 中有一个时间序列。现在我想计算这个系列的log()。我尝试了以下方法: i <- (x-y) ii <- log(i) 但是我得到以下信息:Warning message: I
我有兴趣了解 JavaScript 的内部结构.我试图阅读 SpiderMonkey 的来源和 Rhino但是绕过我的头是相当复杂的。 我问的原因是:为什么像 (![]+[])[+!![]+[]] 生
我们在 Delphi 中使用标准 TWebbrowser 组件,该组件在内部使用 mshtml.dll。另外,我们使用注册表来确保页面使用新的渲染引擎( Web-Browser-Control-Spe
我必须实现一个序列化/反序列化类,并且我正在使用 System.Xml.Serialization 。我有一些IList类型属性并希望在 IList 中序列化解码属于具有特定区域性信息的列表的所有十进
我有一个 Java 应用程序,它读取包含 SQL 查询的 JSON 文件,并使用 JDBC 在数据库上触发它们。 现在我有 5 万个这样的文件,我需要生成 5 万个独立线程来读取每个文件并将它们上传到
我正在尝试将 TensorFlow 入门页面上的示例线性回归程序调整为二次回归。为此,我只是添加了另一个变量并更改了函数。然而,这似乎会导致 NaN 值。这是我的代码: import numpy as
申请后KernelPCA到我的数据并将其传递给分类器 ( SVC ) 我收到以下错误: ValueError: Input contains NaN, infinity or a value too
这背后的想法是,如果我的数据库中存在登录名(正确的用户名+密码),我将重定向到一个页面,并且在进行此身份验证后,他们可以将消息存储在文本文件中。代码非常简单尽管我不确定为什么会收到 IllegalSt
我有一个返回 log10 值的函数。在将它们转换为正常数字时,出现溢出错误。 OverflowError: (34, 'Numerical result out of range') 我检查了日志值,
nosetests 抛出一个 ImportError,尽管我认为这是一个正确配置的 virtualenv。 ==============================================
我是这个网站的新手,所以如果我做错了什么,我提前道歉。当我尝试使用 kivy-garden 的 ScrollLabel 时,它给了我一个错误。基本上我正在尝试创建一个控制台日志,并且我需要能够在文本框
任何人都对 MDSJ 有任何经验?以下输入仅产生 NaN 结果,我不明白为什么。文档非常稀少。 import mdsj.Data; import mdsj.MDSJ; public class MDS
我有一个非常简单的 scala jcuda 程序,它添加了一个非常大的数组。一切都编译和运行得很好,直到我想从我的设备复制超过 4 个字节到主机。当我尝试复制超过 4 个字节时,我收到 CUDA_ER
我正在使用 Hero 组件在两个页面之间创建动画。Hero 组件用于包装一个 Image 小部件(没问题)和一个 Container 小部件(有问题)。 抛出以下溢出错误: ══╡ EXCEPTIO
我无法理解页面 https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/void 中的这一段: This ope
当在 Angular 中使用不立即触发事件的异步管道时(http 请求或任何有延迟的可观察对象),第一个值为 null为什么会这样?如何避免这种情况? 第一个变化: SimpleChange {
如果一个导入的库生成了一个会 panic 的 goroutine 怎么办?在这种情况下,开发人员无法阻止程序退出。 就像在这段代码中一样,使用延迟恢复调用一个错误的库没有帮助,因为该库正在生成一个 p
我是一名优秀的程序员,十分优秀!