获取在 OpenNMT-py 中训练的模型的梯度
Getting the gradients of a model trained in OpenNMT-py
使用 OpenNMT-py 训练模型时,我们得到一个字典作为输出,其中包含网络的权重和偏差。但是,这些张量 requires_grad = False,因此没有梯度。例如。对于一层,我们可能有以下张量,表示编码器和解码器中的嵌入以及权重和偏差。 None 其中有渐变属性。
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 和一些我没有找到的选项,还是有其他方法来获得这些张量的梯度?
梯度只能在调用 optim.step()
的训练循环内访问。如果您想将梯度(或梯度范数或其他)记录到 TensorBoard,您最好在调用优化器步骤之前获取它们。它发生在 Trainer
对象的 _gradient_accumulation
方法中。
请注意,有两个地方调用了 optim.step()
。具体用哪一个看你是每batch后更新还是多batch累加梯度再更新。
使用 OpenNMT-py 训练模型时,我们得到一个字典作为输出,其中包含网络的权重和偏差。但是,这些张量 requires_grad = False,因此没有梯度。例如。对于一层,我们可能有以下张量,表示编码器和解码器中的嵌入以及权重和偏差。 None 其中有渐变属性。
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 和一些我没有找到的选项,还是有其他方法来获得这些张量的梯度?
梯度只能在调用 optim.step()
的训练循环内访问。如果您想将梯度(或梯度范数或其他)记录到 TensorBoard,您最好在调用优化器步骤之前获取它们。它发生在 Trainer
对象的 _gradient_accumulation
方法中。
请注意,有两个地方调用了 optim.step()
。具体用哪一个看你是每batch后更新还是多batch累加梯度再更新。