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.
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.