【问题标题】:LSTM for predicting characters: cell state and hidden state in the training loop用于预测字符的 LSTM:训练循环中的单元状态和隐藏状态
【发布时间】:2020-12-28 14:22:33
【问题描述】:

我的目标是建立一个预测下一个字符的模型。 我已经建立了一个模型,这是我的训练循环:

model = Model(input_size = 30,hidden_size = 256,output_size = len(dataset.vocab))

EPOCH = 10
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)
init_states = None

for epoch in range(EPOCH):
    loss_overall = 0.0
    
    for i, (inputs,targets) in enumerate(dataloader):
        optimizer.zero_grad()
        
        pred = model.forward(inputs) 
        loss = criterion(pred, targets)
        loss.backward()
        optimizer.step() 

如您所见,我只返回模型的预测,而不是 cell_statehidden_state。 所以替代方案是:pred,cell_state,hidden_state = model.forward(inputs)

我的问题是:我应该为角色预测任务做这件事吗?为什么/为什么不? 总的来说:我应该什么时候返回隐藏状态和单元状态?

【问题讨论】:

    标签: pytorch lstm recurrent-neural-network


    【解决方案1】:

    要了解隐藏状态,这是@nnnmmm 来自this other StackOverflow post 的出色图表。

    隐藏状态是(h_n, c_n),即最后一个时间步的隐藏状态。请注意,您如何无法访问时间步长 < t 和所有隐藏层的先前状态。如果您需要访问由多个隐藏层组成的更大 RNN 的隐藏状态,则检索那些 final 隐藏状态将很有用。但是,通常您只需使用单个 nn.LSTM 模块并将其 num_layers 设置为所需的值。

    您不需要使用隐藏状态。如果您想从 PyTorch 论坛了解更多关于 this thread 的信息。


    回到你的另一个问题,我们以这个模型为例

    rnn = nn.LSTM(input_size=10, hidden_size=256, num_layers=2, batch_first=True)
    

    这意味着输入序列具有seq_length 大小为input_size 的元素。考虑到第一个维度上的批次,它的形状原来是(batch, seq_len, input_size)

    out, (h, c) = rnn(x)
    

    如果您正在寻找构建字符预测模型,我看到了两个选项。

    • 您可以在每个时间步评估损失。考虑一个输入序列x,它是目标y,RNN 输出out。这意味着对于每个时间步 t,您将计算 loss(out[t], y[t])`。并且此输入序列的总损失将在所有时间步上进行平均。

    • 否则只考虑最后一个时间步的预测并计算损失:loss(out[-1], y) 其中y 是仅包含序列的seq_length+1-th 字符的目标。 p>

    如果您使用nn.CrossEntropyLoss,这两种方法都只需要一个函数调用,如您的last thread 中所述。

    【讨论】:

      猜你喜欢
      • 2019-12-28
      • 2017-06-07
      • 2021-03-05
      • 2018-09-21
      • 1970-01-01
      • 2019-04-10
      • 2021-04-14
      • 2019-03-15
      • 1970-01-01
      相关资源
      最近更新 更多