Eu uso a rede LSTM em Keras. Durante o treinamento, a perda varia muito, e eu não entendo por que isso aconteceria.
Aqui está o NN que eu estava usando inicialmente:
E aqui estão a perda e a precisão durante o treinamento:
(Observe que a precisão chega a 100% eventualmente, mas são necessárias cerca de 800 épocas.)
Eu pensei que essas flutuações ocorrem por causa das camadas / alterações do Dropout na taxa de aprendizado (usei rmsprop / adam), então criei um modelo mais simples:
Eu também usei SGD sem impulso e decadência. Eu tentei valores diferentes para, lr
mas ainda obtive o mesmo resultado.
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
Mas eu ainda tinha o mesmo problema: a perda flutuava em vez de apenas diminuir. Eu sempre pensei que a perda deveria diminuir gradualmente, mas aqui não parece se comportar assim.
Assim:
É normal que a perda flutue assim durante o treinamento? E por que isso aconteceria?
Caso contrário, por que isso aconteceria no modelo LSTM simples com o
lr
parâmetro definido com algum valor realmente pequeno?
Obrigado. Observe que verifiquei perguntas semelhantes aqui, mas isso não me ajudou a resolver meu problema.
Atualização: perda para mais de 1000 épocas (sem camada BatchNormalization, o modificador RmsProp de Keras):
Upd. 2: Para o gráfico final:
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
history = model.fit(train_x, train_y, epochs = 1500)
Dados: sequências de valores da corrente (dos sensores de um robô).
Variáveis alvo: a superfície na qual o robô está operando (como um vetor quente, 6 categorias diferentes).
Pré-processando:
- alterou a frequência de amostragem para que as seqüências não sejam muito longas (o LSTM não parece aprender de outra forma);
- recorte as seqüências nas seqüências menores (o mesmo comprimento para todas as seqüências menores: 100 timesteps cada);
- verifique se cada uma das 6 classes tem aproximadamente o mesmo número de exemplos no conjunto de treinamento.
Sem preenchimento.
Forma do conjunto de treinamento (# sequências, #timesteps em uma sequência, #features):
(98, 100, 1)
Forma dos rótulos correspondentes (como um vetor quente para 6 categorias):
(98, 6)
Camadas:
O restante dos parâmetros (taxa de aprendizado, tamanho do lote) são os mesmos que os padrões do Keras:
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
batch_size: Inteiro ou Nenhum. Número de amostras por atualização de gradiente. Se não especificado, o padrão será 32.
Upd. 3:
A perda para batch_size=4
:
Para batch_size=2
o LSTM, parece não ter aprendido adequadamente (a perda varia em torno do mesmo valor e não diminui).
Upd. 4: Para verificar se o problema não é apenas um bug no código: Fiz um exemplo artificial (2 classes que não são difíceis de classificar: cos vs arccos). Perda e precisão durante o treinamento para estes exemplos: