【问题标题】:Train a very large neural network [closed]训练一个非常大的神经网络 [关闭]
【发布时间】: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


【解决方案1】:

一句话——先玩一下隐藏层的大小,看看什么大小适合你的需求

我曾经写过一个前馈反向传播的实现。网络的大小可能是唯一的因素,但在反向传播阶段你也有 etta(收敛因素)和其他因素(我需要记住,但我保证会尝试)。你也有一些技巧作为互相关。也可以尝试优化微分码和激活函数(小x可能会引入数值问题,还有除法运算)

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

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

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

【讨论】:

  • 我同意你的观点,应该重新检查隐藏层,尤其是在考虑了输出层的大小之后。昨晚我也在考虑 OpenMP/OpenCL。我先试试 OpenMP,比 OpenCL 更容易实现。
  • 我已经接受了这个。我尝试了 OpenMP,更好但不是很好,使用 4 核 CPU,总时间仅减少了 40%。这是意料之中的,因为除了一堆浮点数操作之外,我无法在循环的单次迭代中投入太多。 OpenCL 更擅长解决这类问题。
  • @user416983 当然,OpenCL 可能更好(尤其是如果你有 GPU),但对我来说它太复杂而无法开始。 OpenMP 非常简单,而且您会得到有效的结果。 40% 比我预期的要少(当然你永远不会得到 75%)。无论如何,看起来你可以提高 40%。
【解决方案2】:

http://deeplearning.net/software/theano/ 进行抢劫。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多