Saya menggunakan TensorFlow untuk melatih jaringan neural. Ini adalah bagaimana saya menginisialisasi GradientDescentOptimizer
:
init = tf.initialize_all_variables()
sess = tf.Session()
sess.run(init)
mse = tf.reduce_mean(tf.square(out - out_))
train_step = tf.train.GradientDescentOptimizer(0.3).minimize(mse)
Masalahnya di sini adalah saya tidak tahu cara menyetel aturan pembaruan untuk kecepatan pemelajaran atau nilai peluruhan untuk itu.
Bagaimana cara menggunakan kecepatan pemelajaran adaptif di sini?
python
tensorflow
nama tampilan
sumber
sumber
FailedPreconditionError (see above for traceback): Attempting to use uninitialized value beta2_power
tf.train.GradientDescentOptimizer(new_lr).minimize(loss)
. Tampaknya, menyetel kecepatan pemelajaran baru memerlukan inisialisasi model dengan variabel yang sudah dilatih. Tetapi tidak tahu bagaimana melakukan itu.Jawaban:
Pertama-tama,
tf.train.GradientDescentOptimizer
dirancang untuk menggunakan kecepatan pembelajaran konstan untuk semua variabel di semua langkah. TensorFlow juga menyediakan pengoptimal adaptif out-of-the-box termasuk thetf.train.AdagradOptimizer
dan thetf.train.AdamOptimizer
, dan ini dapat digunakan sebagai pengganti drop-in.Namun, jika Anda ingin mengontrol kecepatan pemelajaran dengan sebaliknya-penurunan gradien vanilla, Anda dapat memanfaatkan fakta bahwa
learning_rate
argumen ketf.train.GradientDescentOptimizer
konstruktor dapat berupaTensor
objek. Ini memungkinkan Anda menghitung nilai yang berbeda untuk kecepatan pembelajaran di setiap langkah, misalnya:Atau, Anda dapat membuat skalar
tf.Variable
yang menahan kecepatan pembelajaran, dan menetapkannya setiap kali Anda ingin mengubah kecepatan pembelajaran.sumber
tf.clip_by_norm
tidak menerima tensor untuk norma klip, jadi bagaimana dengan melakukan[(tf.minimum(gv[0], ct), gv[1]) for gv in optimizer.compute_gradients(cost, vars)]
, di manact = tf.placeholder('float32', shape=[])
tf.clip_by_norm
, satu-satunya hal yang mencegahnya menerima tensor sebagai input adalahconstant_op.constant(1.0 / clip_norm)
. Mengganti ekspresi itu denganmath_ops.inv(clip_norm)
akan membuatnya berfungsi dengan input placeholder (atau tensor lainnya).)Tensorflow memberikan op untuk secara otomatis menerapkan peluruhan eksponensial ke tensor tingkat belajar:
tf.train.exponential_decay
. Untuk contoh yang digunakan, lihat baris ini dalam contoh model konvolusional MNIST . Kemudian gunakan saran @ mrry di atas untuk menyediakan variabel ini sebagai parameter learning_rate ke pengoptimal pilihan Anda.Kutipan utama untuk dilihat adalah:
Perhatikan
global_step=batch
parameter yang akan diminimalkan. Itu memberi tahu pengoptimal untuk secara membantu menaikkan parameter 'batch' untuk Anda setiap kali berlatih.sumber
batch
dipanggilglobal_step
dan ada beberapa fungsi kemudahan, satu untuk membuatnyatf.train.create_global_step()
(yang hanya membuat integertf.Variable
dan menambahkannya ketf.GraphKeys.GLOBAL_STEP
koleksi) dantf.train.get_global_step()
.Algoritme penurunan gradien menggunakan kecepatan pemelajaran konstan yang dapat Anda berikan selama inisialisasi . Anda bisa lulus berbagai learning rate dengan cara yang ditunjukkan oleh Mrry.
Namun selain itu Anda juga dapat menggunakan pengoptimalan yang lebih canggih yang memiliki tingkat konvergensi lebih cepat dan menyesuaikan dengan situasi.
Berikut penjelasan singkat berdasarkan pemahaman saya:
Adam atau momentum adaptif adalah algoritma yang mirip dengan AdaDelta. Namun selain menyimpan kecepatan pembelajaran untuk masing-masing parameter, juga menyimpan perubahan momentum untuk masing-masing parameter secara terpisah
Sebuah beberapa visualisasi :
sumber
Dari dokumen resmi tensorflow
sumber
Jika Anda ingin menetapkan kecepatan pembelajaran khusus untuk interval zaman seperti
0 < a < b < c < ...
. Kemudian Anda dapat menentukan kecepatan pemelajaran Anda sebagai tensor bersyarat, bersyarat pada langkah global, dan memasukkannya seperti biasa ke pengoptimal.Anda bisa mencapai ini dengan sekumpulan
tf.cond
pernyataan bertingkat , tetapi lebih mudah untuk membangun tensor secara rekursif:Kemudian untuk menggunakannya, Anda perlu mengetahui berapa banyak langkah pelatihan yang ada dalam satu epoch, sehingga kita dapat menggunakan langkah global untuk beralih pada waktu yang tepat, dan terakhir menentukan epoch dan kecepatan pembelajaran yang Anda inginkan. Jadi jika saya ingin kecepatan pembelajaran masing
[0.1, 0.01, 0.001, 0.0001]
-[0, 19], [20, 59], [60, 99], [100, \infty]
masing selama interval periode , saya akan melakukan:sumber