2

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

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 中的神经网络结构是固定的,所以仅仅扩展参数向量并重写误差函数和梯度公式并不是那么简单。

4

1 回答 1

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];
        }

    }

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

于 2014-08-23T21:53:30.033 回答