pytorch LSTM模型不学习

Posted

技术标签:

【中文标题】pytorch LSTM模型不学习【英文标题】:pytorch LSTM model not learning 【发布时间】:2021-01-06 14:32:03 【问题描述】:

我创建了一个简单的 LSTM 模型来预测优衣库的收盘价。问题是,我的模型似乎没有学到任何东西。这是我的notebook的链接

这是我的模型创建类(我之前试过relu激活函数,结果一样):

class lstm(torch.nn.Module):
  def __init__(self,hidden_layers):
    super(lstm,self).__init__()
    self.hidden_layers = hidden_layers
    self.lstm = torch.nn.LSTM(input_size = 2,hidden_size = 100,num_layers = self.hidden_layers,batch_first=True)
    self.hidden1 = torch.nn.Linear(100,80)
    self.dropout1 = torch.nn.Dropout(0.1)
    self.hidden2 = torch.nn.Linear(80,60)
    self.dropout2 = torch.nn.Dropout(0.1)
    self.output = torch.nn.Linear(60,1)

  def forward(self,x):
    batch = len(x)
    h = torch.randn(self.hidden_layers,batch,100).requires_grad_().cuda()
    c = torch.randn(self.hidden_layers,batch,100).requires_grad_().cuda()

    x,(ho,co)= self.lstm(x.view(batch,10,2),(h.detach(),c.detach()))
    x = torch.reshape(x[:,-1,:],(batch,-1))
    x = self.hidden1(x)
    x = torch.nn.functional.tanh(x)
    x = self.dropout1(x)
    x = self.hidden2(x)
    x = torch.nn.functional.tanh(x)
    x = self.dropout2(x)
    x = self.output(x)
    return x

model = lstm(10)

这是我的训练损失图: training loss

这是我的验证损失图: validation loss

这是我的基本事实(蓝色)与预测(橙色): ground truth vs prediction

谁能指出我做错了什么?

【问题讨论】:

【参考方案1】:

您使用整个数据训练缩放器。这不是一个好的策略。您应该只使用训练数据。

您不必缩放目标。直接使用或应用日志功能或使用返回。

关于隐藏状态和细胞记忆,你为什么要跟踪梯度并在之后分离它们?在馈送 lstm 层时,您不必分离隐藏状态和单元内存,因为它参与反向传播。

如果我理解您的操作,您可以使用最近 10 个开盘价和成交量来预测下一个收盘价。我不认为你可以通过这种配置获得好的结果。你应该更好地把问题形式化。

【讨论】:

感谢您的回复。是的,我正在尝试使用前 10 个值来预测下一个值。我尝试了你的建议,它仍然保持不变。为了回答您的问题,我使用“分离”来实现随时间截断的反向传播(我在 Kaggle 笔记本中看到了这一点)。即使我根据您的建议移除分离和缩放,它也不会改变结果。你发现我的模型有什么问题吗?该模型对我来说似乎还可以 配置方面,我之前试过用“open”、“high”、“low”来预测“close”价格,还是一样。无论我在推理过程中向模型提供什么,我都会得到与输出相同的值。 我认为开盘价、最高价、最低价和收盘价之间没有任何因果关系。因果关系是指任何基于特征推动收盘价的隐藏结构。使用这些功能将在大多数情况下为您提供代表一种移动平均线或只是移动收盘价的输出;因为存在相关(特征和目标)。您必须考虑的另一件事是,实际上您将 OHLC 价格放在一起。因此,您将这四个用作前 10 个值的特征并预测下一个接近值。 另外,尝试不同的历史长度(10、20、30、60 等)可能会获得更好的结果。 关于您的模型,可能它无法很好地学习任何东西,因为您有很多隐藏单元仅用于 2 个输入。尝试一些简单的东西,例如 lstm(8) -> fc(8) -> fc(1) .

以上是关于pytorch LSTM模型不学习的主要内容,如果未能解决你的问题,请参考以下文章

小白学习PyTorch教程十基于大型电影评论数据集训练第一个LSTM模型

基于pytorch的LSTM进行字符级文本生成实战

Pytorch LSTM 模型的损失没有减少

PyTorch搭建GNN-LSTM和LSTM-GNN模型实现多变量输入多变量输出时间序列预测

为啥损失减少但准确性也降低(Pytorch,LSTM)?

在Python中使用LSTM和PyTorch进行时间序列预测