因此,对于拥有大量数据集的大型网络,它们需要一段时间才能进行训练。如果有一种方法可以跨多台机器共享计算时间,那将是非常棒的。然而,问题在于,当神经网络进行训练时,权重会在每次迭代时不断变化,每次迭代或多或少都基于最后一次 - 这使得分布式计算的想法至少成为挑战。
我认为对于网络的每个部分,服务器可能会发送1000组数据来训练网络......但是......你的计算时间和我想要的大致相同能够同时训练不同的数据集(这就是我想要做的)。
但即使我可以将网络训练分成不同数据集的块进行训练,我怎么知道我何时完成了这组数据?特别是如果发送到客户端计算机的数据量不足以实现所需的错误?
我欢迎所有的想法。
答案 0 :(得分:5)
引用http://en.wikipedia.org/wiki/Backpropagation#Multithreaded_Backpropagation:
当使用多核计算机时,多线程技术可以大大减少反向传播收敛所需的时间。如果正在使用批处理,则使反向传播算法适应多线程方式相对简单。
对于每个线程,训练数据被分解为同样大的批次。每个线程执行前向和后向传播。对每个线程求和权重和阈值增量。在每次迭代结束时,所有线程必须暂时暂停,以便将权重和阈值增量求和并应用于神经网络。
这基本上是这里描述的其他答案。
答案 1 :(得分:2)
根据您的ANN模型,您可以在多台机器上运行相同的模型,在多台机器上运行相同的训练和验证数据,但可以设置不同的ANN特性;不同运行的初始值,ANN参数,噪声等。
我曾经做过很多工作,以确保我有效地探索了问题空间并且没有停留在局部最小值等。这是一种利用多台机器而不必重新编码算法的简单方法。您可能想要考虑另一种方法。
答案 2 :(得分:1)
如果我理解正确,你是想找出一种在一组机器上训练人工神经网络的方法吗?正如您所说,划分网络并不是正确的方法,据我所知,对于大多数模型而言,这似乎是不可行的。一种可能的方法可能是对训练集进行分区并运行网络的本地副本,然后合并结果。一种直观的方法是通过交叉验证来实现这一目标并获得一些验证。正如您所说,了解网络何时进行了适当的培训是一个问题,但这种可变性通常是神经网络固有的问题,而不是并行工作。
正如您所说,每次训练迭代期间发生的更新都取决于权重的当前状态,但如果没有混合训练集/验证,您可能会过度拟合。这就是为什么简历是好的,因为你的训练集将有机会在多个样本中的训练和验证中发挥作用。
答案 3 :(得分:1)
我的假设是你有超过1个训练集,并且你有一个金标准。此外,我假设您有一些方法来存储神经网络的状态(无论是每个节点的概率权重列表,还是沿着这些线路的某些内容)。
尽可能在群集中使用尽可能多的计算节点,在每个节点上的数据集上启动该程序。保存每个结果,并测试黄金标准。哪个神经网络状态执行最佳设置作为下一轮训练的输入。尽可能多地重复
答案 4 :(得分:1)
如果您进行批量训练,则只有在完成整个数据集后才会更改权重。您可以在单独的机器/核心上计算集合中每个数据点的权重更新向量,并在最后添加它们,然后继续下一个时期。
Here是有关批量培训问题的链接。