【问题标题】:Getting the gradients of a model trained in OpenNMT-py获取在 OpenNMT-py 中训练的模型的梯度
【发布时间】:2019-10-20 04:12:15
【问题描述】:

当使用 OpenNMT-py 训练模型时,我们会得到一个 dict 作为输出,其中包含网络的权重和偏差。但是,这些张量具有 requires_grad = False,因此没有梯度。例如。对于一层,我们可能有以下张量,表示编码器和解码器中的嵌入以及权重和偏差。它们都没有渐变属性。

encoder.embeddings.emb_luts.0.weight

decoder.embeddings.emb_luts.0.weight

encoder.rnn.weight_ih_l0

encoder.rnn.weight_hh_l0

encoder.rnn.bias_ih_l0

encoder.rnn.bias_hh_l0

decoder.rnn.layers.0.weight_ih

decoder.rnn.layers.0.weight_hh

decoder.rnn.layers.0.bias_ih

decoder.rnn.layers.0.bias_hh

OpenNMT-py 是否可以设置 requires_gradient = True 并带有一些我没有找到的选项,或者是否有其他方法可以获得这些张量的梯度?

【问题讨论】:

  • 渐变相对于什么?梯度仅针对特定的训练批次定义,因此在训练后被丢弃。此外,在训练期间,梯度在每一步之后都会归零。
  • 对于每个训练批次,是的。我想那时不会保留此信息。您是否有使用 OpenNMT-py 的经验以及该代码在哪里,例如,我会添加一个 tensorboardX 编写器来跟踪诸如渐变之类的东西?

标签: machine-learning deep-learning pytorch machine-translation opennmt


【解决方案1】:

梯度只能在训练循环内访问,其中调用了optim.step()。如果您想将梯度(或梯度范数或其他)记录到 TensorBoard,您最好在调用优化器步骤之前获取它们。它发生在Trainer 对象的_gradient_accumulation 方法中。

请注意,有两个地方调用了optim.step()。使用哪一个取决于您是在每批之后进行更新,还是从多个批中累积梯度并在之后进行更新。

【讨论】:

  • 非常感谢。很抱歉打扰您,但是您是否知道在代码中的 RNN 中查找隐藏状态的位置?
猜你喜欢
  • 2019-12-03
  • 1970-01-01
  • 2019-05-28
  • 2019-06-23
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
相关资源
最近更新 更多