多核神经网络训练

4

直入主题。

我的神经网络是经典的前馈反向传播网络。我有一个历史数据集,包括:

时间、温度、湿度、压力

我需要根据历史数据来预测下一个值。

这个数据集大约有 10MB,因此在一个核心上进行训练需要很长时间。我想使用多核心进行训练,但我不明白每个核心对训练数据做了什么,以及核心完成工作后会发生什么。

根据:http://en.wikipedia.org/wiki/Backpropagation#Multithreaded_Backpropagation

训练数据被分成相等大小的批次分配给每个线程。每个线程执行前向和反向传播。每个线程的权重和阈值增量被求和。在每次迭代结束时,所有线程都必须暂停一下,以便将权重和阈值增量求和并应用于神经网络。

  1. '每个线程都会执行前向和后向传播' - 这意味着,每个线程只是用其数据集的一部分进行自我训练,对吧?每个核心的训练迭代次数是多少?

  2. '在每次迭代的结束时,所有线程都必须暂停一下,以便将权重和阈值增量求和并应用于神经网络' - 这到底是什么意思?当核心完成其数据集的训练时,主程序会做什么?

感谢您对此的任何帮助!


可能更适合程序员的是programmers.stackexchange.com。 - Marco A.
快速无关的建议:如果你真的想将这个推向极限,你可以使用目前公司正在使用的并行处理能力(即大规模并行处理器)。你可以在OpenCL或CUDA上编写自己的神经网络,并快速训练它(相对于朴素方法而言足够快)。 - Marco A.
每个核心有多少次迭代?一次。这个答案是作为你的第二个问题的一部分给出的:“在 每次 迭代结束时”。合并后,再进行另一次迭代。 - Kris Vandermotten
2个回答

2
完全通过反向传播训练往往不是人们真正想要的事情,原因是过拟合。为了获得更好的泛化性能,通常会使用权重衰减或提前停止等方法。
在这种背景下,考虑以下启发式方法:将数据分成与核心数相对应的部分,并为每个核心设置一个网络(每个网络具有相同的拓扑结构)。完全分开地训练每个网络(我会使用一些公共参数,如学习率等)。您最终将得到一些经过训练的网络 http://www.texify.com/img/%5Cnormalsize%5C%21N_%7B%5Ctext%7B%7D%7D.gif,它们都是http://www.texify.com/img/%5Cnormalsize%5C%21f_i%28x%29.gif
首先,您需要一个方案来结合结果。选择http://www.texify.com/img/%5Cnormalsize%5C%21F%28x%29%3D%5Csum_%7Bi%3D1%7D%5EN%5C%2C%20%5Calpha_i%20f_i%28x%29.gif,然后使用最小二乘法调整参数http://www.texify.com/img/%5Cnormalsize%5C%21%5Calpha_i.gif,使http://www.texify.com/img/%5Cnormalsize%5C%21%5Csum_%7Bj%3D1%7D%5EM%20%5C%2C%20%5Cbig%28F%28x_j%29%20-%20y_j%5Cbig%29%5E2.gif最小化。这涉及奇异值分解,其在测量数量M的情况下具有线性比例,因此应该可以在单个核心上实现。请注意,这种启发式方法也与极限学习机有一些相似之处。或者,更简单地说,您可以尝试平均权重,如下所示。
此外,请参见这里的答案。
关于您的问题:
1.正如Kris所指出的那样,通常只需要进行一次迭代。但是,通常也可以由您选择一个小数字。在此范围内做出建议并进行测试。请注意,上述建议使用无穷大,因此用更合适的方法替换重新组合步骤。
2.此步骤只是按照字面意思执行:它将所有权重和增量(具体取决于您的算法)相加。请记住,您希望最终得到一个已经训练好的单个网络,并且使用分裂的数据来估计此网络。
收集数据时,通常会执行以下操作: (1) 在每个线程中,使用当前(全局)网络权重通过反向传播来估算增量。然后使用这些增量计算新权重。

(ii) 将这些线程本地权重求平均,得到新的全局权重(或者,您可以将增量相加,但这仅适用于线程中的单个bp迭代)。现在重新开始(i),在其中使用每个线程中相同的新计算的权重。一直执行此操作直到达到收敛。

这是一种迭代优化的形式。该算法的变体:

  • 不要总是使用相同的分割,在每个迭代步骤(...或每n个迭代步骤)中使用随机分割。或者,按照随机森林的思想,只使用子集。
  • 调整单个线程中迭代次数(如上述第1点所述)。
  • 而不是对权重进行求和,使用更高级的重组形式(也许是与线程内部训练误差有关的加权,或类似于上面的最小二乘)。
  • ......加上像每个复杂优化中的许多选择一样的选择......

谢谢你,David。我会尝试的 - 这听起来都很合理。 - PeeS

0

对于多核并行化,考虑将训练数据分配到线程等上是没有意义的。如果你自己实现这些东西,很可能最终得到的并行化实现比顺序实现更慢,因为你会频繁复制数据。

顺便说一下,在当前技术水平下,人们通常使用小批量随机梯度下降进行优化。原因是你可以简单地并行地前向传播和反向传播小批量样本,但批量梯度下降通常比随机梯度下降慢得多。

那么如何并行化前向传播和反向传播呢?你不必手动创建线程!你可以简单地用矩阵运算写出前向传播,并使用一个并行化的线性代数库(例如Eigen),或者你可以在C++中使用OpenMP进行并行化(参见例如OpenANN)。

如今,用于人工神经网络的领先库不支持多核并行化(请参见此处的列表)。您可以使用GPU来并行执行矩阵运算(例如使用CUDA),这将快上数个数量级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接