Estou treinando uma rede neural usando i) SGD e ii) Adam Optimizer. Ao usar o SGD normal, recebo uma curva suave de perda de treinamento versus iteração , como visto abaixo (o vermelho). No entanto, quando usei o Adam Optimizer, a curva de perda de treinamento tem alguns picos. Qual é a explicação desses picos?
Detalhes do modelo:
14 nós de entrada -> 2 camadas ocultas (100 -> 40 unidades) -> 4 unidades de saída
Eu estou usando os parâmetros padrão para Adam beta_1 = 0.9
, beta_2 = 0.999
, epsilon = 1e-8
e batch_size = 32
.
neural-networks
deep-learning
adam
Abdul Fatir
fonte
fonte
Respostas:
Os picos são uma consequência inevitável da descida de gradiente de mini-lotes em Adam (
batch_size=32
). Alguns mini-lotes têm dados "azarados" para a otimização, induzindo os picos que você vê na sua função de custo usando o Adam. Se você tentar a descida estocástica do gradiente (o mesmo que usarbatch_size=1
), verá que há ainda mais picos na função de custo. O mesmo não ocorre no GD do lote (completo) porque ele usa todos os dados de treinamento (ou seja, o tamanho do lote é igual à cardinalidade do seu conjunto de treinamento) a cada época de otimização. Como em seu primeiro gráfico, o custo diminui monotonicamente sem problemas, parece que o título ( i) Com SGD ) está errado e você está usando a Descida de Gradiente de Lote (Completo) em vez de SGD.Em seu excelente curso de Deep Learning na Coursera , Andrew Ng explica em detalhes esse fato usando a imagem abaixo:
fonte
Passei um tempo insano depurando gradientes explosivos e comportamento semelhante. Sua resposta dependerá da função de perda, dados, arquitetura etc. Existem centenas de razões. Vou citar alguns.
log(0)
a previsões / discrepâncias ruins no conjunto de dados, causando gradientes explosivos. A maioria dos pacotes (tocha, fluxo tensor etc.) implementa o recorte por padrão para suas perdas.drop_last
. Tamanho pequeno do lote = alta variaçãoAgora, por que você vê isso com Adam e não com a SGD? Claramente, você alcançou uma perda menor com Adam. Como observado anteriormente, se 99,9% do conjunto de dados tiver ótimos em um ponto, exceto algumas observações, pode ser que a observação grite "NÃO" e salte dos mínimos locais quando selecionados aleatoriamente para um lote. Se você
dataset_size//batch_size+1
vir a cada passo, provavelmente é devido ao tamanho final do lote ser pequeno. Aposto que você também verá o pico da SGD se você permitir que ela atinja uma perda menor.Bônus: Sua diminuição muito rápida com o otimizador de momento (Adam) pode significar que alguma camada (camada de entrada? Camada de saída?) É inicializada fora da escala (para pesos grandes / pequenos).
fonte