Differenza tra GradientDescentOptimizer e AdamOptimizer (TensorFlow)?


45

Ho scritto un semplice MLP in TensorFlow che sta modellando un XOR-Gate .

Quindi per:

input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]]

dovrebbe produrre quanto segue:

output_data = [[0.], [1.], [1.], [0.]]

La rete ha uno strato di input, uno nascosto e uno di output con 2, 5 e 1 neuroni ciascuno.

Attualmente ho la seguente entropia incrociata:

cross_entropy = -(n_output * tf.log(output) + (1 - n_output) * tf.log(1 - output))

Ho anche provato questa alternativa più semplice:

cross_entropy = tf.square(n_output - output)

insieme ad altri tentativi.


Tuttavia, indipendentemente dalla mia configurazione, l'errore con a GradientDescentOptimizerstava diminuendo molto più lentamente di un AdamOptimizer.

In effetti, tf.train.AdamOptimizer(0.01)dopo 400-800 passi di apprendimento (in base alla frequenza di apprendimento, dove 0.01avevano i risultati migliori) sono stati ottenuti risultati davvero buoni, mentre sono tf.train.GradientDescentOptimizersempre stati necessari oltre 2000 passi di apprendimento, indipendentemente dal calcolo dell'entropia o dalla velocità di apprendimento.

Perché è così? Sembra che AdamOptimizersia sempre una scelta migliore ?!


2
L'ottimizzatore Adam è più sofisticato della discesa gradiente (è basato su questo documento ).
Marc Claesen,

Risposte:


77

Gli tf.train.AdamOptimizerusi Kingma e di Ba Adam algoritmo per controllare il tasso di apprendimento. Adam offre diversi vantaggi rispetto al semplice tf.train.GradientDescentOptimizer. Il primo è che utilizza le medie mobili dei parametri (quantità di moto); Bengio discute i motivi per cui ciò è vantaggioso nella Sezione 3.1.1 di questo documento . In poche parole, ciò consente ad Adam di utilizzare una dimensione del passo effettiva maggiore e l'algoritmo converge in questa dimensione del passo senza una regolazione fine.

Il principale lato negativo dell'algoritmo è che Adam richiede l'esecuzione di più calcoli per ciascun parametro in ogni fase dell'allenamento (per mantenere le medie mobili e la varianza e calcolare il gradiente in scala); e più stato da conservare per ciascun parametro (triplicando approssimativamente la dimensione del modello per memorizzare la media e la varianza per ciascun parametro). Un semplice tf.train.GradientDescentOptimizerpotrebbe anche essere usato nel tuo MLP, ma richiederebbe una maggiore messa a punto dell'iperparametro prima che converga più rapidamente.


5
Grazie per questa risposta! Potresti aggiungere cosa intendi esattamente quando parli di " tuning dell'iperparametro "?
daniel451,

12
Scusa per il gergo! In termini approssimativi, intendevo "variare l' learning_rateargomento dal tf.train.GradientDescentOptimizercostruttore fino a quando non converge più velocemente". :)
mrry il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.