Làm thế nào để backpropagation hoạt động thông qua lớp Max Pooling khi thực hiện một đợt?


10

Giả sử rằng chúng tôi đang sử dụng cỡ lô 100 mẫu để học.

Vì vậy, trong mỗi lô, trọng lượng của mọi nơ-ron (và sai lệch, v.v.) đang được cập nhật bằng cách thêm vào tỷ lệ trừ của tỷ lệ học * giá trị lỗi trung bình mà chúng tôi đã tìm thấy bằng cách sử dụng 100 mẫu * đạo hàm của hàm lỗi đối với trọng lượng tế bào thần kinh hiện tại đang được cập nhật.

Bây giờ, khi chúng ta sử dụng lớp Max Pool, làm thế nào chúng ta có thể tính đạo hàm trên lớp này? Trong mỗi mẫu mà chúng tôi chuyển tiếp, một pixel khác nhau (giả sử) được chọn là tối đa, vì vậy khi chúng tôi sao lưu hơn 100 mẫu trong đó mỗi khi chọn một đường dẫn khác nhau, chúng tôi có thể làm như thế nào? Một giải pháp tôi có trong đầu là ghi nhớ mọi pixel được chọn là mức tối đa và sau đó có thể phân tách đạo hàm trên tất cả các pixel tối đa. Đây có phải là những gì đang được thực hiện?


Tôi có cùng một câu hỏi. khi HA chỉ có một mẫu, thì rõ ràng chỉ có đạo hàm của phần tử lớn nhất không bằng 0, nhưng khi HA với các mẫu theo lô, mẫu khác nhau có thể gây ra vị trí khác nhau của phần tử lớn nhất, chúng ta có thể tính đạo hàm trung bình của từng tham số như bình thường không thêm ∂L / ∂wi của mỗi mẫu và chia cho cỡ lô)?
Shaotao Li

Câu trả lời:


8

Khi một mạng thần kinh xử lý một lô, tất cả các giá trị kích hoạt cho mỗi lớp được tính cho từng ví dụ (có thể song song trên mỗi ví dụ nếu thư viện và phần cứng hỗ trợ nó). Các giá trị đó được lưu trữ để sử dụng sau này - tức là một giá trị cho mỗi lần kích hoạt cho mỗi ví dụ trong lô, chúng không được tổng hợp theo bất kỳ cách nào

Trong quá trình lan truyền ngược, các giá trị kích hoạt đó được sử dụng như một trong những nguồn số để tính toán độ dốc, cùng với độ dốc được tính cho đến nay hoạt động ngược và trọng số kết nối. Giống như lan truyền về phía trước, lan truyền ngược được áp dụng cho mỗi ví dụ, nó không hoạt động với các giá trị trung bình hoặc tổng. Chỉ khi tất cả các ví dụ đã được xử lý, bạn mới làm việc với các gradient tổng hoặc trung bình cho lô.

Điều này áp dụng như nhau cho các lớp pool tối đa. Không chỉ làm bạn biết những gì đầu ra từ lớp tổng hợp cho mỗi ví dụ trong hàng loạt là gì, nhưng bạn có thể nhìn vào lớp trước và xác định đầu vào đến hồ bơi là mức tối đa.

Về mặt toán học và tránh sự cần thiết phải xác định các chỉ số cho các lớp NN và tế bào thần kinh, quy tắc có thể được thể hiện như thế này

  • Hàm chuyển tiếp làm=max(a,b)

  • Chúng tôi biết cho một số chức năng đích J (trong mạng thần kinh sẽ là chức năng mất mà chúng tôi muốn giảm thiểu và chúng tôi giả định rằng chúng tôi đã sao lưu vào thời điểm này)Jm

  • Chúng tôi muốn biết vàJJaJb

  • Nếua>b

    • Tại địa phương , * . Vì vậyJm=aJa=Jm

    • Tại địa phương , * không phụ thuộc vào . Vậyb JmbJb=0

  • Do đó nếu , một>bJJa=Jma>bJa=0

  • và nếu , b>mộtJJb=Jmb>aJb=0

Khi lan truyền ngược đi qua một lớp gộp tối đa, độ dốc được xử lý trên mỗi ví dụ và chỉ được gán cho đầu vào từ lớp trước đó là mức tối đa. Các đầu vào khác có độ dốc bằng không. Khi điều này được bó, nó không khác nhau, nó chỉ được xử lý cho mỗi ví dụ, có thể song song. Trên toàn bộ một lô, điều này có thể có nghĩa là nhiều hơn một, có thể là tất cả các kích hoạt đầu vào cho nhóm tối đa nhận được một số phần của gradient - mỗi phần từ một tập hợp con khác nhau của các ví dụ trong lô.


* Tại địa phương -> khi chỉ thực hiện các thay đổi vô hạn đối với .m

** Về mặt kỹ thuật, nếu chính xác thì chúng ta có sự gián đoạn, nhưng trong thực tế, chúng ta có thể bỏ qua điều đó mà không gặp vấn đề gì khi đào tạo một mạng lưới thần kinh.a=b


3
Không chắc tôi hiểu bạn. Những gì bạn đang nói hoạt động khi bạn backprop sau một lần đẩy về phía trước. Nhưng khi bạn có một lô, bạn chống đỡ 100 mẫu, để tính hàm lỗi trung bình. Toàn bộ điểm của một đợt là có thể tạo ra độ dốc chính xác hơn, và sau đó bạn chỉ thực hiện một lần backprop dựa trên đạo hàm của hàm lỗi đối với W, với giá trị lỗi trung bình được tìm thấy nhân với tốc độ học. Vì vậy, vẫn chưa rõ làm thế nào bạn tính đạo hàm của hàm max, khi mỗi lần một nút khác nhau được chọn là cực đại. Tôi đang thiếu gì?
Nadav B

4
@NadavB: Bạn đang thiếu chuỗi sự kiện. 1) Lô được tính chuyển tiếp, từng mục. 2) Lô được backpropagated, từng mục. 3) Lấy trung bình cho độ dốc. 4) Áp dụng một bước giảm dần độ dốc (có thể được sửa đổi bởi một cái gì đó như Adagrad hoặc RMSProp). Vì vậy, bạn đang đặt bước 3 ra khỏi chuỗi và tự hỏi làm thế nào để giải nén các gradient trung bình trên lớp nhóm tối đa - nhưng bạn không bao giờ phải làm điều này, bởi vì bạn sao lưu từng ví dụ riêng lẻ - bạn chỉ tổng hợp kết quả cho lô sau đó
Neil Slater

1
Hoàn hảo. Bạn đã làm cho nó rõ ràng bây giờ.
Nadav B

@NeilSlater Có phải backpropagation chỉ được thực hiện theo từng mục bởi vì nó cần thiết cho lớp pool tối đa? Trong một MLP trước tiên tính trung bình sai số của toàn bộ lô và sau đó tính toán độ dốc trên sai số trung bình đó giống hệt với việc tính toán độ dốc cho mỗi mục và sau đó điều chỉnh các tham số theo tỷ lệ học tập trung bình *, phải không? Tuy nhiên, backpropagating lỗi trung bình nhanh hơn nhiều so với backpropagating tất cả các lỗi riêng lẻ và sau đó áp dụng các bản cập nhật. Vì vậy, khi có thể bạn sẽ muốn làm điều đó như thế này và chỉ mỗi mục nếu cần ... như đối với nhóm tối đa. Có đúng không?
lo tolmencre

@lotolmencre Bạn đã sai khi tính sai số trung bình trên một đợt. Bạn nên quay lại tuyên truyền riêng lẻ, sau đó tính tổng độ dốc ở cuối. Các tính toán độ dốc sẽ không hoạt động chính xác nếu không thông qua bất kỳ phi tuyến. Nếu bạn muốn biết thêm về điều đó, xin vui lòng đặt câu hỏi mới
Neil Slater

2

Tôi có cùng một câu hỏi, nhưng tôi có thể tìm ra nó bằng cách xem lại mã nguồn của Caffe.

Vui lòng xem mã nguồn của Caffe:

dòng 620 & 631 của mã này .

Nó tính toán đạo hàm của từng tham số bằng cách thêm đạo hàm (của tham số này) của từng đầu vào sau đó chia cho kích thước lô.

Cũng xem dòng 137 của mã này , nó chỉ đơn giản chia tỷ lệ đạo hàm thành 1 / iter_size, giống như mức trung bình.

Chúng ta có thể thấy KHÔNG có cách xử lý đặc biệt nào đối với lớp Max Pooling khi HA.

Đối với phái sinh của Max Pooling, chúng ta hãy xem lại mã nguồn của Caffe:

dòng 272 của mã này . Rõ ràng, chỉ có đạo hàm của phần tử lớn nhất là 1*top_diff, đạo hàm của người khác là 0*top_diff.

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.