您好,我正在使用 DL 模型 (TensorFlow) 来预测目标数据集的每日最小值、平均值和最大值。我在想该模型每天会有 3 个输出(最小值、平均值、最大值)。
有没有一种干净的方法来强制执行这些的正确顺序(即 min<mean<max)?我可以添加一个惩罚来鼓励模型以这种方式训练,但这似乎是一种变通方法。
您好,我正在使用 DL 模型 (TensorFlow) 来预测目标数据集的每日最小值、平均值和最大值。我在想该模型每天会有 3 个输出(最小值、平均值、最大值)。
有没有一种干净的方法来强制执行这些的正确顺序(即 min<mean<max)?我可以添加一个惩罚来鼓励模型以这种方式训练,但这似乎是一种变通方法。
两种技术:惩罚和变量变换。
用这三个输出建立一个模型,然后在估计过程中修改/自定义损失函数,增加违反假设的惩罚。这不会保证不平等,但会使它们非常不可能。
您可以简单地添加在哪里是一个超参数,反映您想要执行条件的程度,并且你是最小、平均和最大输出吗?我在这里使用 ReLU 函数,但您可以使用任何严格的正函数。
我在类似的情况下使用这种技术。事情是这样的。创建新变量:
这可能看起来像是一种更好的技术,但它也有其自身的问题。主要的一个是对数拟合可以产生非常狂野的预测。这是您不应该转换平均值本身的原因之一,只有最小值和最大值被转换为与平均值的距离。这样至少我们可以得到合理的平均预测,也许还有疯狂的最小值和最大值,无论如何这预计会很糟糕。
要注意的另一件事是,通常平均预测的方差应该低于最小值和最大值。因此,您可以在损失函数中进行一些调整,以允许 min 和 max 的预测误差大于平均值。
正式检查优化问题的KKT 条件可能是不可行的,但是您仍然可以尝试对不等式约束进行编码,就好像条件成立一样。然后是检查训练在实践中是否表现良好的问题。
如果您不熟悉以 KKT 所述的方式将约束编码为目标函数,请参阅拉格朗日乘数以获取具有等式约束的第一个示例。然后我建议您以类似的方式查看编码不等式约束(参见示例)。
一旦掌握了数学表达式,就需要在 Tensorflow 中实现它。tf.keras.losses.Loss您可以通过从基类继承来构建自己的损失函数类。
正如上面与@Galen 的讨论所述:
猜想这可以通过自定义循环层来实现。我们可以提供一个箱线图值作为输出,即五位数汇总作为单调输出。虽然,循环层的内部是一种设计选择,请参阅在 Keras 中定义自定义 LSTM 单元?. 在这里,LSTM 单元的输出将是我们的单调汇总函数。这种方法保证了不平等。
我建议您最好研究分位数回归。参见例如 https://towardsdatascience.com/deep-quantile-regression-in-tensorflow-1dbc792fe597。
我相信你想要的是预测你的分布的平均值和极限。在每个 x 值。使用最小值和最大值作为目标不会给你你想要的。相反,您将在每个输入处获得最小值/最大值的预期值(这是 MSE 产生的)。例如输入是 x
| ID | X | y_mean | y_max |
|---|---|---|---|
| 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 3 |
| 3 | 1 | 1 | 5 |
那么对于输入 x=1 的 y_max 的预测将是 3,而不是 5。
相反,如果您预测分位数,您将获得例如 10 个百分位数、50 个百分位数和 90 个百分位数的分布。
(另一种更简单的方法是继续使用 mse,但预测均值和平方误差。这给了你方差,你可以例如估计百分位数进行正态近似)