Matlab GPU 反向传播
Matlab GPU Backpropagation
为了更好地理解主题,我在 MATLAB 中实现了一个神经网络。
我想 运行 我的 GPU 上的代码,所以我用 gpuArray()
初始化了每个矩阵,但没有得到性能提升。此外,有时 GPU 比 CPU 慢。我已经学会了使用 arrayfun
、pagefun
等函数。
在 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
predicted
、NN.y
、NN.Theta_*
都是gpuArray
。我已经将 delta_*
初始化为 gpuArray
但它没有任何区别。
将 GPU 用于神经网络的优势不在于一次计算每一层的更新 - 正如您所指出的那样,它本质上是串行的。它来自于能够同时计算每一层中数千个神经元的权重更新。
所以我怀疑您只是没有足够大的网络来使使用 GPU 变得有利。每层的权重矩阵的大小是多少?如果它不包含至少 1000 个元素,您可能不会看到与您的 CPU 正在执行的高度优化的多核和本质矢量化计算相比有多大优势。
为了更好地理解主题,我在 MATLAB 中实现了一个神经网络。
我想 运行 我的 GPU 上的代码,所以我用 gpuArray()
初始化了每个矩阵,但没有得到性能提升。此外,有时 GPU 比 CPU 慢。我已经学会了使用 arrayfun
、pagefun
等函数。
在 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
predicted
、NN.y
、NN.Theta_*
都是gpuArray
。我已经将 delta_*
初始化为 gpuArray
但它没有任何区别。
将 GPU 用于神经网络的优势不在于一次计算每一层的更新 - 正如您所指出的那样,它本质上是串行的。它来自于能够同时计算每一层中数千个神经元的权重更新。
所以我怀疑您只是没有足够大的网络来使使用 GPU 变得有利。每层的权重矩阵的大小是多少?如果它不包含至少 1000 个元素,您可能不会看到与您的 CPU 正在执行的高度优化的多核和本质矢量化计算相比有多大优势。