ResNet atlama aracılığıyla gradyan geri yayılımı bağlantıları atla


22

Degradelerin ResNet modülleri / atlama bağlantıları kullanarak bir sinir ağı üzerinden nasıl yayıldığını merak ediyorum. ResNet hakkında birkaç soru gördüm (örneğin , atlama katmanı bağlantılarına sahip sinir ağı ) ancak bu, özellikle eğitim sırasında degradelerin geri yayılması hakkında sorular soruyor.

Temel mimari burada:

görüntü tanımını buraya girin

Görüntü Tanıma için Kalıntı Ağları Çalışması adlı bu makaleyi okudum ve Bölüm 2'de, ResNet'in amaçlarından birinin degradenin taban katmanına geri yayılması için daha kısa / daha net bir yol sağlamasına izin vermekten bahsetti.

Bu tür bir ağda degradenin nasıl aktığını açıklayan var mı? Ekleme işleminin ve eklemeden sonra parametreli hale getirilmiş bir katmanın olmayışının daha iyi gradyan yayılımına nasıl izin verdiğini tam olarak anlamadım. Bir ekleme işlecinden akarken degradenin nasıl değişmeyeceği ve çarpma olmadan bir şekilde yeniden dağıtılmasıyla ilgisi var mı?

Ayrıca, gradyanın ağırlık katmanlarından akması gerekmiyorsa, kaybolan gradyan sorununun nasıl azaldığını anlayabiliyorum, ancak ağırlıklar arasında herhangi bir degrade akışı yoksa geriye doğru geçişten sonra nasıl güncellenir?


Sadece aptalca bir soru, neden x'i atlama bağlantısı olarak geçiyoruz ve sonunda x'i almak için tersini (F (x)) hesaplamıyoruz?
Yash Kumar Atri

Amacını anlamadım the gradient doesn't need to flow through the weight layers, bunu açıklar mısın?
anu

Yanıtlar:


13

Ekle, gradyanı her iki girişe de eşit olarak geri gönderir. Aşağıdakileri tensorflow'ta çalıştırarak kendinizi bu konuda ikna edebilirsiniz:

import tensorflow as tf

graph = tf.Graph()
with graph.as_default():
    x1_tf = tf.Variable(1.5, name='x1')
    x2_tf = tf.Variable(3.5, name='x2')
    out_tf = x1_tf + x2_tf

    grads_tf = tf.gradients(ys=[out_tf], xs=[x1_tf, x2_tf])
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        fd = {
            out_tf: 10.0
        }
        print(sess.run(grads_tf, feed_dict=fd))

Çıktı:

[1.0, 1.0]

Yani, degrade olacak:

  • atlama katmanı bağlantısı üzerinden değişmeden önceki katmanlara geri döndü ve ayrıca
  • ağırlıkları olan bloğa geçti ve bu ağırlıkları güncellemek için kullanılır

Düzenleme: bir soru var: "Karayolu bağlantısının ve sinir ağı bloğunun Şekil 2'nin altında tekrar biraraya geldiği noktadaki işlem nedir?"

Cevap var: toplanırlar. Bunu Şekil 2'nin formülünden görebilirsiniz:

çıktıF(x)+x

Bu ne diyor ki:

  • x
  • veri yolu değerlerini, geçirme sonuçlarına eklenir.xF(x)
  • çıktı

Düzenleme 2:

Biraz farklı kelimelerle yeniden yazma:

  • ileri yönde, giriş verileri veriyoludan aşağı akar
    • veri yolu üzerindeki noktalarda, artık bloklar veri yolu vektörüne değer eklemeyi / kaldırmayı öğrenebilir
  • geri yönde, gradyanlar bara geri doğru akar
    • yol boyunca, gradyanlar geçtikleri kalıntı blokları günceller
    • Kalıntı blokların kendileri degradeleri biraz değiştirir

Kalıntı bloklar geriye akan gradyanları değiştirir, fakat gradyanların içinden geçtiği 'ezme' veya 'aktivasyon' işlevleri yoktur. 'squashing' / 'aktivasyon' işlevleri patlayan / kaybolma degrade problemine neden olan şeydir, bu yüzden bunları otobüsten alarak, bu problemi büyük ölçüde azaltırız.

Düzenleme 3: Şahsen kafamda bir resnet aşağıdaki diyagram olarak hayal ediyorum. Topolojik olarak şekil 2 ile aynıdır, ancak artık bloklar ağ üzerinden nasıl aktığını gösterirken, artık bloklar ondan değerlere dokunurken ve veri yoluna küçük bir vektör eklerken / kaldırırken:

görüntü tanımını buraya girin


1
gradyan ayrıca ağırlık bloklarından da geçiriliyorsa (normal ağlarda olduğu gibi) resnet faydası nereden geliyor? Elbette, degradenin doğrudan taban girişine atlamasına izin veriyor, ancak diğer yol hala normal olarak eğitildiğinde, bu nasıl bir performans artışı sağlıyor?
Simon

3
Anlıyorum. Böylece bir gradyan x'e geri atlıyor, diğeri ağırlıklar boyunca x'e geri yayılıyor. x'in 2 yola ayrılması nedeniyle x'e ulaştığında toplanırlar mı? öyleyse, degrade bu katmanlar arasında geriye doğru hareket ettikçe değişmiyor mu?
Simon,

1
Degradeler değişmeden yığından aşağıya doğru akar. Bununla birlikte, her blok, ağırlık güncellemelerini uyguladıktan ve kendi gradyanlar kümesini oluşturduktan sonra yığına kendi gradyan değişikliklerine katkıda bulunur. Her bloğun hem girişi hem de çıkışı vardır ve degradeler girişten "gradyan" gradyanına geri döner.
Hugh Perkins

1
@RonakAgrawal, Şekil 2'deki toplam operatoini gösteren bir düzenleme ekledi ve açıkladı
Hugh Perkins

1
benim açıklama biraz açıklama rephrasing ikinci bir :) ekledi
Hugh Perkins
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.