您所拥有的评估方案的最大问题 - “成功”意味着在公差范围内,“失败”意味着超出公差,加上您对模型输出的约束需要在每个时间步发生变化 - 是很难提取梯度以便训练直接预测模型。这排除了许多简单直接的回归模型,至少如果您想使用“在公差范围内最大化分数”作为您的目标函数。如果按原样考虑,对顺序预测和允许重试的约束也是不可微的。
我认为您有两个顶级选择:
1、软化损失函数,增加硬函数作为度量
当预测准确且满足约束时,使用具有最佳分数的可微损失函数。例如,您对单个预测值的损失函数可能是
L(x^n,x^n+1,xn+1)=(x^n+1−xn+1)2+a1+es(|x^n−x^n+1|−ϵ)
第二个约束部分本质上是 sigmoida以预测的准确性控制满足约束的相对权重和s控制约束周围的截止陡度。
一种。预测损失和约束损失之间的权重将是模型的超参数。所以你需要包括a和s如果您使用了我建议的损失函数,请在要搜索的参数中。
湾。您可以使用评分系统,而不是作为目标函数,而是作为在超参数搜索中选择最佳模型的指标。
C。通过这种方法,您可以使用许多标准序列学习模型,例如 LSTM(如果您有足够的数据)。或者,您可以只使用一个单步预测模型,将当前预测以及允许知道的序列的任何其他特征提供给它,并通过重复调用它来从中生成序列。
这个系统应该鼓励更接近真实价值的重试。
2. 直接使用你的评分系统作为学习目标
这将需要一些替代优化框架来围绕预测模型进行梯度下降(尽管一些框架可以在内部生成梯度)。遗传算法或其他优化器可用于管理模型的参数,并可以尝试更改模型参数以改善结果。
对于第二种情况,假设您有充分的理由想要完全避免构建可微分损失函数,那么这个问题可以被定义为强化学习(RL):
状态:当前序列项预测(或空条目),以及任何已知信息,例如容差、序列长度、当前序列项值(可能与当前预测不同)ϵ,d,μ或者σ可以是当前状态的一部分。
动作是选择下一个序列值预测,或者可能更有用的是,选择下一个序列项值的偏移量。使用偏移量可以让您轻松添加最小约束ϵ
如果在容忍范围内,奖励为 +1,否则为 0。
时间步长与当前序列中的时间步长相匹配。
您可以使用它来构建 RL 环境并训练将在其中包含您的预测/生成器模型的代理。RL 中有很多选项可以用来管理它。但是 RL 在这里给你的是一种使用不可微奖励正式定义目标的方法,而在内部,模型仍然可以使用基于梯度的方法进行训练。
此处不使用 RL 的主要原因是,是否必须在生成序列的最后评估预测模型。在这种情况下,“动作”也可能是整个序列,并且变得更难以优化。从这个问题是否是这种情况,我并不是 100% 清楚。
警告:RL 是一个庞大而复杂的研究领域。如果您至少还没有了解一些 RL,那么您可能会花费数周时间来掌握它,然后再开始在您的原始问题上取得进展。
RL 的替代方案同样适用,例如NEAT - 决定哪个可能是最好的涉及对项目的更多了解(例如您希望预测的序列的复杂性)和实际方面,例如您有多少时间致力于学习、测试和实施新技术。
你忘记了什么吗?
如果您允许无限重试,那么一个明显的策略是生成一个非常大的序列,使用不同的步长上下移动(都大于ϵ)。这不需要任何学习模型,只需一点智能编码即可最终覆盖所有整数。在大多数语言中,这种模型很可能只是几行代码。
如果要排除这种情况,则需要其他一些规则或约束: