带有自定义误差函数的神经网络

本文关键字:神经网络 函数 误差 自定义 | 更新日期: 2023-09-27 18:16:31

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

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中创建一个自定义错误函数。所有的传播训练器都支持这一点(即rprop, backrpop, quick和scg)。这定义了如何在每个单独的输出神经元上计算误差,不要与总体误差计算混淆,总体误差计算是指神经网络与整个训练集的拟合程度。

可以使用Propagation。属性定义一个新的错误函数。所有的传播训练器都从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];
        }
    }

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