Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 多核神经网络训练_C++_Multithreading_Neural Network - Fatal编程技术网

C++ 多核神经网络训练

C++ 多核神经网络训练,c++,multithreading,neural-network,C++,Multithreading,Neural Network,直截了当地说 我的神经网络是一个典型的前馈-反向传播。 我有一个历史数据集,包括: 时间、温度、湿度、压力 我需要根据历史数据预测下一个值 这个数据集大约10MB大,因此在一个核心上训练它需要很多时间。我想用多核进行训练,但我无法理解每个核的训练数据会发生什么,以及在核完成工作后会发生什么 根据: 训练数据被分成同样大的批次,每个批次的数据都是相同的 线。每个线程向前和向后执行 传播。对每一项的权重增量和阈值增量求和 线。在每次迭代结束时,所有线程都必须暂停 简要说明要求和和应用的权重和阈值增量

直截了当地说

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

时间、温度、湿度、压力

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

这个数据集大约10MB大,因此在一个核心上训练它需要很多时间。我想用多核进行训练,但我无法理解每个核的训练数据会发生什么,以及在核完成工作后会发生什么

根据:

训练数据被分成同样大的批次,每个批次的数据都是相同的 线。每个线程向前和向后执行 传播。对每一项的权重增量和阈值增量求和 线。在每次迭代结束时,所有线程都必须暂停 简要说明要求和和应用的权重和阈值增量 到神经网络

  • “每个线程执行前向和后向传播”-这意味着,每个线程只是使用数据集的一部分来训练自己,对吗?每个核心有多少次迭代的训练

  • “在每次迭代的en-dof中,所有线程都必须短暂暂停,以便将权重和阈值增量相加并应用于神经网络”-这到底意味着什么?当核心使用他们的数据集完成训练时,主程序做什么


  • 感谢您对此的任何投入

    通过反向传播完成训练通常不是人们真正想要的东西,原因是过度拟合。为了获得更好的泛化性能,通常采用权重衰减或提前停止等方法

    在此背景下,考虑以下启发式方法:将数据分割成对应于核数的部分,并为每个核(每个拓扑结构相同)建立一个网络。将每个网络与其他网络完全分开进行训练(我将使用一些常用的学习率参数等)。你最终会得到很多 训练有素的网络

    接下来,您需要一个方案来组合结果。选择,然后使用最小二乘法调整参数,使其最小化。这涉及到奇异值分解,该分解在测量数量M中线性扩展,因此在单个核上是可行的。请注意,这种启发式方法也与极限学习机有一些相似之处。或者,更容易的是,您可以简单地尝试平均权重,如下所示

    此外,请看这些答案


    关于你的问题:

  • 正如克里斯所指出的,它通常是一次迭代。但是,一般来说,它也可以是您选择的一个小数字。我会在这里选择大约在1到20之间的选项。请注意,上面的建议使用了无穷大,但随后用更合适的方法替换了重组步骤

  • 这一步只做了它所说的:它总结了所有的权重和增量(具体取决于你的算法)。请记住,您最终的目标是建立一个单一的经过训练的网络,并使用分割后的数据进行估计

  • 要收集,通常需要执行以下操作:

    (i) 在每个线程中,使用当前(全局)网络权重通过反向传播估计增量。然后使用这些增量计算新的权重

    (ii)平均这些线程局部权重以获得新的全局权重(或者,您可以将增量相加,但这仅适用于线程中的单个bp迭代)。现在再次从(i)开始,在其中,在每个线程中使用相同的新计算的权重。这样做直到达到收敛

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

    • 不要总是使用相同的拆分,而是在每个迭代步骤(…或在每个第n次迭代中)使用随机拆分。或者,本着随机森林的精神,只使用一个子集
    • 在单个线程中处理迭代次数(如上面第1点所述)
    • 不要求和权重,而是使用更高级的重组形式(可能是线程内部训练误差的权重,或上述某种最小二乘法)
    • 。。。再加上更多的选择,就像在每一个复杂的优化

    对于多核并行化,考虑将训练数据拆分为线程等是没有意义的。如果您自己实现了这些内容,则很可能会得到一个比顺序实现慢的并行化实现,因为您复制数据的频率太高

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

    那么,如何将正向传播和反向传播并行化呢?您不必手动创建线程!您可以简单地用矩阵运算写正向传播,并使用并行化的线性代数库(例如),或者可以在C++中用OpenMP进行并行化(参见例如)。
    今天,ANN的前沿库不进行多核并行化(请参见列表)。您可以使用GPU来并行化矩阵运算(例如,使用CUDA),这要快几个数量级。

    可能适合更好的程序员。stackexchange.comQuick无关建议:如果您真的想将其推向边缘,您可以使用公司目前使用的:并行处理能力(即大规模并行处理器)。您可以在openCL或CUDA上编写自己的神经网络,并让它快速训练(好吧,对于简单的方法来说足够快)每个核心有多少次迭代?一个。这个答案是作为第二个问题的一部分给出的:“在每个问题的末尾