Queda repentina de precisão ao treinar LSTM ou GRU em Keras

8

Minha rede neural recorrente (LSTM, resp. GRU) se comporta de uma maneira que não consigo explicar. O treinamento começa e treina bem (os resultados parecem muito bons) quando a precisão cai repentinamente (e a perda aumenta rapidamente) - métricas de treinamento e teste. Às vezes, a rede fica louca e retorna saídas aleatórias e às vezes (como no último dos três exemplos) começa a retornar a mesma saída para todas as entradas .

imagem

Você tem alguma explicação para esse comportamento ? Qualquer opinião é bem vinda. Por favor, veja a descrição da tarefa e as figuras abaixo.

A tarefa: De uma palavra, preveja seu vetor word2vec A entrada: Temos um modelo próprio word2vec (normalizado) e alimentamos a rede com uma palavra (letra por letra). Nós preenchemos as palavras (veja o exemplo abaixo). Exemplo: Temos uma palavra futebol e queremos prever seu vetor word2vec com 100 dimensões de largura. Então a entrada é $football$$$$$$$$$$.

Três exemplos do comportamento:

LSTM de camada única

model = Sequential([
    LSTM(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

imagem

GRU de camada única

model = Sequential([
    GRU(1024, input_shape=encoder.shape, return_sequences=False),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

imagem

Dupla camada LSTM

model = Sequential([
    LSTM(512, input_shape=encoder.shape, return_sequences=True),
    TimeDistributed(Dense(512, activation="sigmoid")),
    LSTM(512, return_sequences=False),
    Dense(256, activation="tanh"),
    Dense(w2v_size, activation="linear")
])

model.compile(optimizer='adam', loss="mse", metrics=["accuracy"])

imagem

Também experimentamos esse tipo de comportamento em outro projeto antes do qual utilizava arquitetura semelhante, mas seus objetivos e dados eram diferentes. Portanto, o motivo não deve estar oculto nos dados ou no objetivo específico, mas na arquitetura.

Marek
fonte
você descobriu o que estava causando o problema?
Antoine
Infelizmente não. Mudamos para uma arquitetura diferente e não tivemos a chance de voltar a isso. Temos algumas pistas, no entanto. Nosso palpite é que algo fez com que um ou mais parâmetros mudassem para nan.
Marek
nanparâmetro não resultaria em perda não nanométrica. Meu palpite é que seus gradientes explodem, coisa semelhante aconteceu comigo em redes normalizadas sem lote.
Lugi
Essa também é uma das coisas que tentamos examinar usando o TensorBoard, mas a explosão do gradiente nunca foi comprovada em nosso caso. A idéia era que nanaparecesse em um dos cálculos e, em seguida, assumisse outro valor que fazia a rede enlouquecer. Mas é apenas um palpite. Obrigado pela sua opinião.
Marek

Respostas:

2

Aqui está minha sugestão para identificar o problema:

1) Veja a curva de aprendizado do treinamento: Como está a curva de aprendizado no conjunto de trens? Aprende o conjunto de treinamento? Caso contrário, primeiro trabalhe nisso para garantir que você possa se encaixar demais no conjunto de treinamento.

2) Verifique seus dados para garantir que não haja NaN (treinamento, validação, teste)

3) Verifique os gradientes e os pesos para garantir que não haja NaN.

4) Diminua a taxa de aprendizado enquanto treina para garantir que não seja por causa de uma grande atualização repentina que ocorreu em um mínimo acentuado.

5) Para garantir que tudo esteja correto, verifique as previsões da sua rede para que a sua rede não faça previsões constantes ou repetitivas.

6) Verifique se seus dados em seu lote estão equilibrados em relação a todas as classes.

7) normalize seus dados para uma variação de unidade média zero. Inicialize os pesos da mesma forma. Ajudará o treinamento.

PickleRick
fonte