如何让我的神经网络更好地预测正弦波?

机器算法验证 回归 神经网络 Python 喀拉斯
2022-01-22 13:05:05

在这里,看看: 生成的正弦波 您可以准确地看到训练数据的结束位置。训练数据从11

我使用了 Keras 和一个 1-100-100-2 密集网络和 tanh 激活。我从两个值 p 和 q 计算结果为 p / q。这样我就可以只使用小于 1 的值来获得任何大小的数字。

请注意,我仍然是该领域的初学者,所以请放轻松。

4个回答

您正在使用前馈网络;其他答案是正确的,即 FFNN 在超出训练数据范围的推断方面并不出色。

但是,由于数据具有周期性质量,因此该问题可能适合使用 LSTM 建模。LSTM 是对序列进行操作的各种神经网络单元,并且对他们之前“看到”的内容有“记忆”。本书章节的摘要表明,LSTM 方法在周期性问题上取得了一定的成功

在这种情况下,训练数据将是一个元组序列,任务是对一些索引了一些增加的序列。每个输入序列的长度、它们覆盖的间隔宽度以及它们的间距都由您决定。直观地说,我希望一个覆盖 1 个周期的常规网格是一个很好的起点,训练序列覆盖范围广泛的值,而不是限制在某个区间。(xi,sin(xi))xi+1xi+nni

(Jimenez-Guarneros、Magdiel 和 Gomez-Gil、Pilar 和 Fonseca-Delgado、Rigoberto 和 Ramirez-Cortes、Manuel 和 Alarcon-Aquino、Vicente,“使用 LSTM 神经网络对正弦函数进行长期预测”,在Nature-混合智能系统的灵感设计

如果您想做的是学习像这样的简单周期函数,那么您可以考虑使用高斯过程。GP 允许您通过指定适当的协方差函数在一定程度上强化您的领域知识;在这个例子中,由于你知道数据是周期性的,你可以选择一个周期性的内核,那么模型会外推这个结构。你可以在图中看到一个例子;在这里,我试图拟合潮汐高度数据,所以我知道它具有周期性结构。因为我使用的是周期性结构,所以模型正确地推断了这种周期性(或多或少)。OFC 如果你想学习神经网络,这并不重要,但这可能是比手工工程特征更好的方法。顺便说一句,神经网络和 gp 在理论上是密切相关的,在此处输入图像描述

GP 并不总是有用,因为与神经网络不同,它们很难扩展到大型数据集和深度网络,但如果您对此类低维问题感兴趣,它们可能会更快、更可靠。

(在图片中,黑点是训练数据,红色是目标;你可以看到,即使它没有完全正确,模型也大致学习了周期性。彩色带是模型的置信区间预言)

机器学习算法——包括神经网络——可以学习逼近任意函数,但仅限于训练数据密度足够的区间。

基于统计的机器学习算法在执行插值时效果最佳 - 预测接近或介于训练示例之间的值。

在您的训练数据之外,您希望进行外推。但是没有简单的方法可以实现这一目标。神经网络永远不会通过分析来学习函数,只能通过统计近似地学习 - 这对于几乎所有监督学习 ML 技术都是如此。给定足够多的示例(以及模型中的自由参数),更高级的算法可以任意接近所选函数,但仍只会在提供的训练数据范围内这样做。

网络(或其他 ML)在训练数据范围之外的行为方式将取决于其架构,包括使用的激活函数。

让机器学习算法分析预测函数的唯一方法是在模型的假设中构建一些东西。例如(也许是微不足道的),您可以创建与输入的各种函数相等的特征,例如网络 - 或者更简单的线性回归 - 将学习关联最接近的函数的预测值。sinsin(x),sin(2x+π/4)sin

在某些情况下,@Neil Slater 建议的使用周期性函数转换特征的方法效果很好,并且可能是最佳解决方案。这里的困难是您可能需要手动选择周期/波长(请参阅此问题)。

如果您希望将周期性更深入地嵌入到网络中,最简单的方法是在一层或多层中使用 sin/cos 作为激活函数。本文讨论了处理周期性激活函数的潜在困难和策略。

或者,本文采用不同的方法,其中网络的权重取决于周期函数。该论文还建议使用样条而不是 sin/cos,因为它们更灵活。这是我去年最喜欢的论文之一,因此即使您最终没有使用它的方法,也值得一读(或至少观看视频)。