多核神经网络训练

时间:2014-05-06 18:28:02

标签: c++ multithreading neural-network

直截了当。

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

  

时间,温度,湿度,压力

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

此数据集大约 10MB ,因此在一个核心上进行训练需要很长时间。我希望通过培训获得多核,但我无法理解每个核心的训练数据会发生什么,以及核心完成工作后到底发生了什么。

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

  

每个培训数据都分为大批量   线程。每个线程执行前进和后退   的传播。权重和阈值增量是每个的总和   线程。在每次迭代结束时,所有线程都必须暂停   简要地说明要加总和应用的权重和阈值增量   到神经网络。

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

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

  3. 感谢您对此的任何意见!

2 个答案:

答案 0 :(得分:1)

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

在此背景下,请考虑以下启发式方法:将数据拆分为与核心数相对应的部分,并为每个核心(每个核心具有相同的拓扑)建立网络。训练每个网络完全分开其他网络(我会使用一些常用的学习率参数等)。你得到了一些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中线性地缩放,因此在单个核上应该是可行的。请注意,这种启发式方法也与极限学习机器有一些相似之处。或者,更容易,你可以简单地尝试平均权重,见下文。

此外,请参阅这些答案here


关于你的问题:

  1. 正如Kris所说,它通常是一次迭代。但是,一般来说,它也可能是您选择的一小部分。我会在这里大致介绍1到20之间的选择。请注意,上述建议使用无穷大,但是,然后用更合适的东西替换重组步骤。

  2. 这一步简单地完成了它所说的:它总结了所有的权重和增量(究竟取决于你的算法)。请记住,您的目标是最终使用一个训练有素的网络,并使用拆分数据进行估算。

  3. 要收集,通常会做以下事情:

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

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

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

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

答案 1 :(得分:0)

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

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

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

今天,人工神经网络的前沿库不进行多核并行化(请参阅here获取列表)。您可以使用GPU来并行化矩阵运算(例如,使用CUDA),速度要快几个数量级。