选择优化器以完美地将神经网络拟合到训练数据

数据挖掘 机器学习 神经网络 喀拉斯 优化
2022-02-14 12:30:28

简而言之,我的问题是:如果她想要对训练数据进行完美拟合(mae < 1e-04),应该选择哪种优化器来试验完全连接的神经网络?

细节:在我的特殊情况下,函数的输入是 60 维,输出是 1 维(训练数据集是通过求解前向模型准备的)。输入和输出被归一化,样本均值被转换为 0。我的神经元的激活函数是 tanh(这给了我比 ReLu 和 Sigmoid 更好的结果)。到目前为止,我使用 Keras 的“adam”和“sgd”作为优化器,并且尝试了各种学习率。

此外,我尝试增加每个隐藏层中的神经元数量并增加隐藏层的数量。在某些时候,我的可训练参数的总数超过了 1 亿。

然而,即使尝试不同的批量大小和 10,000 个 epoch,我的最佳平均绝对误差 (mae) 也从未低于 0.07。我还没有做太多实验的唯一部分是自定义/使用高级优化器。我完全不知道为什么神经网络找不到一组可训练的参数,至少它可以过度拟合训练数据?

专家有什么建议吗?提前感谢您的时间和耐心。我非常感谢您的支持。

示例代码:

input_size = ND
nodes = 10000
inp = Input(shape=(input_size,),name='Input')
l0 = Dense(nodes, activation='tanh',name='Level0')(inp)
l1 = Dense(nodes, activation='tanh',name='Level1')(l0)

lo = Dense(1, activation='tanh',name='Level_out')(l1)

merged = Model(inputs=inp,outputs=l10)
opt = optimizers.adam(lr = 1e-5)
merged.compile(optimizer=opt,
              loss='mean_squared_error',
              metrics=['mae'])
3个回答

没有免费的午餐,只有一堆小费。您的搜索空间始终取决于您要解决的问题,并且没有一个适合所有问题。您需要运行实验来检查这一点。此外,您的网络架构是参数之一,因此在不知道您想要近似的确切功能的情况下,很难判断您的网络是否有足够的容量。乍一看,优化器是您最不应该担心的事情。

我同意@Piotr Rarus (+1);正如他所说,没有免费的午餐定理当然适用于此。

我想对四种可能的状态进行一些探索,以完美拟合训练数据:

  1. 如果它只是满射的(对一但不是一对一),由于训练功能是不可能的。这当然不太可能,但仍然可行。
  2. 由于网络架构,不可能(例如,单层,您无法拟合非线性函数)
  3. 可能的和微不足道的(例如凸问题空间)。
  4. 可能且困难,但有许多局部最小值和/或鞍点。可能但难以证明,甚至在一定的容差范围内达到全局最优。

鉴于您在使用本地优化器时难以达到低错误,您很可能处于状态 4。

确定性全局优化通常非常困难,但您可以使用一些技巧。首先,如果您的误差为 0,那么您就知道您找到了一个非严格的全局最小值。

有了足够的计算能力,您可以尝试其中一些确定性全局优化方法,或者您甚至可以通过将搜索空间拆分为由您的容差定义的超立方晶格和网格搜索参数来强制执行它。

但是,假设您没有如此庞大的计算资源,并且假设您想保留这种网络架构,您可以使用更经典的技术来克服局部最小值,例如动量其他一些经典方法是高阶方法,例如Quasi-Newton 方法不幸的是,鉴于深度学习的现状,随机性和局部优化在网络训练中仍然根深蒂固,特别是在流行的框架/库中。

最后,我建议添加更多图层。我不知道你是如何分配 100+ 百万个参数的,但是根据训练集函数的不同,它可能不够非线性。

听起来您不是在尝试创建可以在训练数据集之外使用的模型,而是在尝试让您的网络记住数据集。换句话说,你的目标是过度拟合。

如果是这种情况,最简单的方法是获取您的网络出错的样本组并对它们进行上采样(在您的训练数据中包含更多次),直到它们添加到您的训练中的错误足以让您退出您当前陷入的局部最小值。