gpt4 book ai didi

c# - 具有自定义误差函数的神经网络

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:40 25 4
gpt4 key购买 nike

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

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.ErrorFunction 属性来定义新的误差函数。所有的传播训练器都从传播扩展而来。您的新类应该实现 IErrorFunction 接口(interface)。默认情况下使用线性误差函数,其实现简单如下:

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

}

这只是预期减去实际。您可以按照自己喜欢的任何方式定义此错误,并且将使用渐变来最小化此值。

关于c# - 具有自定义误差函数的神经网络,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25136342/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com