C++ 多核神经网络训练
直截了当地说 我的神经网络是一个典型的前馈-反向传播。 我有一个历史数据集,包括: 时间、温度、湿度、压力 我需要根据历史数据预测下一个值 这个数据集大约10MB大,因此在一个核心上训练它需要很多时间。我想用多核进行训练,但我无法理解每个核的训练数据会发生什么,以及在核完成工作后会发生什么 根据: 训练数据被分成同样大的批次,每个批次的数据都是相同的 线。每个线程向前和向后执行 传播。对每一项的权重增量和阈值增量求和 线。在每次迭代结束时,所有线程都必须暂停 简要说明要求和和应用的权重和阈值增量 到神经网络C++ 多核神经网络训练,c++,multithreading,neural-network,C++,Multithreading,Neural Network,直截了当地说 我的神经网络是一个典型的前馈-反向传播。 我有一个历史数据集,包括: 时间、温度、湿度、压力 我需要根据历史数据预测下一个值 这个数据集大约10MB大,因此在一个核心上训练它需要很多时间。我想用多核进行训练,但我无法理解每个核的训练数据会发生什么,以及在核完成工作后会发生什么 根据: 训练数据被分成同样大的批次,每个批次的数据都是相同的 线。每个线程向前和向后执行 传播。对每一项的权重增量和阈值增量求和 线。在每次迭代结束时,所有线程都必须暂停 简要说明要求和和应用的权重和阈值增量
感谢您对此的任何投入 通过反向传播完成训练通常不是人们真正想要的东西,原因是过度拟合。为了获得更好的泛化性能,通常采用权重衰减或提前停止等方法
在此背景下,考虑以下启发式方法:将数据分割成对应于核数的部分,并为每个核(每个拓扑结构相同)建立一个网络。将每个网络与其他网络完全分开进行训练(我将使用一些常用的学习率参数等)。你最终会得到很多 训练有素的网络
接下来,您需要一个方案来组合结果。选择,然后使用最小二乘法调整参数,使其最小化。这涉及到奇异值分解,该分解在测量数量M中线性扩展,因此在单个核上是可行的。请注意,这种启发式方法也与极限学习机有一些相似之处。或者,更容易的是,您可以简单地尝试平均权重,如下所示 此外,请看这些答案关于你的问题:
- 不要总是使用相同的拆分,而是在每个迭代步骤(…或在每个第n次迭代中)使用随机拆分。或者,本着随机森林的精神,只使用一个子集
- 在单个线程中处理迭代次数(如上面第1点所述)
- 不要求和权重,而是使用更高级的重组形式(可能是线程内部训练误差的权重,或上述某种最小二乘法)
- 。。。再加上更多的选择,就像在每一个复杂的优化
今天,ANN的前沿库不进行多核并行化(请参见列表)。您可以使用GPU来并行化矩阵运算(例如,使用CUDA),这要快几个数量级。可能适合更好的程序员。stackexchange.comQuick无关建议:如果您真的想将其推向边缘,您可以使用公司目前使用的:并行处理能力(即大规模并行处理器)。您可以在openCL或CUDA上编写自己的神经网络,并让它快速训练(好吧,对于简单的方法来说足够快)每个核心有多少次迭代?一个。这个答案是作为第二个问题的一部分给出的:“在每个问题的末尾