当数据集仅包含函数值时,使用标准 ML 模型对导数进行建模

数据挖掘 机器学习 时间序列 优化
2022-03-07 04:53:27

我想建模一个随时间变化的过程,X(t). 我有一个数据集,对应于函数值的粗略采样X在不同的时间点,t1,t2,.... 我有一个导数的分析派生模型dXdt=F(X(t),G(t))在(已知)函数中有几个可调参数FG. 我已经能够通过以下过程调整这些模型:

  1. 为函数选择一组参数FG.
  2. 从我的数据集中最早的时间到我的数据集中的结束点执行正向欧拉方法,生成X(t)对应于上面的参数FG.
  3. 用这个X(t),以及我的测量数据点以生成模型错误。
  4. 使用上述建模错误返回 (1),迭代并优化表达式中的参数dXdt以尽量减少错误。

请注意,在上面我必须处理函数本身而不是导数,因为我的测量数据位于比需要计算的导数更粗糙的时间网格上。例如,我的导数在一个规模上有意义地变化Δt,但我的数据集可能只有每个点5Δt10Δt. 由于时间尺度上的这种差异,我无法从数据集中获取函数值本身并自己创建导数。

现在这个过程工作得很好,我能够实现一个很好的错误。但是,我想知道是否有更好的方法来模拟导数dXdt比这个分析模型。例如,神经网络或回归树能否做得更好?

我的问题是,我将如何以计算有效的方式做到这一点?让我们以神经网络为例。在使用标准包训练 NN 时,我习惯于使用输入及其相关输出。但问题是,如果我想对导数进行建模,我没有将导数作为输出来训练。我只知道函数值,并且只能通过前向欧拉积分计算出一个误差以最小化。当然,我可以像处理上面的参数一样处理 NN 参数,并对它们进行蛮力最小化,但是这样做显然会损失很多反向传播的效率(或者,如果我这样做是有决定的树,将失去回归树通常如何优化的逻辑)。

我有更好的方法吗?是否存在处理此问题的方法?如果有人能指出我富有成效的方向,将不胜感激。

2个回答

这实际上很容易在任何具有自动微分能力的深度学习框架中实现。

你需要两个神经网络。一个近似于X,另一个来近似dX/dt.

  • 第一步很容易。您有输入和目标样本X. 只需按照正常流程训练您的网络学习X
  • 第二步是您没有直接的目标值(即梯度)。诀窍是你已经有了一个近似器X从第一步开始,因此使用它来获取第二个网络的目标。

我最熟悉的pytorch,所以我会用它作为例子。

import torch
from torch.nn import Sequential, Linear, ReLU
from torch.autograd import Variable
from torch.optim import Adam
import numpy as np

x = np.linspace(0, 10, 101).reshape(-1, 1)
y = np.sin(x) # Using sin as an example

x = Variable(torch.Tensor(x), requires_grad=True) 
y = Variable(torch.Tensor(y), requires_grad=False)

f = Sequential(....) # Build f approximator
f_optimizer = Adam(f.parameters())

for epoch in range(1000):
    loss= f(x) - y
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

# Build grad approximator
f_grad = Sequential(....) 

# need a new optimizer to train f_grad
f_optimizer = Adam(f_grad.parameters()) 

for epoch in range(1000):
    # Directly backprop from the output to the gradient of the f
    model(x).backward() 
    loss= f_grad(x) - x.grad # x.grad is the grad of f w.r.t x
    f_optimizer.zero_grad()
    loss.backward()
    f_optimizer.step()  

f_grad # this is the gradient function you are looking for

(我目前没有安装的机器pytorch,所以不要指望代码可以通过一些调试运行)

老实说,这听起来不像是机器学习问题。我可以想到两种方法:

  • 如果你有一个分析模型dX/dt, 你可以整合它t获得一个模型X. 然后找到最小化数据平方距离的参数(可能加上一些正则化)。网格搜索可能就足够了。
  • 使用插值函数的标准方法,例如样条插值这样做的好处是您可以获得平滑的封闭形式的解决方案。

还请记住,有限点集的导X(t1),X(t2),...,X(tn)不存在。有无数个函数通过所有点(并且几乎所有函数都是不可微的)。换句话说:您必须对您正在寻找的功能做出额外的假设。使用上述方法,您可以明确地做出这些假设,我认为这比将它们深埋在机器学习算法中要好。