Gradient backpropagation thông qua các kết nối bỏ qua ResNet


22

Tôi tò mò về cách độ dốc được truyền ngược qua mạng thần kinh bằng cách sử dụng các mô đun ResNet / bỏ qua các kết nối. Tôi đã thấy một vài câu hỏi về ResNet (ví dụ: Mạng thần kinh có kết nối lớp bỏ qua ) nhưng câu hỏi này được hỏi cụ thể về việc truyền ngược lại độ dốc trong quá trình đào tạo.

Kiến trúc cơ bản là đây:

nhập mô tả hình ảnh ở đây

Tôi đã đọc bài báo này, Nghiên cứu về mạng dư để nhận dạng hình ảnh và trong Phần 2, họ nói về cách một trong những mục tiêu của ResNet là cho phép đường dẫn ngắn hơn / rõ ràng hơn để gradient lan truyền trở lại lớp cơ sở.

Bất cứ ai có thể giải thích làm thế nào gradient đang chảy qua loại mạng này? Tôi hoàn toàn không hiểu cách thức hoạt động bổ sung và thiếu lớp tham số hóa sau khi bổ sung, cho phép lan truyền gradient tốt hơn. Nó có liên quan gì đến việc độ dốc không thay đổi khi chảy qua toán tử add và bằng cách nào đó được phân phối lại mà không cần nhân?

Hơn nữa, tôi có thể hiểu làm thế nào vấn đề độ dốc biến mất được giảm bớt nếu độ dốc không cần phải chảy qua các lớp trọng lượng, nhưng nếu không có độ dốc chảy qua các trọng số thì làm thế nào để chúng được cập nhật sau khi vượt qua?


Chỉ là một câu hỏi ngu ngốc, Tại sao chúng ta vượt qua x dưới dạng bỏ qua kết nối và không tính toán nghịch đảo (F (x)) để có x ở cuối. Nó có phải là nguyên nhân của sự phức tạp tính toán không?
Yash Kumar Atri

Tôi đã không nhận được quan điểm của bạn the gradient doesn't need to flow through the weight layers, bạn có thể giải thích điều đó?
anu

Câu trả lời:


13

Thêm gửi gradient trở lại bằng nhau cho cả hai đầu vào. Bạn có thể thuyết phục bản thân về điều này bằng cách chạy các dòng sau trong dòng chảy:

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

Đầu ra:

[1.0, 1.0]

Vì vậy, độ dốc sẽ là:

  • chuyển trở lại các lớp trước, không thay đổi, thông qua kết nối bỏ qua lớp, và cũng
  • được chuyển đến khối có trọng số và được sử dụng để cập nhật các trọng số đó

Chỉnh sửa: có một câu hỏi: "hoạt động tại điểm kết nối đường cao tốc và khối mạng lưới thần kinh liên kết lại với nhau, ở dưới cùng của Hình 2 là gì?"

Có câu trả lời là: chúng được tóm tắt. Bạn có thể thấy điều này từ công thức của Hình 2:

outputF(x)+x

Điều này nói lên rằng:

  • x
  • xF(x)
  • output

Chỉnh sửa 2:

Viết lại bằng những từ hơi khác nhau:

  • theo hướng chuyển tiếp, dữ liệu đầu vào chảy xuống xe buýt
    • tại các điểm dọc theo xe buýt, các khối dư có thể học cách thêm / xóa các giá trị vào vectơ bus
  • theo hướng ngược lại, độ dốc chảy ngược xuống xe buýt
    • Trên đường đi, các gradient cập nhật các khối còn lại mà chúng di chuyển qua
    • các khối dư sẽ tự sửa đổi độ dốc một chút

Các khối còn lại sẽ sửa đổi các gradient chảy ngược, nhưng không có chức năng 'băm' hoặc 'kích hoạt' mà các gradient chuyển qua. Các chức năng 'đè bẹp' / 'kích hoạt' là nguyên nhân gây ra sự cố nổ / biến mất độ dốc, do đó, bằng cách loại bỏ các chức năng khỏi chính xe buýt, chúng tôi giảm thiểu đáng kể vấn đề này.

Chỉnh sửa 3: Cá nhân tôi tưởng tượng một mạng lưới lại trong đầu như sơ đồ sau. Cấu trúc liên kết của nó giống hệt hình 2, nhưng có thể thấy rõ hơn có lẽ cách xe buýt chạy thẳng qua mạng, trong khi các khối còn lại chỉ chạm vào các giá trị từ nó và thêm / xóa một số vectơ nhỏ so với bus:

nhập mô tả hình ảnh ở đây


1
nếu gradient cũng được chuyển qua các khối trọng lượng (giống như trong các mạng thông thường) thì lợi ích của resnet đến từ đâu? chắc chắn, nó cho phép gradient bỏ qua trực tiếp đến đầu vào cơ sở nhưng làm thế nào để tăng hiệu suất khi đường dẫn khác vẫn được đào tạo như bình thường?
Simon

3
Tôi hiểu rồi. Vì vậy, một gradient được chuyển thẳng trở lại x, các gradient khác truyền qua các trọng số trở lại x. họ có bị tóm gọn khi đạt x do x đã chia thành 2 đường dẫn không? nếu vậy, không phải gradient vẫn thay đổi khi nó di chuyển trở lại qua các lớp này sao?
Simon

1
Độ dốc chảy tất cả xuống ngăn xếp, không thay đổi. Tuy nhiên, mỗi khối đóng góp thay đổi độ dốc của riêng nó vào ngăn xếp, sau khi áp dụng các cập nhật trọng số của nó và tạo ra các gradient riêng của nó. Mỗi khối có cả đầu vào và đầu ra, và độ dốc sẽ chảy ra khỏi đầu vào, trở lại độ dốc "đường cao tốc".
Hugh Perkins

1
@RonakAgrawal đã thêm một chỉnh sửa hiển thị tổng operatoin từ Hình 2 và giải thích nó
Hugh Perkins

1
đã thêm một chỉnh sửa thứ hai nhắc lại lời giải thích của tôi một chút :)
Hugh Perkins
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.