我正在构建一个用于股票价格预测的 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)有用吗?
如果你想学习
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
参数。