Main Content

优化神经网络训练速度和内存

内存减少

根据特定神经网络,仿真和梯度计算可以在 MATLAB® 或 MEX 中进行。MEX 的内存效率更高,但 MATLAB 可以用时间来换取更高的内存效率。

要确定使用的是 MATLAB 还是 MEX,请使用 'showResources' 选项,如以下一般语法所示:

net2 = train(net1,x,t,'showResources','yes')

如果正在使用 MATLAB 并且存在内存限制,则可对 N 个数据子集中的每个子集依次执行 N 次计算,以换取将所需的临时存储量减少至原来的 1/N

net2 = train(net1,x,t,'reduction',N);

这称为降内存。

快速艾略特 sigmoid

一些简单的计算硬件可能不直接支持指数函数,而软件实现可能很慢。艾略特 sigmoid elliotsig 函数的作用与对称 sigmoid tansig 函数相同,但避免了指数函数。

以下是艾略特 sigmoid 的绘图:

n = -10:0.01:10;
a = elliotsig(n);
plot(n,a)

接下来,将 elliotsigtansig 进行比较。

a2 = tansig(n);
h = plot(n,a,n,a2);
legend(h,'elliotsig','tansig','Location','NorthWest')

要使用 elliotsig 而不是 tansig 来训练神经网络,请变换网络的传递函数:

[x,t] = bodyfat_dataset;
net = feedforwardnet;
view(net)
net.layers{1}.transferFcn = 'elliotsig';
view(net)
net = train(net,x,t);
y = net(x)

此处比较 elliotsigtansig 的执行时间。elliotsig 在测试系统上大约快四倍。

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 进行仿真更快,但由于两个传递函数的形状不同,训练速度不一定会更快。此处,为 tansigelliotsig 分别训练 10 个网络,但即使使用同一网络基于同一问题进行训练,训练时间也有很大差异。

[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