【问题标题】:Neural network with custom error function具有自定义误差函数的神经网络
【发布时间】:2014-08-05 10:15:56
【问题描述】:

我正在开发一个使用前馈网络的预测应用程序。我遇到的问题是,我想预测的数据大多是趋势数据。因此,我正在尝试开发的模型如下:

y_model = f(x) + g(t)

其中x是输入向量,f(x)是神经网络,g(t)是一些随时间变化的趋势函数(即线性、指数)。

最直接的方法是修改误差函数,使其包含趋势:

E=1/2 * sum(y_ideal - y_model)^2 = 1/2 * sum(y_ideal - f(x) - g(t))^2

据我了解,解决方案在理论上非常简单,因为根据模型参数(神经网络权重 + 趋势模型参数)的梯度可以计算为:

grad E = - sum[(y_ideal-y_model)*(grad f + grad g)]

我认为,使用神经网络优化技术来搜索 NN 和趋势,并以与更新神经权重相同的方式更新趋势模型参数,在理论上没有问题。

问题是,我没有管理如何在 Encog 中执行此操作。学习规则很难理解,因为它们被写得越快越好。我也觉得,Encog中的神经网络结构是固定的,所以仅仅扩展参数向量并重写误差函数和梯度公式并不是那么简单。

【问题讨论】:

  • 我不知道encog,但你的问题是有时间进去吗?为什么不扩展x 并将时间包含在您的输入中?
  • 将时间作为输入会给出非常糟糕的结果,因为它基本上是外推,而神经网络在外推数据方面非常糟糕。另一件事是,由于使用了 sigmoid 激活函数,输入必须被限制在某个范围内。
  • 好吧,我不太了解 NN 和这些东西,但是如果你 g(t),为什么会这样推断? - 但对不起,我希望你能得到一个好的答案(有趣的东西)
  • 这是外推,因为您在给定数据的情况下训练模型,即。从时间 t1 到 t2,并想用它来预测时间 t3 > t2。

标签: c# neural-network encog trend


【解决方案1】:

为此,我认为您需要在 Encog 中创建自定义错误函数。所有的传播训练器都支持这一点(即 rprop、backrpop、quick 和 scg)。这定义了如何在每个单独的输出神经元上计算误差,不要与整体误差计算混淆,即神经网络与整个训练集的拟合程度。

您可以使用 Propagation.ErrorFunction 属性来定义新的误差函数。所有的传播训练器都从 Propagation 扩展而来。您的新类应该实现 IErrorFunction 接口。默认使用线性误差函数,简单实现如下:

    /// <inheritdoc/>
    public void CalculateError(IMLData ideal, double[] actual, double[] error)
    {
        for (int i = 0; i < actual.Length; i++)
        {
            error[i] = ideal[i] - actual[i];
        }

    }

这只是预期减去实际。你可以用任何你喜欢的方式定义这个错误,梯度将被用来最小化这个值。

【讨论】:

    猜你喜欢
    • 2017-11-06
    • 1970-01-01
    • 2011-10-31
    • 2014-04-20
    • 2019-05-17
    • 2019-01-01
    • 1970-01-01
    • 2015-05-01
    • 1970-01-01
    相关资源
    最近更新 更多