このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
ニューラル ネットワークの学習の速度とメモリの最適化
メモリ削減
特定のニューラル ネットワークによっては、シミュレーションと勾配の計算が MATLAB® または MEX で実行される場合があります。MEX の方がメモリ効率は高いですが、MATLAB は時間と引き換えにメモリ効率を高めることができます。
MATLAB または MEX のどちらを使用しているかを確認するには、'showResources'
オプションを使用します。以下に、構文の一般的な形式を示します。
net2 = train(net1,x,t,'showResources','yes')
MATLAB が使用されており、メモリ制限が問題である場合は、データの N
個のサブセットそれぞれに対して計算が順に N
回実行される代わりに、N
の係数で必要な一時ストレージの量を減らすことができます。
net2 = train(net1,x,t,'reduction',N);
これは、メモリ削減と呼ばれます。
高速な Elliot シグモイド
シンプルな計算ハードウェアには、指数関数を直接サポートしていないものがあります。このような場合、ソフトウェアの実装が遅くなる可能性があります。Elliot シグモイド関数 elliotsig
は、対称シグモイド関数 tansig
と同じ役割を果たしますが、指数関数を回避します。
以下は Elliot シグモイドのプロットです。
n = -10:0.01:10; a = elliotsig(n); plot(n,a)
次に、elliotsig
を tansig
と比較します。
a2 = tansig(n); h = plot(n,a,n,a2); legend(h,'elliotsig','tansig','Location','NorthWest')
tansig
の代わりに elliotsig
を使用してニューラル ネットワークに学習させるには、ネットワークの伝達関数を以下のように変換します。
[x,t] = bodyfat_dataset; net = feedforwardnet; view(net) net.layers{1}.transferFcn = 'elliotsig'; view(net) net = train(net,x,t); y = net(x)
ここで、elliotsig
と tansig
の実行回数を比較します。テスト システムでは、elliotsig
が約 4 倍高速になっています。
n = rand(5000,5000); tic,for i=1:100,a=tansig(n); end, tansigTime = toc; tic,for i=1:100,a=elliotsig(n); end, elliotTime = toc; speedup = tansigTime / elliotTime speedup = 4.1406
ただし、elliotsig
ではシミュレーションが高速になるものの、2 つの伝達関数の形状が異なるため、学習も高速であるという保証はありません。ここでは、10 個のネットワークの学習をそれぞれ tansig
と elliotsig
に対して行っていますが、同じネットワークで同じ問題を実行した場合であっても学習時間が大きく変化しています。
[x,t] = bodyfat_dataset; tansigNet = feedforwardnet; tansigNet.trainParam.showWindow = false; elliotNet = tansigNet; elliotNet.layers{1}.transferFcn = 'elliotsig'; for i=1:10, tic, net = train(tansigNet,x,t); tansigTime = toc, end for i=1:10, tic, net = train(elliotNet,x,t), elliotTime = toc, end