2016-09-25 49 views
29

Khi sử dụng bình thường hóa hàng loạt và bỏ học trong TensorFlow (đặc biệt là sử dụng contrib.layers) tôi có cần phải lo lắng về việc đặt hàng?Đặt hàng chuẩn hóa và thả hàng loạt trong TensorFlow?

Có vẻ như có thể nếu tôi sử dụng bỏ học theo ngay lập tức bằng cách chuẩn hóa hàng loạt có thể có vấn đề. Ví dụ, nếu sự dịch chuyển chuẩn hóa lô thành các con số quy mô lớn hơn của kết quả đào tạo, nhưng sau đó thay đổi tương tự sẽ được áp dụng cho các số tỷ lệ nhỏ hơn (nếu có nhiều đầu ra hơn) mà không bị bỏ học trong quá trình thử nghiệm, sự thay đổi có thể bị tắt. Lớp chuẩn hóa hàng loạt TensorFlow có tự động bù cho điều này không? Hay điều này không xảy ra vì một lý do nào đó tôi bị thiếu?

Ngoài ra, có những cạm bẫy nào khác để tìm kiếm khi sử dụng hai cái này cùng nhau không? Ví dụ: giả sử tôi đang sử dụng chúng theo đúng thứ tự liên quan đến việc nêu trên (giả sử có đúng thứ tự), có thể gặp sự cố khi sử dụng cả chuẩn hóa hàng loạt và bỏ học trên nhiều lớp liên tiếp? Tôi không ngay lập tức thấy một vấn đề với điều đó, nhưng tôi có thể thiếu một cái gì đó.

Cảm ơn bạn nhiều!

UPDATE:

Một bài kiểm tra thực nghiệm dường như để gợi ý rằng lệnh không vấn đề. Tôi chạy cùng một mạng hai lần chỉ với tiêu chuẩn lô và bỏ học ngược lại. Khi bỏ học là trước khi các định mức hàng loạt, mất xác nhận có vẻ là đi lên như mất đào tạo là đi xuống. Cả hai đều đi xuống trong trường hợp khác. Nhưng trong trường hợp của tôi các chuyển động chậm, vì vậy mọi thứ có thể thay đổi sau khi tập luyện nhiều hơn và nó chỉ là một thử nghiệm duy nhất. Một câu trả lời dứt khoát và thông tin hơn sẽ vẫn được đánh giá cao.

Trả lời

32

Trong Ioffe and Szegedy 2015, các tác giả tuyên bố rằng "chúng tôi muốn đảm bảo rằng đối với bất kỳ giá trị tham số nào, mạng luôn tạo các kích hoạt với phân phối mong muốn". Vì vậy, các Batch Normalization Layer thực sự được chèn ngay sau một lớp Conv Layer/Fully Connected Layer, nhưng trước khi đưa vào ReLu (hoặc bất kỳ loại nào khác) kích hoạt. Xem this video vào khoảng thời gian 53 phút để biết thêm chi tiết.

Theo như thả bỏ, tôi tin rằng bỏ học được áp dụng sau khi lớp kích hoạt. Trong hình 1b3b, ma trận xác suất/ma trận xác suất r (l) cho lớp ẩn l được áp dụng cho nó trên y (l), trong đó y (l) là kết quả sau khi áp dụng hàm kích hoạt f.

Như vậy tóm lại thì trình tự của việc sử dụng bình thường lô và bỏ học là:

-> CONV/FC -> BatchNorm -> ReLu (hay kích hoạt khác) -> Dropout -> CONV/FC ->

+5

Có vẻ như ngay cả Christian Szegedy giờ cũng thích biểu diễn BatchNorm _after_ ReLU (không phải trước đó). Trích dẫn của F. Chollet, tác giả của Keras: "Tôi đã không quay trở lại để kiểm tra những gì họ đang đề xuất trong bài báo gốc của họ, nhưng tôi có thể đảm bảo rằng mã gần đây được viết bởi Christian áp dụng relu trước BN. Nó vẫn thỉnh thoảng là một chủ đề của cuộc tranh luận, mặc dù. " [nguồn] (https://github.com/fchollet/keras/issues/1802#issuecomment-187966878) – pseudomarvin

+0

Từ cùng một chuỗi như @pseudomarvin cung cấp, dưới đây là một số kết quả từ việc đặt Batch Normalization trước và sau ReLU. Những kết quả này thấy rằng * sau * ReLU tốt hơn: [kết quả] (https://github.com/ducha-aiki/caffenet-benchmark/blob/master/batchnorm.md#bn----before-or-after -relu) – golmschenk

+0

Điều gì về tổng hợp, điều đó sẽ đi vào giữa batchnorm và kích hoạt? – wordsforthewise

Các vấn đề liên quan