我想实现一个简单的前馈神经网络来近似函数 y = f(x)= ax ^ 2 其中 a 是常量, x 是输入值。
NN有一个输入节点,一个隐藏层有1-n个节点,一个输出节点。例如,我输入值2.0 - > NN产生4.0,我再次输入3.0 - > NN产生9.0或接近它,依此类推。
如果我理解“在线培训”,则逐个提供训练数据 - 意味着我输入值2.0 - >我用渐变100次迭代,然后我传递值3.0,然后我再迭代100次。
然而,当我尝试用我的实验/学习NN做这个 - 我输入值2.0 - >错误变得非常小 - >输出非常接近4.0。
现在,如果我想预测输入3.0 - > NN产生4.36或者其他东西而不是9.0。所以NN只是学习了最后的训练值。
如何使用在线培训获得近似于范围[-d,d]所需函数的神经网络?我错过了什么?
我喜欢在线培训的原因是我最终想输入一个时间序列 - 并将该系列映射到所需的功能。这是除了这一点,但万一有人在想。
任何建议都将不胜感激。
更多信息 - 我使用Sigmoid函数激活隐藏层,使用线性函数激活输出层。
答案 0 :(得分:1)
我喜欢在线培训的原因是我最终想输入一个时间序列 - 并将该系列映射到所需的功能。
Recurrent Neural Networks(RNNs)是建模时间序列的最先进技术。这是因为它们可以获取任意长度的输入,并且它们还可以使用内部状态来模拟系列随时间变化的行为。
训练时间序列的前馈神经网络是一种旧方法,通常不会表现得很好。它们需要固定大小的输入,因此您必须选择固定大小的滑动时间窗口,并且它们也不会保留状态,因此很难学习时变功能。
我几乎找不到关于"在线培训"具有随机梯度下降的前馈神经网络模拟非平稳行为,除了几个非常模糊的参考。我不认为这会带来任何好处,除了允许您在获得一个数据流时实时训练。我认为它实际上不会帮助你模拟与时间相关的行为。
我在文献中可以找到的关于神经网络在线学习的大多数旧方法使用神经网络的混合方法和其他一些可以帮助捕获时间依赖性的方法。同样,这些都应该不如RNN,更不用说在实践中更难实施了。
此外,我认为您没有正确实施在线培训。它应该是随机梯度下降,小批量大小为1.因此,每个训练时期的每个训练样例只运行一次梯度下降迭代。由于在继续下一个训练示例之前运行了100次迭代,因此相对于该单个示例,您在误差梯度上走得太远,导致严重过度拟合到单个数据点。这就是为什么你在下一个输入上得到糟糕的结果。我不认为这是一种合理的培训方法,我认为它也不适用于时间序列。
你还没有提到你的激活或你的损失功能,所以我不能评论这些是否适合这项任务。
另外,我不认为学习y=ax^2
是时间序列预测的一个很好的类比。这是一个静态函数,无论输入的索引或先前输入的值如何,它总是为给定的输入提供相同的输出。