【发布时间】:2014-07-12 15:18:54
【问题描述】:
我必须训练一个非常大的前馈神经网络来进行模式识别。
该网络有 10,000 个输入神经元,200 个输出神经元,它的隐藏层有 5100 个神经元。函数 x / (1 + abs(x)) 用作激活函数。
训练数据集的大小为 100,000。
问题是训练神经网络需要很长时间,这使得微调网络非常耗时。
我想到了两种可能的方法来提高训练性能:
- 将隐藏层的大小减少到 500 到 1000 之间。这将大大减少所需的乘法运算次数。但是我不确定这种减少是否会损害识别准确性。
- 获取一个高性能的矩阵乘法库(甚至可能引入 OpenCL/CUDA),目前只实现了简单的矩阵乘法,应该比仔细调优的要慢。
有没有更好的选择?我是 ANN 的新手,欢迎提出任何建议。
谢谢。
【问题讨论】:
-
naive matrix multiplication。那很不好。很坏。非常非常糟糕。使用 BLAS。也许阿特拉斯 -
您想自己编写人工神经网络吗?否则应该已经优化了 ANN 实现,您可以将其用于您的设计。
-
人们已经在数十甚至数百本书中写过关于该主题的建议......
-
或许你可以看看这篇论文:PARALLEL IMPLEMENTATION OF ARTIFICIAL NEURAL NETWORK TRAINING。作者将 ANN 训练的性能与“蛮力”方法(从您的帖子看来您正在使用这种方法)、单线程和多线程 MKL 矩阵乘法和 cuBLAS(即 NVIDIA 提供的 BLAS 例程)进行比较。您可以了解一种方法如何比其他方法提高性能。
-
你有稀疏的输入吗(大部分都是0)?在这种情况下,您可以使用稀疏矩阵乘法加速实现。此外,您可以与矩阵运算并行地前向传播和反向传播多个样本,例如W * x_n 将是 X * W^T,其中 X 的第 n 行是 x_n。
标签: c++ cuda parallel-processing opencl neural-network