我正在尝试理解LSTM和LSTM的反向传播。我有一个简单的架构。
def __init__(self, input_dim=100, hidden_dim=100, output_dim=216, num_layers=2):
super(LSTMGenerator, self).__init__()
self.input_dim = input_dim
self.hidden_dim = hidden_dim
self.output_dim = output_dim
self.num_layers = num_layers
self.layer1 = nn.LSTM(self.input_dim, self.hidden_dim, self.num_layers, bidirectional=False, dropout=0.5)
self.out = nn.Linear(self.hidden_dim, self.output_dim)
我使用的是pytorch register_backward_hook函数。我正试图修改后向传球中的坡度。我应该使用grad_input还是grad_output?哪个渐变用于更新以前的权重?
我打印出了渐变形状。grad_input和grad_output中的值是什么意思?
length of grad input 3
grad input 0 shape torch.Size([216])
grad input 1 shape torch.Size([128, 100])
grad input 2 shape torch.Size([100, 216])
length of grad output 1
grad ouput 0 shape torch.Size([128, 216])
如有任何帮助,我们将不胜感激。
Grad_in:模型输出与层输出的梯度
Grad_out:Grad_in*(层输出与层输入的梯度(
(wrt=关于(
因为向后传球从后面一直到开始,所以它是参数与向前传球相比,顺序应该颠倒。因此为了更清楚,我将在下面使用不同的命名约定。对于前向通过,层2的前一层是层1;对于向后传球,层2的前一层是层3。