ニューラル ネットワークの学習の速度とメモリの最適化
メモリ削減
特定のニューラル ネットワークによっては、シミュレーションと勾配の計算が 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