我正在使用前馈网络开发预测应用程序。我遇到的问题是,我想预测的数据大多是趋势。因此,我正在努力开发的模型如下:
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中的神经网络结构是固定的,因此扩展参数向量并重写误差函数和梯度公式并不是那么简单。
答案 0 :(得分:1)
为此,我相信您需要在Encog中创建自定义错误功能。所有传播培训师都支持这一点(即rprop,backrpop,quick和scg)。这定义了如何计算每个输出神经元的误差,而不是与整体误差计算混淆,后者是神经网络与整个训练集的拟合程度。
您可以使用Propagation.ErrorFunction属性来定义新的错误函数。所有传播培训师都从传播延伸出来。您的新类应该实现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];
}
}
这只是预期减去实际。您可以按照自己喜欢的方式定义此错误,并使用渐变来最小化此值。