Perbedaan antara GradientDescentOptimizer dan AdamOptimizer (TensorFlow)?

45

Saya telah menulis MLP sederhana di TensorFlow yang memodelkan XOR-Gate .

Jadi untuk:

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

itu harus menghasilkan yang berikut:

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

Jaringan memiliki lapisan input, lapisan tersembunyi dan lapisan keluaran dengan masing-masing 2, 5 dan 1 neuron.

Saat ini saya memiliki cross entropy berikut:

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

Saya juga sudah mencoba alternatif yang lebih sederhana ini:

cross_entropy = tf.square(n_output - output)

bersama dengan beberapa percobaan lainnya.


Namun, tidak peduli apa pengaturan saya, kesalahan dengan GradientDescentOptimizermenurun jauh lebih lambat daripada AdamOptimizer.

Bahkan tf.train.AdamOptimizer(0.01)menghasilkan hasil yang benar-benar baik setelah 400-800 langkah pembelajaran (dalam ketergantungan tingkat pembelajaran, di mana 0.01memiliki hasil terbaik) sementara tf.train.GradientDescentOptimizerselalu diperlukan lebih dari 2000 langkah pembelajaran tidak peduli apa perhitungan lintas entropi atau tingkat pembelajaran yang digunakan.

Kenapa begitu? Tampaknya AdamOptimizerselalu ada pilihan yang lebih baik ?!

daniel451
sumber
2
Pengoptimal Adam lebih canggih daripada gradient descent (didasarkan pada makalah ini ).
Marc Claesen

Jawaban:

77

The tf.train.AdamOptimizerpenggunaan Kingma dan Ba algoritma Adam untuk mengendalikan laju belajar. Adam menawarkan beberapa keunggulan dibandingkan yang sederhana tf.train.GradientDescentOptimizer. Yang terpenting adalah menggunakan rata-rata bergerak dari parameter (momentum); Bengio membahas alasan mengapa hal ini bermanfaat dalam Bagian 3.1.1 dari makalah ini . Sederhananya, ini memungkinkan Adam untuk menggunakan ukuran langkah efektif yang lebih besar, dan algoritma akan menyatu dengan ukuran langkah ini tanpa penyetelan halus.

Sisi bawah utama dari algoritma adalah bahwa Adam membutuhkan lebih banyak perhitungan yang harus dilakukan untuk setiap parameter dalam setiap langkah pelatihan (untuk mempertahankan rata-rata bergerak dan varians, dan menghitung gradien yang diskalakan); dan lebih banyak status yang harus dipertahankan untuk setiap parameter (kira-kira tiga kali lipat ukuran model untuk menyimpan rata-rata dan varians untuk setiap parameter). Sederhana tf.train.GradientDescentOptimizerbisa sama-sama digunakan dalam MLP Anda, tetapi akan membutuhkan lebih banyak penyetelan hyperparameter sebelum akan menyatu dengan cepat.

Pak
sumber
5
Terima kasih atas jawaban ini! Bisakah Anda menambahkan apa yang sebenarnya Anda maksudkan ketika Anda berbicara tentang " penyetelan hyperparameter "?
daniel451
12
Maaf untuk jargonnya! Kira-kira berbicara, maksud saya "memvariasikan learning_rateargumen ke tf.train.GradientDescentOptimizerkonstruktor sampai konvergen lebih cepat." :)
mrry