Tensorflow - 简单的多层感知器无法稳定在正态分布 y 值的平均值附近

数据挖掘 神经网络 深度学习 喀拉斯 张量流 回归
2022-03-08 02:03:47

我正在建立一个外汇交易模型,我试图预测未来 5 分钟货币对的 +/- 运动。我已经有一些有希望的结果将模型调整为分类器(即,如果货币对预计增加超过某个阈值,则买入,如果预计货币对减少某个阈值,则卖出,否则不做任何事情),但是在尝试创建即使是最简单的多层感知器回归模型时,预测值的平均值也会围绕实际y值的平均值反弹(正如预期的那样,这非常接近于零)。

下面的两张图片描绘了在多个时期已经完成之后的两个不同时期之后的train预测(绿色)与实际值(蓝色)。预测均值y_train不是以某种稳定的方式向真实均值移动,而是直接越过它,并且似乎会在更多的时期内一遍又一遍地这样做。y

在此处输入图像描述

在此处输入图像描述

到目前为止,我已经尝试过:

  1. 使用较小的学习率
  2. 添加更多的时代。训练集中有近 300k 个项目,因此分类模型只能在大约 5 个 epoch 内学习,但将其增加到 50 或 100 以进行回归似乎仍然没有帮助。
  3. 将损失函数从 更改mean squared errormean absolute error
  4. 将优化器从Adam其他选项更改为 RMSProp(最终将为所有项目预测相同的值)、Adagrad、Adadelta、Nadam 等。
  5. 使用eluorleaky relu代替relu. 1此外,如果我在训练之前不添加y值,模型最终会在几个 epoch 之后为每个项目预测相同的值,这可能是同一问题的扩展。
  6. 输出节点上的偏差约束以使其接近零(真实y均值)。最终,这并不重要,模型仍然远离零。
  7. 批量标准化

即使是这样一个非常简单的模型也会发生这种情况:

self.model = models.Sequential()
self.model.add(layers.Dense(self.num_layers, activation="relu" input_shape=(self.x_train.shape[1],)))
self.model.add(layers.Dense(1))
self.model.compile(optimizer=self.optimizer, loss='mean_squared_error', metrics=["mae"])

关于如何稳定模型的任何建议?

2个回答

尝试更深的网络。像这样的东西。

self.model = models.Sequential()
self.model.add(layers.Dense(self.num_layers, activation="relu", input_shape=(self.x_train.shape[1],)))
self.model.add(layers.Dense(self.num_layers//2, activation="relu"))
self.model.add(layers.Dense(self.num_layers//4, activation="linear"))
self.model.add(layers.Dense(1))
self.model.compile(optimizer=self.optimizer, loss='mean_squared_error', metrics=["mae"])

您可能需要花费更多时间来识别问题,而不是寻找在文学作品中有效的技巧。所以从最简单的架构开始,看看你的网络是如何以及在什么价值上融合的。很难知道所有细节,但这里有一些可能会有所帮助的建议。

  1. 您可以尝试不同的初始化以及随机重新初始化(随机重启)。
  2. 我也会先尝试线性激活,然后再尝试 tanh 或 relu/leaky relu。由于实际(y_train)分布在正负状态。我并不是说线性会或不会表现得更好,但它会帮助你理解一些机制并找出问题所在。
  3. 如果您选择更深入,我建议添加一个隐藏层,其尺寸大于输入数据的特征,并在最好是多个(1-2 个隐藏)层中收缩(1)一个维度。

最后,这是一个非常受欢迎的博客,用于遵循最佳实践。http://karpathy.github.io/2019/04/25/recipe/

此外,Noah Weber 的评论表格似乎很方便,对数比例会严重惩罚参数。