Matlab GPU 反向传播

Matlab GPU Backpropagation

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

我想 运行 我的 GPU 上的代码,所以我用 gpuArray() 初始化了每个矩阵,但没有得到性能提升。此外,有时 GPU 比 CPU 慢。我已经学会了使用 arrayfunpagefun 等函数。 在 backprop 中,我有一个 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 变得有利。每层的权重矩阵的大小是多少?如果它不包含至少 1000 个元素,您可能不会看到与您的 CPU 正在执行的高度优化的多核和本质矢量化计算相比有多大优势。