Otimizador Adam com decaimento exponencial

53

Na maioria dos códigos de fluxo de tensão, o Adam Optimizer é usado com uma taxa de aprendizado constante de 1e-4(ou seja, 0,0001). O código geralmente tem a seguinte aparência:

...build the model...
# Add the optimizer
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

Gostaria de saber se é útil usar decaimento exponencial ao usar o adam optimizer, ou seja, use o seguinte código:

...build the model...
# Add the optimizer
step = tf.Variable(0, trainable=False)
rate = tf.train.exponential_decay(0.15, step, 1, 0.9999)
optimizer = tf.train.AdamOptimizer(rate).minimize(cross_entropy, global_step=step)
# Add the ops to initialize variables.  These will include 
# the optimizer slots added by AdamOptimizer().
init_op = tf.initialize_all_variables()

# launch the graph in a session
sess = tf.Session()
# Actually intialize the variables
sess.run(init_op)
# now train your model
for ...:
  sess.run(train_op)

Geralmente, as pessoas usam algum tipo de redução da taxa de aprendizado, para Adam parece incomum. Existe alguma razão teórica para isso? Pode ser útil combinar o Adam otimizer com a deterioração?

MarvMind
fonte
Como você atualiza a etapa Variável a cada iteração?
Perrohunter
@perrohunter: use o global_stepparâmetro de minimize. Veja editar.
Charles Staats
9
Nota: 1e-4= 0.0001, não 0.0004.
Cliff AB
Vejo que você atribui "global_step = step", mas não vejo como a variável "step" está sendo atualizada ... você pode esclarecer, por favor?
Diego
@ Diego: resposta tardia, mas: passar a variável step para minimizar, pois é o parâmetro global_step, faz com que a função minimize aumente o parâmetro global_step cada vez que o minim é chamado. Consulte a documentação para minimizar. Observe que isso significa que, ao realizar mini-lotes, a variável step é atualizada para cada mini-lote, não apenas para cada época.
Dimpol 30/03/19

Respostas:

37

Empiricamente falando: experimente definitivamente, você pode encontrar algumas heurísticas de treinamento muito úteis; nesse caso, compartilhe!

Geralmente, as pessoas usam algum tipo de deterioração, para Adam parece incomum. Existe alguma razão teórica para isso? Pode ser útil combinar o Adam otimizer com a deterioração?

Não vi o código de pessoas suficientes usando o otimizador do ADAM para dizer se isso é verdade ou não. Se for verdade, talvez seja porque o ADAM é relativamente novo e as "melhores práticas" de decaimento da taxa de aprendizado ainda não foram estabelecidas.

αt=α/t

Simplificando: acho que nada na teoria desencoraja o uso de regras de decaimento da taxa de aprendizado com o ADAM. Vi pessoas relatando bons resultados usando o ADAM e encontrar algumas boas heurísticas de treinamento seria incrivelmente valioso.

Indie AI
fonte
12

A razão pela qual a maioria das pessoas não usa o decaimento da taxa de aprendizado com Adam é que o próprio algoritmo faz um decaimento da taxa de aprendizado da seguinte maneira:

t <- t + 1
lr_t <- learning_rate * sqrt(1 - beta2^t) / (1 - beta1^t)

onde t0é o passo inicial e lr_ta nova taxa de aprendizado usada.

Almanzt
fonte
4
Não tenho certeza se é esse o caso. O fator sqrt(1 - beta2^t) / (1 - beta1^t)não decai. Parece compensar a inicialização das estimativas do primeiro e do segundo momento.
Thijs
25
Esta resposta está incorreta. Esse fator se aproxima de 1,0 quando t vai para o infinito. Nota lateral: learning_rate aqui é corrigido . Não é a taxa de aprendizado no momento t-1.
Rd11
8

Adam usa a taxa de aprendizado inicial, ou o tamanho da etapa, de acordo com a terminologia do artigo original, enquanto calcula atualizações de forma adaptativa. O tamanho da etapa também fornece um limite aproximado para atualizações. Nesse sentido, acho uma boa idéia reduzir o tamanho da etapa no final do treinamento. Isso também é suportado por um trabalho recente do NIPS 2017: O valor marginal dos métodos de gradiente adaptativo no aprendizado de máquina .

A última linha da Seção 4: Experiências de aprendizado profundo diz

Embora a sabedoria convencional sugira que o Adam não exija ajuste, descobrimos que o ajuste da taxa de aprendizado inicial e do esquema de decaimento do Adam produz melhorias significativas em suas configurações padrão em todos os casos.

Por último, mas não menos importante, o artigo sugere que usamos o SGD de qualquer maneira.

Murat Seckin Ayhan
fonte
2

Concordo com a opinião da @Indie AI, aqui eu forneço algumas outras informações:

Do CS231n :

... Muitos desses métodos ainda podem exigir outras configurações de hiperparâmetro, mas o argumento é que eles são bem-comportados para uma faixa mais ampla de valores de hiperparâmetro que a taxa bruta de aprendizado. ...

E também do artigo Repensando a arquitetura inicial para a Visão por Computador Seção 8:

... enquanto nossos melhores modelos foram alcançados usando o RMSProp [21] com queda de 0,9 e ε = 1,0. Utilizamos uma taxa de aprendizado de 0,045, decaída a cada duas épocas, usando uma taxa exponencial de 0,94. ...

llj098
fonte
2

Treinei um conjunto de dados com dados reais fáceis, se uma pessoa é considerada gorda ou não, altura e peso - criando dados calculando o IMC e, se acima de 27 anos, a pessoa é gorda. Dados básicos muito fáceis. Ao usar o Adam como otimizador e a taxa de aprendizado em 0,001, a precisão me alcançará 85% em 5 epocs, atingindo no máximo 90% com mais de 100 epocs testados.

Mas ao carregar novamente em talvez 85% e com uma taxa de aprendizado de 0,0001, a precisão será superior a 3 epocs, para 95%, e mais 10 epocs, em torno de 98-99%. Não tenho certeza se a taxa de aprendizado pode ficar abaixo de 4 dígitos 0,0001, mas, ao carregar o modelo novamente e usar 0,00001, o accionário ficará em torno de 99,20 - 100% e não ficará abaixo. Novamente, não tenho certeza se a taxa de aprendizado seria considerada 0, mas de qualquer maneira, é isso que eu tenho ...

Tudo isso usando categorical_crossentropy, mas mean_square chega a 99-100% também usando esse método. AdaDelta, AdaGrad, Nesterov não podiam ter uma precisão acima de 65%, apenas para uma observação.

WoodyDRN
fonte
0

O declínio da taxa de aprendizado no Adam é o mesmo do RSMProp (como você pode ver nesta resposta ), e isso se baseia principalmente na magnitude dos gradientes anteriores para despejar as oscilações . Portanto, a deterioração exponencial (para uma taxa de aprendizado decrescente ao longo do processo de treinamento) pode ser adotada ao mesmo tempo. Todos eles decaem a taxa de aprendizado, mas com propósitos diferentes .

Lerner Zhang
fonte