【问题标题】:Matlab GPU BackpropagationMatlab GPU 反向传播
【发布时间】:2016-11-28 08:25:00
【问题描述】:

我在 MATLAB 中实现了一个神经网络,以便更好地理解该主题。

我想在我的 GPU 上运行代码,所以我用 gpuArray() 初始化了每个矩阵,但没有得到性能提升。此外,有时 GPU 比 CPU 慢。我已经学会了使用arrayfunpagefun 等函数。 在反向传播中,我有一个 for 循环,它向后计算每一层的增量误差。但是,计算需要先前计算的结果,我不知道如何使用*fun() 函数来执行此操作。

我的 CPU 是 i5-3570,我的 GPU 是 GTX 660 Ti。 我已经在 MATLAB 中测试了GPUBench,GPU 比 CPU 快 x 倍,所以我认为错误出在我的代码中。

TL;DR

如何改进这个用于 GPU 计算的 MATLAB 代码?

    delta_output = (predicted - NN.Y) .* NN.activationGradient(predicted);
    delta_hidden(:, :, m) = (delta_output * NN.Theta_output) .* ...
                            NN.activationGradient(NN.a_hidden(:, :, m));
    for i = m-1:-1:1
        delta_hidden(:, :, i) = (delta_hidden(:, 2:end, i+1) * ...
                                 NN.Theta_hidden(:, :, i)) .* ...
                                 NN.activationGradient(NN.a_hidden(:, :, i));
    end

predictedNN.yNN.Theta_* 都是gpuArray。我已经将delta_* 初始化为gpuArray,但它没有任何区别。

【问题讨论】:

  • 欢迎来到 GPU 计算!首先要学习:GPU 中并非一切都更快。取决于数据量、问题本身等。最重要的是,MATLAB 只在 GPU 中为您做了一些事情,但它是一个非常糟糕的 GPU 编程工具。将数据放在 GPU 上很慢,您确定那段 CODE 上的所有内容都在 GPU 上运行吗?否则你会让我来回移动数据并减慢一切。此外,该索引(例如NN.activationGradient(NN.a_hidden(:, :, i)))可能会减慢代码速度。

标签: matlab loops neural-network gpgpu backpropagation


【解决方案1】:

将 GPU 用于神经网络的优势不在于同时计算每一层的更新 - 正如您所指出的,这本质上是串行的。它来自能够一次计算每层中数千个神经元的权重更新。

所以我怀疑您根本没有足够大的网络来使使用 GPU 更有优势。每层的权重矩阵的大小是多少?如果它不包含至少 1000 个元素,那么与 CPU 正在执行的高度优化的多核和内在矢量化计算相比,您可能不会看到太多优势。

【讨论】:

  • 是的,这就是问题所在。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2020-11-23
  • 2013-02-05
  • 2018-05-05
  • 2011-08-25
相关资源
最近更新 更多