【问题标题】:Echo state neural network?回声状态神经网络?
【发布时间】:2012-05-14 12:02:03
【问题描述】:

这里有人熟悉回声状态网络吗?我在 C# 中创建了一个回声状态网络。目的只是将输入分为好和不好的输入。输入是一个双精度数数组。我知道对于这种分类,回声状态网络可能不是最佳选择,但我必须使用这种方法。

我的问题是,在训练网络之后,它无法泛化。当我用外国数据(不是教学输入)运行网络时,我只能得到大约 50-60% 的好结果。

更多细节:我的回声状态网络必须像函数逼近器一样工作。函数的输入是一个包含 17 个双精度值的数组,输出是 0 或 1(我必须将输入分类为坏输入或好输入)。

所以我创建了一个网络。它包含一个具有 17 个神经元的输入层、一个存储层,其神经元数量是可调的,以及包含 1 个神经元的输出层,输出需要 0 或 1。在一个更简单的示例中,不使用输出反馈(我尝试使用输出反馈也一样,但没有任何改变)。

储层的内部矩阵也是可调的。我生成两个双精度值(最小值,最大值)之间的权重,稀疏度可调节。如果值太大,它会使矩阵的光谱半径低于 1。储层可以具有 sigmoid 和 tanh 激活函数。

输入层完全连接到具有随机值的存储层。因此,在训练状态下,我使用训练数据计算内部 X(n) 储存器激活,将它们收集到矩阵 rowvise 中。使用所需的输出数据矩阵(现在是具有 1 或 0 个值的向量),我计算输出权重(从水库到输出)。水库完全连接到输出。如果有人使用回声状态网络现在我在说什么。我是这个的伪逆方法。

问题是,我怎样才能调整网络以便更好地泛化?使用外国数据集(不是训练数据集)达到超过 50-60% 的期望输出。如果我用训练数据集再次运行网络,它会给出非常好的结果,80-90%,但我想要的是更好地泛化。

我希望有人对回声状态网络也有这个问题。

【问题讨论】:

  • "如果有人可以,请回复,以便我更彻底地解释我的问题。"不如你解释得更透彻,然后我们回应?

标签: machine-learning neural-network classification


【解决方案1】:

就像这里的其他答案所建议的那样,这是一个典型的过度拟合案例:您的模型在训练数据上表现良好,但它不能很好地推广到新的测试数据。

Hugh 的回答有一个很好的建议,那就是减少模型中的参数数量(即通过缩小水库的大小),但我不确定它是否对 ESN 有效,因为ESN 可以解决的问题复杂性与水库大小的对数成正比。减小模型的大小实际上可能会使模型无法正常工作,尽管这可能是避免此类模型过度拟合所必需的。

Superbest 的解决方案是,一旦验证集的性能停止改进,就使用验证集停止训练,这种技术称为early stopping。但是,正如您所指出的,由于您使用离线回归来计算 ESN 的输出权重,因此您无法使用验证集来确定何时停止更新模型参数——提前停止仅适用于在线训练算法。

但是,您可以通过另一种方式使用验证集:对回归系数进行正则化!以下是它的工作原理:

  • 将您的训练数据分成“训练”部分(通常是您可用数据的 80-90%)和“验证”部分(剩余的 10-20%)。
  • 在计算回归时,不要使用普通线性回归,而是使用正则化技术,例如 ridge regressionlasso regressionelastic net regression。仅使用数据集的“训练”部分来计算回归。
  • 所有这些正则化回归技术都有一个或多个“超参数”,可以平衡模型拟合与其复杂性。 “验证”数据集用于设置这些参数值:您可以使用grid search、进化方法或任何其他超参数优化技术来执行此操作。一般来说,这些方法通过选择超参数的值、使用“训练”数据集拟合模型以及测量拟合模型在“验证”数据集上的性能来工作。重复 N 次并选择在“验证”集上表现最佳的模型。

您可以通过http://en.wikipedia.org/wiki/Least_squares#Regularized_versions 了解更多关于正则化和回归的信息,或者在机器学习或统计教科书中查找。

另外,请在http://en.wikipedia.org/wiki/Cross-validation_(statistics) 阅读有关交叉验证技术的更多信息。

【讨论】:

    【解决方案2】:

    如果您的网络没有泛化,则意味着它过度拟合。

    要减少神经网络的过拟合,有两种方法:

    • 获取更多训练数据
    • 减少神经元数量

    您还可以考虑为网络提供的功能。例如,如果它是每周重复的时间序列,那么一个特征就是“星期几”或“星期几”或“星期几”。

    神经网络需要大量数据。很多很多的例子。数千。如果你没有数千个,你应该选择一个只有少数神经元的网络,或者使用其他的东西,比如回归,它的参数更少,因此不太容易过度拟合。

    【讨论】:

      【解决方案3】:

      如果我理解正确,您有一组已知的分类数据,您可以在这些数据上进行训练,然后您有一些未知数据,您随后会对其进行分类。你发现训练后,你可以很好地重新分类你的已知数据,但不能很好地对未知数据进行分类。我相信这称为overfitting - 您可能想要考虑对网络不那么严格,减少节点数量,和/或基于隐藏数据集进行训练。

      人们这样做的方式是,他们有一个训练集 A、一个验证集 B 和一个测试集 C。您知道 A 和 B 的正确分类但不知道 C(因为您将已知数据拆分为 A B 和 C 是您希望网络为您找到的值)。训练时,您只显示网络 A,但在每次迭代中,为了计算成功,您同时使用 A 和 B。因此,在训练时,网络试图通过仅查看 A 来理解 A 和 B 中存在的关系。因为它看不到 B 中的实际输入和输出值,而只知道它当前的状态是否准确地描述了 B,这有助于减少过度拟合。

      通常人们似乎将 4/5 的数据分成 A,将 1/5 的数据分成 B,但当然你可以尝试不同的比率。

      最后,你完成了训练,看看网络会对你的未知集合 C 说些什么。

      很抱歉提供了非常笼统和基本的答案,但也许它有助于更​​好地描述问题。

      【讨论】:

      • 感谢您的回答,但我不确定我是否理解正确。所以你说,在我用 A 训练网络并计算 Reservoir 以输出连接后,用 A 和 B 运行网络,然后我就可以计算成功率。这样,内部水库状态 X(n) 会改变它对数据集 C 的“好”方式吗?我会试试的,谢谢! :) 希望它会有所帮助。
      • 不客气。也许这会有所帮助:stackoverflow.com/questions/2976452/…
      • 嗯,问题是我不使用反向传播。我的方法是diffrenet。我使用离线算法来计算输出权重。
      猜你喜欢
      • 2012-10-19
      • 2019-01-27
      • 2021-06-02
      • 2020-10-07
      • 2020-12-28
      • 2021-09-13
      • 1970-01-01
      • 2018-11-09
      • 2017-02-19
      相关资源
      最近更新 更多