Tensorflow tf.train.Optimizer` gradyanları nasıl hesaplar?


10

Tensorflow mnist eğitimini takip ediyorum ( https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/mnist/mnist_softmax.py ).

Öğretici kullanır tf.train.Optimizer.minimize(özellikle tf.train.GradientDescentOptimizer). Degradeleri tanımlamak için hiçbir yere aktarılan bir argüman görmüyorum.

Tensör akışı varsayılan olarak sayısal türev kullanıyor mu?

Sizin gibi degradeleri geçirmenin bir yolu var mı scipy.optimize.minimize?

Yanıtlar:


16

Sayısal farklılaşma değil, otomatik farklılaşma . Bu, tensorflow'un varlığının temel nedenlerinden biridir: bir tensorflow grafiğindeki işlemleri ( Tensors ve benzeri işlemlerle) belirterek , zincir kuralını grafik üzerinden otomatik olarak izleyebilir ve her bir işlemin türevlerini bildiğinden bunları otomatik olarak birleştirebilir.

Herhangi bir nedenle bu parçayı geçersiz kılmak istiyorsanız, ile mümkündür gradient_override_map.


Sayısal türev kullanarak otomatik türevleme değil mi?
Aerin

@BYOR Hayır; yukarıdaki Wikipedia bağlantısına göz atın. Tensorflow'un yaptığı şey aslında "gerçek" ters modlu otodiff ve sembolik farklılaşma arasında bir yerdedir.
Dougal

@ Grafik yok istekli mod kullanarak grafik yok, tf.fonksiyon dekoratör, otomatik fark tensörler arasındaki ilişkiyi nasıl biliyor?
datdinhquoc

1
@datdinhquoc Aynı temel algoritma, bir uygulamadan biraz daha karmaşık.
Dougal

9

Otomatik farklılaştırma kullanır. Zincir kuralı kullandığında ve degradeleri atayarak grafikte geriye doğru git.

Diyelim ki bir tensörünüz C var Bu tensör C bir dizi işlemden sonra yaptı Diyelim ki, ekleyerek, çarparak, bazı doğrusal olmayanlıklardan geçerek vb.

Eğer bu C, Xk denilen bazı tensörlere bağlıysa, degradeleri almamız gerekir

Tensorflow her zaman operasyon yolunu takip eder. Düğümlerin sıralı davranışı ve aralarındaki veri akışının nasıl olduğunu kastediyorum. Bu grafik tarafından yapılır resim açıklamasını buraya girin

Maliyet wrt X girişlerinin türevlerini almamız gerekiyorsa, bunun ilk yaptığı şey, grafiği genişleterek x-girişinden maliyete giden yolu yüklemektir.

Sonra nehir sırayla başlar. Sonra degradeleri zincir kuralı ile dağıtın. (Geri yayılım ile aynı)

Herhangi bir şekilde tf.gradients () 'a ait kaynak kodlarını okursanız, tensorflow'un bu degrade dağıtım bölümünü güzel bir şekilde yaptığını görebilirsiniz.

Geri izleme tf grafikle etkileşime girerken, backword geçişinde TF farklı düğümleri karşılayacaktır Bu düğümlerin içinde matmal, softmax, relu, batch_normalization vb. Olarak adlandırdığımız işlemler vardır. grafik

Bu yeni düğüm, işlemlerin kısmi türevini oluşturur. get_gradient ()

Yeni eklenen bu düğümler hakkında biraz konuşalım

Bu düğümlerin içine tf 2 şey ekliyoruz 1. Türevleri daha iyi hesapladık) 2.Ayrıca ileri geçişte ilgili opp'a girişler

Böylece zincir kuralı ile

Yani bu bir backword API'siyle aynı

Bu yüzden tensorflow otomatik farklılaşma yapmak için her zaman grafiğin sırasını düşünün

Bu nedenle, degradeleri hesaplamak için ileri geçiş değişkenlerine ihtiyacımız olduğunu bildiğimizde, ara değerleri de tensörlerde depolamamız gerekir, bu belleği azaltabilir Birçok işlem için degradelerin nasıl hesaplanacağını ve dağıtılacağını biliriz.


1
im grafik yok, istekli tf.function dekoratör ile istekli modu kullanarak, otomatik ayrım tensörler arasındaki ilişkiyi nasıl biliyor?
datdinhquoc
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.