Matlab-GPU反向传播

Matlab-GPU反向传播,matlab,loops,neural-network,gpgpu,backpropagation,Matlab,Loops,Neural Network,Gpgpu,Backpropagation,为了更好地理解这个主题,我在MATLAB中实现了一个神经网络 我想在我的GPU上运行代码,所以我用gpuArray()初始化了每个矩阵,但没有得到性能提升。此外,有时GPU比CPU慢。我已经学会了使用诸如arrayfun、pagefun等函数。 在backprop中,我有一个for循环,它向后计算每一层的增量误差。但是,计算需要上一次计算的结果,我不知道如何使用*fun()函数实现这一点 我的CPU是i5-3570,我的GPU是GTX 660 Ti。 我已经在MATLAB中测试过,GPU比CPU

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

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

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

TL;博士

如何改进这个用于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

predicted
NN.y
NN.Theta.*
都是
gpuArray
。我已经初始化了
delta.*
gpuArray
,但它没有任何区别。

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


因此,我怀疑你根本没有足够大的网络,使使用GPU的优势。每层的权重矩阵大小是多少?如果它不包含至少1000个元素,您可能看不到与您的CPU正在进行的高度优化的多核和本质上矢量化计算相比有多少优势。

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