Boa pergunta.
Eu me deparei com esse fenômeno várias vezes. Aqui estão minhas observações:
Gradiente explodir
Motivo: grandes gradientes desviam o processo de aprendizagem do caminho.
O que você deve esperar: Olhando o log de tempo de execução, você deve olhar os valores de perda por iteração. Você notará que a perda começa a crescer significativamente de iteração para iteração, eventualmente a perda será muito grande para ser representada por uma variável de ponto flutuante e se tornará nan
.
O que você pode fazer: Diminua o base_lr
(no solver.prototxt) em uma ordem de magnitude (pelo menos). Se você tiver várias camadas de perda, deve inspecionar o log para ver qual camada é responsável pela explosão do gradiente e diminuir loss_weight
(em train_val.prototxt) para essa camada específica, em vez da geral base_lr
.
Política de taxa de aprendizagem e parâmetros ruins
Motivo: o caffe falha ao calcular uma taxa de aprendizado válida e obtém 'inf'
ou 'nan'
, em vez disso, essa taxa inválida multiplica todas as atualizações e, portanto, invalidando todos os parâmetros.
O que você deve esperar: olhando para o log do tempo de execução, você deve ver que a própria taxa de aprendizagem se torna 'nan'
, por exemplo:
... sgd_solver.cpp:106] Iteration 0, lr = -nan
O que você pode fazer: corrigir todos os parâmetros que afetam a taxa de aprendizagem em seu 'solver.prototxt'
arquivo.
Por exemplo, se você usar lr_policy: "poly"
e esquecer de definir o max_iter
parâmetro, você acabará com lr = nan
...
Para obter mais informações sobre a taxa de aprendizado no caffe, consulte este tópico .
Função de perda defeituosa
Motivo: às vezes, os cálculos da perda nas camadas de perda fazem com que nan
s apareça. Por exemplo, InfogainLoss
camada de alimentação com valores não normalizados , usando camada de perda personalizada com bugs, etc.
O que você deve esperar: ao examinar o log de tempo de execução, você provavelmente não notará nada de incomum: a perda está diminuindo gradualmente e, de repente, um a nan
aparece.
O que você pode fazer: veja se consegue reproduzir o erro, adicione impressão à camada de perda e depure o erro.
Por exemplo: Uma vez eu usei uma perda que normalizou a penalidade pela frequência de ocorrência do rótulo em um lote. Acontece que, se um dos rótulos de treinamento não aparecesse no lote - a perda calculada produzia nan
s. Nesse caso, trabalhar com lotes grandes o suficiente (no que diz respeito ao número de etiquetas do conjunto) foi o suficiente para evitar esse erro.
Entrada defeituosa
Motivo: você tem uma contribuição nan
nisso!
O que você deve esperar: assim que o processo de aprendizagem "atinge" essa entrada - a saída falha nan
. Olhando para o log de tempo de execução, você provavelmente não notará nada incomum: a perda está diminuindo gradualmente e, de repente, um a nan
aparece.
O que você pode fazer: reconstruir seus conjuntos de dados de entrada (lmdb / leveldn / hdf5 ...) certifique-se de não ter arquivos de imagem ruins em seu conjunto de treinamento / validação. Para depuração, você pode construir uma rede simples que lê a camada de entrada, tem uma perda simulada em cima dela e percorre todas as entradas: se uma delas estiver com defeito, essa rede falsa também deve produzir nan
.
passo maior que o tamanho do kernel na "Pooling"
camada
Por alguma razão, escolher stride
> kernel_size
para agrupar pode resultar em nan
s. Por exemplo:
layer {
name: "faulty_pooling"
type: "Pooling"
bottom: "x"
top: "y"
pooling_param {
pool: AVE
stride: 5
kernel: 3
}
}
resultados com nan
s em y
.
Instabilidades em "BatchNorm"
Foi relatado que, em algumas configurações, a "BatchNorm"
camada pode gerar nan
s devido a instabilidades numéricas.
Este problema foi levantado em bvlc / caffe e PR # 5136 está tentando corrigi-lo.
Recentemente, tornou-se ciente de debug_info
bandeira: Ajuste debug_info: true
em 'solver.prototxt'
vai fazer print caffe para registrar mais informações de depuração (incluindo magnitudes de gradiente e valores de ativação) durante o treino: Esta informação pode ajudar na identificação blowups gradiente e outros problemas no processo de formação .