训练一个非常大的神经网络

时间:2014-05-23 10:00:21

标签: c++ cuda parallel-processing opencl neural-network

我必须训练一个非常大的前馈神经网络进行模式识别。

网络有10,000个输入神经元,200个输出神经元,它的隐藏层有5100个神经元。函数x /(1 + abs(x))用作激活函数。

训练数据集的大小为100,000。

问题是训练神经网络需要很长时间,这使得对网络进行微调非常耗时。

我有两种可能的选择来提高培训效果:

  • 将隐藏层的大小减小到500到1000之间。这将大大减少所需的乘法运算次数。但是,我不确定这种减少是否会损害识别准确度。
  • 获得一个高性能的矩阵乘法库(甚至可能引入OpenCL / CUDA),目前只实现了朴素的矩阵乘法,这应该比经过精心调整的矩阵乘法慢。

还有更好的选择吗?我是ANN的新手,任何建议都表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:2)

用一句话 - 首先播放隐藏图层的大小以查看适合您需求的尺寸

我曾经为前馈反向传播编写了一个实现。网络的大小可能是唯一的因素,但你也有反向传播阶段的etta(收敛因子)和其他因素(我需要记住,但我保证尝试)。你也有一些技巧作为互相关。您也可以尝试优化差异化代码和激活功能(小x可能会引入数字问题,并且您有分工操作)

我的策略是首先检查隐藏层 - 隐藏层中的5000个神经元相比,10000个输入神经元是相当大的隐藏层(但是,它取决于问题)。 要计算的函数数量是主要瓶颈 - 隐藏层大小的二次方。如果隐藏层中的节点数是O(N),则在外层和隐藏层之间执行的函数的数量是O(N ^ 2)。 这是因为输入层中的每个节点都需要贡献给隐藏层中的所有节点,并且与输出层和隐藏层相同。

在我处理的问题中 - 图像压缩,输入神经元大小的1/8或甚至1/16满足了我的需求。我强烈建议您首先测试隐藏的图层大小,以查看隐藏图层大小和结果质量之间的最佳权衡。

此外 - 前馈(和反向传播)可以并行方式实现 - 考虑使用open-mp。 通过并行处理,可以非常有效地完成每个节点中权重的累积。

答案 1 :(得分:0)

http://deeplearning.net/software/theano/处获取战利品。

它确实支持OpenCL,并且适用于ANN,例如这是LeNet的实现: http://deeplearning.net/tutorial/lenet.html