Adım adım ters mod otomatik farklılaşma örneği


27

Bu sorunun buraya ait olup olmadığından emin değilim, ancak optimizasyondaki degrade yöntemleriyle yakından ilgilidir, bu da burada konuyla ilgili görünüyor. Her neyse, başka bir topluluğun bu konuda daha iyi bir uzmanlığı olduğunu düşünüyorsanız, göç etmekten çekinmeyin.

Kısacası, adım adım ters mod otomatik farklılaşma örneği arıyorum . Orada konuyla ilgili çok fazla literatür yok ve mevcut uygulamanın ( TensorFlow'daki gibi ) arkasındaki teoriyi bilmeden anlaşılması zor. Biri biz ayrıntılı olarak göstermek eğer Böylece çok müteşekkir olurum geçmek nasıl, onu işlemek ve ne çıkar hesaplamalı grafiğin.

En çok sorun yaşadığım birkaç soru:

  • tohumlar - neden onlara ihtiyacımız var?
  • farklılaşma kurallarını tersine çevir - Farklılaşmayı nasıl ileri süreceğimi biliyorum, ama nasıl geri gideriz? Dan örnekte Örneğin bu bölümde , nasıl olduğunu biliyoruz ?w2¯=w3¯w1
  • sadece sembollerle mi çalışıyoruz yoksa gerçek değerlerden mi geçiyoruz ? Örneğin aynı örnekte , ve sembolleri veya değerleri midir?wiwi¯

"Scikit-Learn & TensorFlow ile Uygulamalı Makine Öğrenimi" Ek D, bence çok iyi bir açıklama yaptı. Bunu öneririm.
Agustin Barrachina

Yanıtlar:


37

Diyelim ki ifadesi var ve ve türevlerini bulmak istiyoruz . Ters mod AD, bu görevi 2 parçaya, yani ileri ve geri geçişlere ayırır.z=x1x2+sin(x1)dzdx1dzdx2

Doğrudan geçiş

İlk olarak, karmaşık ifademizi bir dizi ilkel ifadeye, yani en fazla tek işlev çağrısından oluşan ifadelere ayrıştırırız. Giriş ve çıkış değişkenlerini tutarlılık için de yeniden adlandırdığımı unutmayın, ancak zorunlu değil:

w1=x1
w2=x2
w3=w1w2
w4=sin(w1)
w5=w3+w4
z=w5

Bu gösterimin avantajı, her bir ayrı ifade için farklılaşma kurallarının zaten bilinmesidir. Örneğin, türevi biliyoruz olduğu ve böylece . Bu gerçeği aşağıdaki tersine geçişlerde kullanacağız.sincosdw4dw1=cos(w1)

Temel olarak, ileri geçiş, bu ifadelerin her birini değerlendirmekten ve sonuçları kaydetmekten oluşur. Diyelim ki girdilerimiz: ve . O zaman biz var:x1=2x2=3

w1=x1=2
w2=x2=3
w3=w1w2=6
w4=sin(w1) =0.9
w5=w3+w4=6.9
z=w5=6.9

Ters geçiş

Bu sihir başlangıcıydı ve zincir kuralıyla başlıyor . Temel kural olarak, zincir kuralı , u'ya bağlı olan ve ardından v'ye bağlı olan t(u(v)) değişkeni varsa, o zaman şunu belirtir :uv

dtdv=dtdududv

ya da, eğer t bağlıdır v çeşitli yollar / değişkenler yoluyla ui , örneğin:

u1=f(v)
u2=g(v)
t=h(u1,u2)

o zaman ( burada kanıtına bakınız ):

dtdv=idtduiduidv

Sentezleme grafik açısından, bir son düğüm varsa z ve giriş düğümleri wi gelen ve yolu z için wi ara düğümlerin içinden geçer wp (yani z=g(wp) burada wp=f(wi) ), biz türevi bulabilirsiniz dzdwi olarak

dzdwi=pparents(i)dzdwpdwpdwi

Diğer bir deyişle, çıktı değişkeni türevi hesaplamak için z , herhangi bir ara veya giriş değişkeni wrt wi , sadece ebeveynlerinin türevleri ve ilkel ifade türevi hesaplamak için formül bilmek gerekir wp=f(wi) .

Ters geçiş sonunda başlar (yani, dzdz ) ve tüm bağımlılıklara geriye doğru yayılır. İşte biz ("tohum" ifadesi):

dzdz=1

Yani "değişim olarak okunabilir z tam olarak aynı değişime sonuçları z oldukça açıktır".

O zaman şunu biliyoruz z=w5 ve diğerleri:

dzdw5=1

w5 doğrusal olarakw3 vew4 bağlıdır, bu nedenledw5dw3=1vedw5dw4=1. Zincir kuralını kullanarak bulduklarımız:

dzdw3=dzdw5dw5dw3=1×1=1
dzdw4=dzdw5dw5dw4=1×1=1

w3=w1w2 tanımından ve kısmi türevlerin kurallarından, dw3dw2=w1. Böylece:

dzdw2=dzdw3dw3dw2=1xw1=w1

İleriye doğru geçişlerden zaten bildiğimiz gibi:

dzdw2=w1=2

Son olarak, w1 katkıda bulunur z ile w3 ve w4 . Daha sonra, kısmi türev kurallarından biliyoruz ki dw3dw1=w2vedw4dw1=cos(w1). Böylece:

dzdw1=dzdw3dw3dw1+dzdw4dw4dw1=w2+cos(w1)

Ve yine, bilinen girdiler göz önüne alındığında, bunu hesaplayabiliriz:

dzdw1=w2+cos(w1)=3+cos(2) =2.58

Yana w1 ve w2 için sadece takma adlardır x1 ve x2 , bizim cevap olsun:

dzdx1=2.58
dzdx2=2

Ve bu kadar!


Bu açıklama yalnızca skaler girdilerle, yani sayılarla ilgilidir, ancak aslında vektörler ve matrisler gibi çok boyutlu dizilere de uygulanabilir. İfadeleri bu tür nesnelerle ayırt ederken akılda tutulması gereken iki şey:

  1. Türevler, girdilerden veya çıktılardan çok daha yüksek bir boyutsallığa sahip olabilir, örneğin vektör wrt vektörünün türevi bir matristir ve matris türevi, wrt matrisinin 4 boyutlu bir dizi olduğu (bazen bir tensör olarak adlandırılır). Birçok durumda bu türevler çok seyrektir.
  2. y=f(x)xyyiyjxkdyidxjyixj

dzdw1=w2+cos(w1)=x2+cos(x1)


1
Çok faydalı bir soru / cevap. Teşekkürler. Sadece küçük bir eleştiri: açıklama yapmadan bir ağaç yapısına
ilerliyor gibisiniz

1
Ayrıca neden tohumlara ihtiyaç duyduğumuzu açıklığa kavuşturmaz.
MadHatter

dzdz=1

Teşekkürler! Birden fazla "tohum" ayarlamanız gerektiğinde, genellikle 1 ve 0 seçtiğini fark ettim. Nedenini bilmek istiyorum. Demek istediğim, biri diferansiyel wrt'in kendisinin "kısmını" alır, bu yüzden "1" en azından sezgisel olarak gerekçelendirilir. Peki ya 2'den fazla tohum seçmek zorunda kalırsa?
MadHatter

1
Anladığım kadarıyla, yalnızca ileri mod AD'de birden fazla tohum kullanılıyor. Bu durumda ekmeğe göre farklılaştırmak istediğiniz bir giriş değişkeni için tohumu 1 olarak ayarlayın ve çıktı değerine katkıda bulunmamaları için ekimi diğer tüm giriş değişkenleri için 0 olarak ayarlayın. Ters modda, tohumu bir çıkış değişkenine ayarlarsınız ve normalde yalnızca bir çıkış değişkenine sahip olursunuz. Sanırım, birkaç çıkış değişkenli ters mod AD boru hattı oluşturabilir ve hepsini ileri moddakiyle aynı etkiyi elde etmek için bir tanesini 0 olarak ayarlayabilirsiniz, ancak bu seçeneği hiç araştırmadım.
ffriend
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.