トピックの理解を深めるために、MATLABでニューラルネットワークを実装しました。Matlab GPUバックプロパゲーション
GPUでコードを実行したかったので、すべてのマトリックスをgpuArray()
で初期化しましたが、パフォーマンスは向上しませんでした。さらに、GPUがCPUより遅くなることがあります。私はすでにarrayfun
、pagefun
のような機能を使うことを学んだ。 バックプロンプトでは、すべてのレイヤーのデルタエラーを後方に計算するループがfor
です。しかし、計算には以前の計算の結果が必要であり、*fun()
関数でこれを行う方法はわかりません。
私のCPUはi5-3570、私のGPUはGTX 660 Tiです。 私は既にGPUBenchをMATLABでテストしましたが、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ではすべてが高速です。データ量や問題自体などによって異なります。その上に、MATLABはGPUのいくつかのことを行いますが、非常に厄介なGPUプログラミングツールです。 GPUにデータを置くのは遅いですが、そのコード部分のすべてがGPUで実行されていますか?そうでなければ、データを前と後ろに移動し、すべてを遅くすることになります。さらに、その索引付け(例えば、 'NN.activationGradient(NN.a_hidden(:,:、i))')はおそらくコードを遅くするでしょう。 –