Bagaimana Tensorflow `tf.train.Optimizer` menghitung gradien?

10

Saya mengikuti tutorial mnist Tensorflow ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Tutorial menggunakan tf.train.Optimizer.minimize(khusus tf.train.GradientDescentOptimizer). Saya tidak melihat argumen yang dilewatkan di mana pun untuk menentukan gradien.

Apakah Tensor flow menggunakan diferensiasi numerik secara default?

Apakah ada cara untuk lulus dalam gradien seperti yang Anda bisa scipy.optimize.minimize?

limscoder
sumber

Jawaban:

16

Ini bukan diferensiasi numerik, ini diferensiasi otomatis . Ini adalah salah satu alasan utama keberadaan tensorflow: dengan menentukan operasi dalam grafik tensorflow (dengan operasi pada Tensors dan seterusnya), ia dapat secara otomatis mengikuti aturan rantai melalui grafik dan, karena ia mengetahui turunan dari masing-masing operasi yang Anda lakukan. tentukan, itu dapat menggabungkan mereka secara otomatis.

Jika karena alasan tertentu Anda ingin menimpa itu sedikit demi sedikit, itu mungkin dengan gradient_override_map.

Dougal
sumber
Bukankah diferensiasi otomatis menggunakan diferensiasi numerik?
Aerin
@BYOR Tidak; lihat tautan Wikipedia di atas. Apa yang tensorflow lakukan sebenarnya di suatu tempat di antara autodiff reverse-mode "nyata" dan diferensiasi simbolis.
Dougal
@Dougal saya menggunakan mode eager tanpa grafik, tanpa tf.fungsi dekorator, bagaimana diferensiasi otomatis mengetahui hubungan antara tensor?
datdinhquoc
1
@datdinhquoc Ini adalah algoritma dasar yang sama, hanya sedikit lebih rumit dari suatu implementasi.
Dougal
9

Ini menggunakan diferensiasi otomatis. Di mana ia menggunakan aturan rantai dan mundur dalam grafik yang menetapkan gradien.

Katakanlah kita memiliki tensor C tensor C ini dibuat setelah serangkaian operasi Katakanlah dengan menambahkan, mengalikan, melalui beberapa nonlinier, dll.

Jadi jika C ini tergantung pada beberapa set tensor yang disebut Xk, Kita perlu mendapatkan gradien

Tensorflow selalu melacak jalur operasi. Maksud saya perilaku berurutan dari node dan bagaimana data mengalir di antara mereka. Itu dilakukan oleh grafik masukkan deskripsi gambar di sini

Jika kita perlu mendapatkan turunan dari input X wrt biaya apa yang akan pertama kali dilakukan adalah memuat path dari input-x ke biaya dengan memperluas grafik.

Kemudian mulai dalam urutan sungai. Kemudian mendistribusikan gradien dengan aturan rantai. (Sama seperti backpropagation)

Bagaimanapun jika Anda membaca kode sumber milik tf.gradients () Anda dapat menemukan bahwa tensorflow telah melakukan bagian distribusi gradien ini dengan cara yang baik.

Ketika melakukan backtracking jika berinteraksi dengan grafik, pada kata sandinya TF akan bertemu dengan node yang berbeda. Di dalam node ini terdapat operasi yang kita sebut (ops) matmal, softmax, relu, batch_normalization dll. Jadi yang kita lakukan adalah secara otomatis memuat ops ini ke dalam grafik

Node baru ini merupakan turunan parsial dari operasi. get_gradient ()

Mari kita bicara sedikit tentang node yang baru ditambahkan ini

Di dalam simpul-simpul ini kami menambahkan 2 hal 1. Derivatif, kami menghitung dengan lebih mudah) 2.Juga input ke opp yang sesuai pada forward pass

Jadi dengan aturan rantai kita bisa menghitung

Jadi ini sangat mirip dengan API backword

Jadi tensorflow selalu memikirkan urutan grafik untuk melakukan diferensiasi otomatis

Jadi seperti yang kita tahu kita perlu meneruskan variabel untuk menghitung gradien maka kita perlu menyimpan nilai intermidiate juga dalam tensor ini dapat mengurangi memori Untuk banyak operasi tf tahu cara menghitung gradien dan mendistribusikannya.

Shamane Siriwardhana
sumber
1
Saya menggunakan mode bersemangat tanpa grafik, tanpa tf.fungsi dekorator, bagaimana perbedaan otomatis mengetahui hubungan antara tensor?
datdinhquoc