Pytorch LSTM non si allena

Sep 22 2020

Quindi sto attualmente cercando di implementare un LSTM su Pytorch, ma per qualche motivo la perdita non sta diminuendo. Ecco la mia rete:

class MyNN(nn.Module):
    def __init__(self, input_size=3, seq_len=107, pred_len=68, hidden_size=50, num_layers=1, dropout=0.2):
        super().__init__()
        
        self.pred_len = pred_len
        
        self.rnn = nn.LSTM(
            input_size=input_size, 
            hidden_size=hidden_size, 
            num_layers=num_layers, 
            dropout=dropout, 
            bidirectional=True,
            batch_first=True
        )
        
        self.linear = nn.Linear(hidden_size*2, 5)
    
    def forward(self, X):
        lstm_output, (hidden_state, cell_state) = self.rnn(X)
        
        labels = self.linear(lstm_output[:, :self.pred_len, :])
        
        return lstm_output, labels

E il mio ciclo di allenamento

LEARNING_RATE = 1e-2


net = MyNN(num_layers=1, dropout=0)

compute_loss = nn.MSELoss()

optimizer = optim.Adam(net.parameters(), lr=LEARNING_RATE)


all_loss = []
for data in tqdm(list(train_loader)):
    X, y = data
    
    optimizer.zero_grad()

    lstm_output, output = net(X.float())
    
    # Computing the loss
    loss = compute_loss(y, output)
    all_loss.append(loss)
    loss.backward()
    
    optimizer.step()
    
# Plot
plt.plot(all_loss, marker=".")
plt.xlabel("Epoch")
plt.xlabel("Loss")
plt.show()

E questo è quello che ho ottenuto

Ho provato a cercare cosa diavolo sto facendo di sbagliato ma non ne ho idea. Inoltre, prima usavo un LSTM di keras e funzionava bene sul set di dati.

Qualsiasi aiuto? Grazie!

Risposte

1 YuseqYaseq Sep 22 2020 at 20:10

Guardi la perdita ad ogni lotto. Dovresti calcolare la media delle perdite su tutti i batch. Quando si osservano lotti diversi, la perdita può aumentare semplicemente perché un lotto è più difficile da prevedere rispetto all'altro. Ecco perché non è realmente interpretabile. Quindi inizia con quello. Se il problema persiste probabilmente sta esplodendo gradienti. In tal caso, abbassare il tasso di apprendimento a 1e-3o 1e-4o anche meno se continua.