用于增加维度的神经网络的性能和架构

数据挖掘 机器学习 神经网络 回归 matlab
2021-09-30 12:16:10

在我意识到这存在之前,我在 Cross Validated 上发布了这个问题。我认为它更适合这里,那里没有答案,所以我删除了其他帖子。我已经复制了以下问题:

我一直在玩 MATLAB 中的神经网络工具箱,以直观地了解架构需求如何随特征维度扩展。

我整理了一个简单的例子,结果让我感到惊讶。我希望有人可以指出(a)我的不切实际的期望,或(b)神经网络工具箱的错误/滥用。

示例如下:我有一个简单的未归一化的一维高斯,我正在尝试学习。我执行以下操作:

x = -5:0.2:5;
y = exp(-x.^2/2);

net = feedforwardnet(2);
net = configure(net, x, y); 
net = train(net, x, y); 
y2 = net(x); 

plot(x, y, 'o', x, y2);
legend('Data', 'NN');

这给了我很好的结果。我得到了下面的情节。

ANN 1D

现在,我尝试将其扩展到二维,这就是我遇到麻烦的地方。我不认为我要求太多。我的数据不嘈杂,或者是稀疏的。我想如果我将足以增加维度的神经元数量增加一倍。这是我的代码:

x1 = -5:0.2:5;
x2 = -5:0.2:5;
[x1g, x2g] = meshgrid(x1, x2);
xv = [x1g(:)'; x2g(:)'];
yv = exp(-dot(xv,xv)/2);

net = feedforwardnet(4); 
net = configure(net, xv, yv);
net = train(net, xv, yv);
y2v = net(xv);  
plot3(xv(1,:), xv(2,:), yv, xv(1,:), xv(2,:), y2v, 'o');
legend('Data', 'NN');

我得到的情节是这样的:

NNet 2D

这很可怜。也许我需要更多的神经元?也许如果我将维数加倍,我需要将神经元数量增加四倍。我得到了 8 个神经元:

8 个神经元

也许有 8 个神经元我有很多权重可以适应,所以让我尝试使用正则化进行训练。我得到下面的情节trainbr

8 个正则化神经元

只有在大约 16 个神经元处,我才开始得到一些我认为合理的东西。

16 个神经元

但是,仍然存在我不喜欢的振荡。现在我知道我正在以一种天真的方式开箱即用地使用它,或者我可能期望过高。但是这个简单的例子类似于我想要解决的真正问题。我有以下问题:

  • 为什么从 1 维增加到 2 维会显着增加获得合适拟合所需的神经元数量?
  • 即使当我使用大量神经元时,我也会得到振荡,这将成为我现实世界应用程序中的一个问题。我怎样才能摆脱它?
  • 我读过的关于 NN 的大多数资源都表明神经元的数量要少得多。它们通常会声明“等于或小于输入变量的数量”之类的内容。这是为什么?多维高斯是病态吗?
  • 如果我需要更智能地处理给定数量的神经元的网络,我需要做什么?我尝试重新训练网络以查看它是否是局部最小值问题,但我通常得到类似的拟合。
  • 任何其他可能对这个问题有远程有用的东西都值得赞赏!
1个回答

需要考虑的一些事项:

  • 尝试应用适当的输入空间变换,例如转换为极坐标。
  • 尽管单个隐藏层前馈网络可以是通用逼近器,但无法保证逼近任意复杂函数所需的神经元数量。与其拥有一个隐藏层并使其越来越宽,不如尝试堆叠更多层。这使网络能够以更简单的方式对非线性进行建模。
  • 不要基于视觉检查(至少不仅),而是基于误差测量(例如 MSE)来验证模型的性能。