如何使用PyTorch模型校准SDE参数?

问题描述 投票:0回答:1

我正在构建一个用于股票价格预测的 GRU 模型。我想将随机过程集成到模型中来模拟价格波动。

所以,这是生成随机路径的类。

class SDE(nn.Module):
def __init__(self,lam,sigma):
    super().__init__()
    self.lam = lam
    self.sigma = sigma

def forward(self, T, steps, Npaths):
    np.random.seed(4)
    lam = self.lam.detach().numpy()
    sigma= self.sigma.detach().numpy()
     .....
    return sigma * lam * xx

现在,我的模型是:

class MyModel(nn.Module):
def __init__(self, args):
    super(MyModel, self).__init__()
    self.lam = nn.Parameter(torch.tensor(1.0), requires_grad=True)
    self.sigma = nn.Parameter(torch.tensor(0.2), requires_grad=True)
    # GRU layers
    self.gru = nn.GRU(
        self.input_dim, self.hidden_dim, self.layer_dim, batch_first=True, 
                                            dropout=args.dropout, bidirectional=True)

    # SDE 
     levy = SDE(self.lam, self.sigma) 
    # Fully connected layer
    self.fc = nn.Linear(self.hidden_dim * 2, self.output_dim)

def forward(self, x):
        lev = torch.from_numpy(levy(1.0, 16, 1))
        .....
        h0 = torch.zeros(self.args['num_layers']* 2, x.size(0), self.args['n_hidden_units'], 
                                                                                 device=x.device).requires_grad_()
        out, _ = self.gru(x, h0.detach())
        out = out[:, -1, :]
        out = self.fc(out)
        out_m = torch.mul(out, lev)
        return out

火车会是这样的:

    # Makes predictions
      yhat = self.model(x)
      # Computes loss
      loss = self.loss_fn(y, yhat)
      # Computes gradients
      #loss.requires_grad = True
      loss.backward()
      # Updates parameters and zeroes gradients
      self.optimizer.step()
      self.optimizer.zero_grad()

通过训练该网络,该代码是否应该校准并确定用于在 SDE 中生成随机路径的 sigma 和 lam 参数的最佳值?

我从调试中可以看到它们的值始终相同。

有什么建议可以使此代码对我的目标(即校准 sigma 和 lam)有用吗?

python pytorch stochastic-process pytorch-forecasting
1个回答
0
投票

如果你想学习

lam
sigma
,你需要将它们实现为 pytorch
Parameters
并使用 pytorch 方法计算
lam
sigma
的结果。当您对值调用
.detach().numpy()
时,您将它们从计算图中删除,这意味着 pytorch 无法通过反向传播更新它们。

在您的代码中,您将

lam
sigma
定义为
Parameters
类中的
MyModel
,所以保留它。对于
SDE
元素,您可以用函数替换该类(
SDE
类仅保存已存储在
MyModel
中的变量)。未显示
SDE
前向方法,但您需要使用 pytorch 方法而不是 numpy 来实现该方法。

您还应该考虑您希望通过

SDE
方法实现什么目标。看起来
SDE
会根据
lam
sigma
生成一系列值,用于缩放 GRU 的输出。您的模型可能会认为,通过将参数设置为
SDE
或其他无信息的参数,可以更轻松地避免使用
lam=1, sigma=0
参数。

© www.soinside.com 2019 - 2024. All rights reserved.