这是我为情感设计的RNN网络。

class rnn(nn.Module):
    def __init__(self, input_size, hidden_size, output_size):
        super().__init__()
        self.hidden_size = hidden_size
        self.i2h = nn.Linear(input_size, hidden_size)
        self.h2o = nn.Linear(hidden_size, output_size)
        self.h2h = nn.Linear(hidden_size , hidden_size)
        self.relu = nn.Tanh()
        self.sigmoid = nn.LogSigmoid()

    def forward(self, input, hidden):
        hidden_new = self.relu(self.i2h(input)+self.h2h(hidden))
        output = self.h2o(hidden)
        output = self.sigmoid(output)
        return output, hidden_new

    def init_hidden(self):
        return Variable(torch.zeros(1, self.hidden_size))


然后,我创建并训练网络为:

RNN = rnn(50, 50, 1)
learning_rate = 0.0005
criteria = nn.MSELoss()
optimizer = optim.Adam(RNN.parameters(), lr=learning_rate)
hidden = RNN.init_hidden()
epochs = 2
for epoch in range(epochs):
    for i in range(len(train['Phrase'])):
        input = convert_to_vectors(train['Phrase'][i])
        for j in range(len(input)):
            temp_input = Variable(torch.FloatTensor(input[j]))
            output, hidden = RNN(temp_input, hidden)
        temp_output = torch.FloatTensor([np.float64(train['Sentiment'][i])/4])
        loss = criteria( output, Variable(temp_output))
        loss.backward(retain_graph = True)
        if (i%20 == 0):
            print('Current loss is ', loss)


问题在于网络的损失没有减少。它先增加,然后减少,依此类推。它根本不稳定。我尝试使用较小的学习率,但似乎无济于事。

为什么会发生这种情况,我该如何纠正?

最佳答案

您只需在执行optimizer.step()之后调用loss.backward()

顺便说一句,这说明了一个常见的误解:反向传播不是学习算法,它只是一种计算损耗w.t.t的梯度的很酷的方法。您的参数。然后,您可以使用Gradient Descent的某些变体(例如,在您的情况下为Adam,使用普通SGD,AdaGrad等)来更新给定梯度的权重。

关于python - 在训练pytorch RNN时损失不会减少,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49601263/

10-12 22:14