Backpropagation yang luar biasa melalui koneksi lewati ResNet

22

Saya ingin tahu tentang bagaimana gradien diperbanyak kembali melalui jaringan saraf menggunakan modul ResNet / lewati koneksi. Saya telah melihat beberapa pertanyaan tentang ResNet (mis. Jaringan saraf dengan koneksi lompatan-lapisan ) tetapi yang satu ini menanyakan secara khusus tentang back-propagation of gradien selama pelatihan.

Arsitektur dasarnya ada di sini:

masukkan deskripsi gambar di sini

Saya membaca makalah ini, Studi Residual Networks untuk Pengenalan Gambar , dan di Bagian 2 mereka berbicara tentang bagaimana salah satu tujuan dari ResNet adalah untuk memungkinkan jalur yang lebih pendek / lebih jelas agar gradien merambat kembali ke lapisan dasar.

Adakah yang bisa menjelaskan bagaimana gradien mengalir melalui jenis jaringan ini? Saya tidak begitu mengerti bagaimana operasi penambahan, dan kurangnya lapisan parameter setelah penambahan, memungkinkan untuk propagasi gradien yang lebih baik. Apakah itu ada hubungannya dengan bagaimana gradien tidak berubah ketika mengalir melalui operator add dan entah bagaimana didistribusikan kembali tanpa multiplikasi?

Selain itu, saya bisa mengerti bagaimana masalah gradien hilang dikurangi jika gradien tidak perlu mengalir melalui lapisan berat, tetapi jika tidak ada aliran gradien melalui bobot maka bagaimana mereka diperbarui setelah melewati mundur?

Simon
sumber
Hanya pertanyaan idiot, Mengapa kita mengoper x sebagai koneksi skip dan tidak menghitung invers (F (x)) untuk mendapatkan x di akhir. Apakah itu menyebabkan kompleksitas komputasi?
Yash Kumar Atri
Saya tidak mengerti maksud Anda the gradient doesn't need to flow through the weight layers, dapatkah Anda menjelaskan hal itu?
anu

Jawaban:

13

Tambah mengirimkan gradien kembali sama ke kedua input. Anda dapat meyakinkan diri sendiri tentang hal ini dengan menjalankan yang berikut di tensorflow:

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))

Keluaran:

[1.0, 1.0]

Jadi, gradiennya adalah:

  • diteruskan kembali ke lapisan sebelumnya, tidak berubah, melalui koneksi skip-layer, dan juga
  • diteruskan ke blok dengan bobot, dan digunakan untuk memperbarui bobot tersebut

Sunting: ada pertanyaan: "apa operasi pada titik di mana koneksi jalan raya dan blok jaring saraf bergabung kembali bersama, di bagian bawah Gambar 2?"

Ada jawabannya adalah: mereka dijumlahkan. Anda dapat melihat ini dari rumus Gambar 2:

outputF(x)+x

Apa yang dikatakan adalah:

  • x
  • xF(x)
  • output

Edit 2:

Menulis ulang dengan kata-kata yang sedikit berbeda:

  • ke arah depan, data input mengalir ke bus
    • pada titik-titik di sepanjang bus, blok residual dapat belajar untuk menambah / menghapus nilai ke vektor bus
  • dalam arah mundur, gradien mengalir kembali ke bus
    • sepanjang jalan, gradien memperbarui blok residual yang mereka lewati
    • blok residual itu sendiri akan sedikit memodifikasi gradien juga

Blok residual memodifikasi gradien yang mengalir mundur, tetapi tidak ada fungsi 'squashing' atau 'aktivasi' yang mengalir melalui gradien. Fungsi 'squashing' / 'aktivasi' adalah apa yang menyebabkan masalah gradien meledak / menghilang, jadi dengan menghapusnya dari bus itu sendiri, kami mengurangi masalah ini secara signifikan.

Sunting 3: Secara pribadi saya membayangkan resnet di kepala saya seperti diagram berikut. Secara topologis identik dengan gambar 2, tetapi ini menunjukkan lebih jelas mungkin bagaimana bus hanya mengalir langsung melalui jaringan, sementara blok residu hanya mengetuk nilai-nilai dari itu, dan menambah / menghapus beberapa vektor kecil terhadap bus:

masukkan deskripsi gambar di sini

Hugh Perkins
sumber
1
jika gradien juga dilewatkan melalui blok bobot (seperti di jaringan biasa) lalu dari mana manfaat resnet berasal? yakin, ini memungkinkan gradien untuk melompat langsung ke input basis tetapi bagaimana cara itu menawarkan peningkatan kinerja ketika jalur lain masih dilatih seperti biasa?
Simon
3
Saya melihat. Jadi satu gradien dilewati langsung kembali ke x, yang lain merambat melalui bobot kembali ke x. apakah mereka disimpulkan ketika mereka mencapai x karena x telah dibagi menjadi 2 jalur? jika demikian, bukankah gradien masih berubah ketika bergerak kembali melalui lapisan-lapisan ini?
Simon
1
Gradien mengalir sepanjang jalan ke tumpukan, tidak berubah. Namun, setiap blok menyumbangkan perubahan gradiennya sendiri ke stack, setelah menerapkan pembaruan bobotnya, dan menghasilkan set gradiennya sendiri. Setiap blok memiliki input dan output, dan gradien akan mengalir keluar dari input, kembali ke gradien "jalan raya".
Hugh Perkins
1
@RonakAgrawal menambahkan suntingan yang menunjukkan jumlah operatoin dari Gambar 2, dan menjelaskannya
Hugh Perkins
1
menambahkan suntingan kedua ulang sedikit penjelasan saya :)
Hugh Perkins