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 .
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"])
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"])
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"])
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.
fonte
nan
.nan
parâ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.nan
aparecesse 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.Respostas:
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.
fonte