我在 VB.NET 中编写了一个反向传播类 - 它运行良好 - 我正在 C# 人工智能项目中使用它。
但我家里有 AMD Phenom X3,学校有 Intel i5。而且我的神经网络不是多线程的。
如何将该反向传播类转换为多线程算法?或者如何在其中使用GPGPU编程?还是我应该使用任何具有多线程反向传播神经网络的第三方库?
我在 VB.NET 中编写了一个反向传播类 - 它运行良好 - 我正在 C# 人工智能项目中使用它。
但我家里有 AMD Phenom X3,学校有 Intel i5。而且我的神经网络不是多线程的。
如何将该反向传播类转换为多线程算法?或者如何在其中使用GPGPU编程?还是我应该使用任何具有多线程反向传播神经网络的第三方库?
JeffHeaton 建议您使用弹性传播 (RPROP)而不是反向传播。有一些关于如何进行多线程 RPROP (MPROP) 的示例:
在这里讨论所有细节是很困难的,所以我建议你要么阅读那篇文章,要么看看我参考的书的相关章节。当然,这是假设您熟悉并发编程。
弹性传播通常会以相当大的因素胜过反向传播。此外,RPROP 没有必须设置的参数。反向传播需要指定学习率和动量值。为反向传播找到最佳学习率和动量值可能很困难。对于弹性传播,这不是必需的。(来源:Encog 机器学习)
我尝试为 RPROP 批处理实现多个线程,但它似乎总是比使用单个线程慢。我尝试在循环级别“#pragma omp parallel”并通过计算单独线程中的错误、梯度和权重来单独实现。在我的解释中,似乎每个线程中完成的计算太小而无法产生在切换线程和同步结果(互斥锁)中完成的计算。我想知道我是否做错了什么?我的结论是,运行 RPROP 单线程会更聪明,同时在单独的线程中处理多个神经元网络。大多数实现通常意味着多个互连的 NN,因此这是有道理的。