Minibatch gradyan inişi, bir toplu işteki her örnek için ağırlıkları nasıl günceller?


12

Bir partide 10 örnek söylersek, her örnek için kaybı toplayabileceğimizi anlıyorum, ancak backpropagation her örnek için ağırlıkların güncellenmesinde nasıl çalışır?

Örneğin:

  • Örnek 1 -> kayıp = 2
  • Örnek 2 -> kayıp = -2

Bu ortalama 0 (E = 0) kaybıyla sonuçlanır, bu yüzden bu her bir ağırlığı nasıl güncelleyip birleşir? Er ya da geç yakınlaştığımız “umarım” partilerin randomizasyonu ile mi? Ayrıca, bu yalnızca işlenen son örnek için ilk ağırlık kümesinin gradyanını hesaplamaz mı?

Yanıtlar:


16

Degrade iniş, önerdiğiniz şekilde çalışmaz, ancak benzer bir sorun ortaya çıkabilir.

Toplu işten ortalama kaybı hesaplamıyoruz, kayıp fonksiyonunun ortalama gradyanlarını hesaplıyoruz. Degradeler, ağırlığa göre kaybın türevidir ve bir nöral ağda bir ağırlık için gradyan, bu spesifik örneğin girişlerine bağlıdır ve aynı zamanda modeldeki diğer birçok ağırlığa da bağlıdır.

Modelinizde 5 ağırlık varsa ve mini parti boyutu 2 ise, bunu alabilirsiniz:

Örnek 1. Kayıp = 2,gradyanları=(1.5,-2.0,1.1,0.4,-0.9)

Örnek 2. Kayıp = 3,gradyanları=(1.2,2.3,-1.1,-0.8,-0.7)

Bu mini partideki degradelerin ortalaması hesaplanır, bunlar(1.35,0.15,0,-0.2,-0.8)

Birkaç örnek üzerinde ortalama almanın yararı, gradyandaki varyasyonun daha düşük olmasıdır, böylece öğrenme daha tutarlı ve bir örneğin özelliklerine daha az bağımlıdır. Üçüncü ağırlık için ortalama gradyanın olduğuna dikkat edin , bu ağırlık bu ağırlık güncellemesini değiştirmeyecektir, ancak seçilen farklı örneklerle hesaplanan sonraki örnekler için muhtemelen sıfır olmayacaktır.0

yorumlara yanıt olarak düzenle:

Yukarıdaki örneğimde, degradelerin ortalaması hesaplanmıştır. Her örnek için kaybını hesapladığımız küçük bir parti büyüklüğü için ve ağırlığına göre kaybın ortalama derecesini elde etmeyi .L i w jkLbenwj

yazdığım şekliyle her gradyanı ortaladım:Lwj=1kΣben=1kLbenwj

Yorumlarda bağlandığınız öğretici kod, ortalama kaybı en aza indirmek için Tensorflow'u kullanır.

Tensorflow L_i'yi en aza indirmeyi hedefliyor1kΣben=1kLben

Bunu en aza indirmek için, her bir ağırlığa göre ortalama kaybın gradyanlarını hesaplar ve ağırlıkları güncellemek için degrade iniş kullanır:

Lwj=wj1kΣben=1kLben

Farklılaşma toplamın içine getirilebilir, böylece benim örneğimdeki yaklaşımdan ifade ile aynıdır.

wj1kΣben=1kLben=1kΣben=1kLbenwj


Anladım. Yine de batch_size üzerindeki kayıpları doğru hesaplamak ister misiniz? Tensorflow'a aşina olup olmadığınızdan emin değilim ama anlayışımı şu öğretici ile uzlaştırmaya çalışıyorum: tensorflow.org/get_started/mnist/beginners Kaybın toplu iş üzerinden ortalandığını görebilirsiniz (reduce_mean kodu). Sanırım tensorflow ağırlıkların bir iç sayımını / ortalamalarını tutar?
karbon hesaplama

1
@karboncomputed Oh evet haklısın, kaybı ortalamalar, böylece Tensorflow ortalama kaybın gradyanlarını hesapladığında, her bir kayıp için gradyanların ortalamasını etkili bir şekilde hesaplar. Bunun matematiğini göstermek için cevabımı düzenleyeceğim.
Hugh

İlginç. Açıklama için teşekkürler. Öyleyse, sadece biraz daha derin kazmak için, ağırlık geçişleri örnek olarak ileri geçiş sırasında hesaplanıyor ve saklanıyor veya bunlar tensorflow'daki optimizasyon işlemi sırasında hesaplanıyor mu? Sanırım sadece bu yerdeki gradyanlar tensorflow'da "nerede" eksik? İleri geçişi ve kaybı görüyorum, bu yüzden tensorflow bu gradyan hesaplamalarını yapıyor / benim için kaputun altında ortalamayı mı yapıyor?
karbon hesaplama 13:17

1
@carboncomputed Bu Tensorflow'un cazibesi, sembolik matematik kullanıyor ve kaputun altında farklılaşma yapabilir
Hugh

Düzgün bir cevap için teşekkür ederim. Ancak, ben TF gösterildiği gibi ortalama bir kayıpla yayılırlar geri bilen anlamak için başarısız Bu örnekte , code line 170?
günahkar

-1

Mini partileri kullanmanın nedeni, etkilerinin ortalamasını alarak olası gürültüsünü azaltacak şekilde iyi bir eğitim örneğine sahip olmaktır, ancak aynı zamanda birçok veri seti için büyük miktarda bellek gerektirebilecek tam bir parti değildir. Önemli bir gerçek, değerlendirdiğiniz hatanın her zaman bir mesafe olmasıdır.tahmin edilen çıktı ile gerçek çıktı arasında: bu negatif olamaz, yani dediğin gibi, iptal eden 2 ve -2 hatalarına sahip olamazsınız, bunun yerine 4 hatası olur. Daha sonra hatanın eğimini tüm ağırlıklara göre değerlendirirsiniz, böylece ağırlıklardaki hangi değişikliğin onu en fazla azaltacağını hesaplayabilirsiniz. Bunu yaptıktan sonra, öğrenme oranınızın alfa büyüklüğüne göre bu yönde bir "adım" atarsınız. (Bu temel kavramlar, derin NN için geri yayılım hakkında ayrıntıya girmiyorum) Bu eğitimi belirli sayıda dönem için veri kümenizde çalıştırdıktan sonra, öğrenme adımınız çok büyük değilse ağınızın birleşmesini bekleyebilirsiniz. ayrıştırma. Yine de yerel bir minimumda olabilirsiniz, ağırlıklarınızı farklı şekilde başlatarak, farklı optimizatörleri kullanarak ve düzenli hale getirmeye çalışarak bu önlenebilir.


Sadece eklemek için: çoğunlukla toplu verimlilik için mini partiler kullanıyoruz. İniş doğruluğu ile ağırlıkların güncellenme sıklığı arasında bir değiş tokuşumuz var. Veriler belleğe sığmayacak kadar büyük olmalıdır.
asukasz Grad

Her birini anlıyorum, ancak belirli bir parti için ağırlıklarımızı nasıl güncelleyebiliriz? Her bir örnek için ağırlık gradyanları da toplanıyor mu?
karbon hesaplama

Hayır, toplam parti hatası üzerinde sadece bir türev vektörü olan bir gradyan vardır. Bu, ağırlıklarımızı gradyana göre güncellediğimiz anlamına gelir, yani bu mini toplu işte hatayı en fazla yapan güncelleme yönü. Gradyan, kısmi türevlerden yapılır, yani her bir ağırlığa göre mini parti hatasının türevi: bu, her bir ağırlığın daha küçük veya daha büyük olması gerektiğini ve ne kadar olduğunu gösterir. Tüm ağırlıklar, diğer mini partilerden bağımsız olarak o mini parti üzerindeki hatayı azaltmak için parti için bir güncelleme alır.
dante
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.