backpropagation ไล่ระดับสีผ่านการเชื่อมต่อ ResNet


22

ฉันสงสัยเกี่ยวกับวิธีการไล่ระดับสีแบบกระจายกลับผ่านเครือข่ายประสาทโดยใช้โมดูล ResNet / การเชื่อมต่อข้าม ฉันเคยเห็นคำถามสองสามข้อเกี่ยวกับ ResNet (เช่นโครงข่ายประสาทเทียมที่มีการเชื่อมต่อแบบข้ามชั้น ) แต่คำถามนี้ถามเกี่ยวกับการแพร่กระจายของการไล่ระดับสีกลับระหว่างการฝึกอบรมโดยเฉพาะ

สถาปัตยกรรมพื้นฐานอยู่ที่นี่:

ป้อนคำอธิบายรูปภาพที่นี่

ฉันอ่านบทความนี้การศึกษาเครือข่ายที่เหลือเพื่อการจดจำรูปภาพและในส่วนที่ 2 พวกเขาพูดถึงว่าหนึ่งในเป้าหมายของ ResNet คือการอนุญาตเส้นทางที่สั้นลง / ชัดเจนขึ้นสำหรับการไล่ระดับสีเพื่อแพร่กระจายกลับไปยังชั้นฐาน

ทุกคนสามารถอธิบายได้ว่าการไล่ระดับสีไหลผ่านเครือข่ายประเภทนี้อย่างไร ฉันไม่เข้าใจวิธีการดำเนินการเพิ่มและการขาดเลเยอร์ที่มีพารามิเตอร์หลังจากนั้นช่วยให้การแพร่กระจายของการไล่ระดับสีดีขึ้น มันมีบางอย่างเกี่ยวกับวิธีที่การไล่ระดับสีไม่เปลี่ยนแปลงเมื่อไหลผ่านโอเปอเรเตอร์ Add และมีการแจกจ่ายซ้ำโดยไม่มีการคูณ?

นอกจากนี้ฉันสามารถเข้าใจได้ว่าปัญหาการไล่ระดับสีที่หายไปนั้นบรรเทาลงได้อย่างไรหากการไล่ระดับสีไม่จำเป็นต้องไหลผ่านชั้นน้ำหนัก แต่ถ้าไม่มีการไล่ระดับสีแบบไหลผ่านน้ำหนักแล้วพวกเขาจะได้รับการอัปเดตอย่างไร


เป็นเพียงคำถามที่งี่เง่าทำไมเราส่ง x เป็นการข้ามการเชื่อมต่อและไม่คำนวณผกผัน (F (x)) เพื่อให้ได้ x เมื่อสิ้นสุดมันเป็นสาเหตุของความซับซ้อนในการคำนวณหรือไม่
Yash Kumar Atri

ฉันไม่เข้าใจประเด็นthe gradient doesn't need to flow through the weight layersคุณอธิบายได้ไหม
anu

คำตอบ:


13

เพิ่มส่งการไล่ระดับสีกลับอย่างเท่าเทียมกันไปยังอินพุตทั้งสอง คุณสามารถโน้มน้าวใจตัวเองได้โดยทำสิ่งต่อไปนี้ใน tenorflow:

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

เอาท์พุท:

[1.0, 1.0]

ดังนั้นการไล่ระดับสีจะเป็น:

  • ส่งกลับไปยังเลเยอร์ก่อนหน้าไม่เปลี่ยนแปลงผ่านการเชื่อมต่อข้ามชั้นและ
  • ส่งต่อไปยังบล็อกด้วยน้ำหนักและใช้เพื่ออัปเดตน้ำหนักเหล่านั้น

แก้ไข: มีคำถาม: "การดำเนินการ ณ จุดที่การเชื่อมต่อทางหลวงและบล็อกเครือข่ายประสาทเทียมกลับมารวมกันอีกครั้งที่ด้านล่างของรูปที่ 2 คืออะไร"

มีคำตอบคือ: พวกเขารวม คุณสามารถดูได้จากสูตรของรูปที่ 2:

outputF(x)+x

สิ่งนี้บอกว่าเป็น:

  • ค่าในบัส ( )x
  • ถูกเพิ่มเข้าไปในผลลัพธ์ของการส่งค่าบัสผ่านเครือข่ายคือF ( x )xF(x)
  • เพื่อให้ผลลัพธ์จากบล็อกส่วนที่เหลือซึ่งฉันได้ระบุไว้ที่นี่เป็นoutput

แก้ไข 2:

การเขียนซ้ำในคำที่แตกต่างกันเล็กน้อย:

  • ในทิศทางไปข้างหน้าข้อมูลอินพุตจะไหลลงมาที่บัส
    • ที่จุดต่างๆบนรถบัสบล็อกที่เหลือสามารถเรียนรู้วิธีการเพิ่ม / ลบค่าให้กับเวกเตอร์บัส
  • ในทิศทางด้านหลังการไล่ระดับสีจะไหลกลับลงรถบัส
    • การไล่ระดับสีจะอัปเดตบล็อกส่วนที่เหลือที่เคลื่อนที่ผ่านไป
    • บล็อกที่เหลือจะปรับเปลี่ยนการไล่ระดับสีเล็กน้อยเช่นกัน

บล็อกที่เหลือจะปรับเปลี่ยนการไล่ระดับสีย้อนกลับ แต่ไม่มีฟังก์ชั่น 'การบีบ' หรือ 'การเปิดใช้งาน' ที่การไล่ระดับสีจะไหลผ่าน ฟังก์ชั่น 'squashing' / 'activation' เป็นสิ่งที่ทำให้เกิดปัญหาการไล่ระดับสีแบบกระจาย / หายไปดังนั้นการลบสิ่งเหล่านั้นออกจากบัสนั้นทำให้เราลดปัญหานี้ได้อย่างมาก

แก้ไข 3: ส่วนตัวฉันจินตนาการ resnet ในหัวของฉันเป็นแผนภาพต่อไปนี้ มันเป็นทอพอโลยีที่เหมือนกันกับรูปที่ 2 แต่มันแสดงให้เห็นอย่างชัดเจนว่ารถบัสวิ่งผ่านเครือข่ายได้อย่างไรในขณะที่บล็อกส่วนที่เหลือเพียงแตะค่าจากมันและเพิ่ม / ลบเวกเตอร์ขนาดเล็กบางส่วนกับรถบัส:

ป้อนคำอธิบายรูปภาพที่นี่


1
หากการไล่ระดับสียังถูกส่งผ่านบล็อกน้ำหนัก (เช่นเดียวกับในเครือข่ายปกติ) แล้วประโยชน์ของ resnet มาจากที่ไหน? แน่ใจว่ามันช่วยให้การไล่ระดับสีสามารถข้ามไปยังอินพุตพื้นฐานได้โดยตรง แต่วิธีนี้ทำให้ประสิทธิภาพเพิ่มขึ้นเมื่อเส้นทางอื่นยังคงได้รับการฝึกอบรมตามปกติ
Simon

3
ฉันเห็น. ดังนั้นการไล่ระดับสีหนึ่งข้ามผ่านกลับไปที่ x โดยตรงอีกหนึ่งการแพร่กระจายผ่านน้ำหนักกลับไปที่ x พวกเขาได้รับผลรวมเมื่อถึง x เนื่องจาก x มีการแบ่งออกเป็น 2 เส้นทางหรือไม่ ถ้าเป็นเช่นนั้นการไล่ระดับสีจะยังคงเปลี่ยนไปในขณะที่มันเคลื่อนที่กลับผ่านเลเยอร์เหล่านี้หรือไม่
Simon

1
การไล่ระดับสีไหลลงมาจนถึงกองซ้อนไม่เปลี่ยนแปลง อย่างไรก็ตามแต่ละบล็อกมีส่วนช่วยในการเปลี่ยนแปลงการไล่ระดับสีของตัวเองลงในสแต็กหลังจากใช้การอัปเดตน้ำหนักและสร้างชุดการไล่ระดับสีของตัวเอง แต่ละบล็อกมีทั้งอินพุตและเอาต์พุตและการไล่ระดับสีจะไหลออกจากอินพุตกลับสู่ "ไฮเวย์" การไล่ระดับสี
Hugh Perkins

1
@RonakAgrawal เพิ่มการแก้ไขที่แสดงผลรวมของ operatoin จากรูปที่ 2 และอธิบายมัน
Hugh Perkins

1
เพิ่มสองแก้ไข rephrasing คำอธิบายของฉันบิต :)
ฮิวจ์ Perkins
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.