Explicação de Spikes na perda de treinamento vs. iterações com o Adam Optimizer

16

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-8e batch_size = 32.

i) Com SGD ii) Com AdamCom SGD Com Adam

Abdul Fatir
fonte
Para aviso futuro, diminuindo sua taxa inicial de aprendizagem pode ajudar a eliminar picos de Adam
negrito

Respostas:

12

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 usar batch_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:

Funções de custo

xboard
fonte
2
'SGD ... usa todos os dados de treinamento' - você tem certeza disso? Isso significa que os pesos são atualizados depois que todos os dados são enviados adiante, mas isso é chamado de lote inteiro gd, não sgd. Estocástico implica minibatch
Alex
Obrigado @Alex por apontar meu erro, eu já o corrigi e melhorei a resposta com referência para obter mais informações.
xboard 21/09
@ xboard - Não, estou usando a descida gradiente de mini-lote para o primeiro.
Abdul Fatir
7

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.

  • Dependente de perda. As perdas de probabilidade de log precisam ser cortadas; caso contrário, elas podem ser avaliadas próximas 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.
  • Outliers no conjunto de dados.
  • ϵy=(x-você)/(s+ϵ)sϵy
  • O lote final em uma época pode ser pequeno se o conjunto de dados não puder ser dividido pelo tamanho do lote. No carregador de dados da tocha, há uma bandeira drop_last. Tamanho pequeno do lote = alta variação

Agora, 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+1vir 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).

ragulpr
fonte