Thứ tự chuẩn hóa hàng loạt và bỏ cuộc?


116

Câu hỏi ban đầu là về triển khai TensorFlow cụ thể. Tuy nhiên, câu trả lời dành cho việc triển khai nói chung. Câu trả lời chung này cũng là câu trả lời chính xác cho TensorFlow.

Khi sử dụng chuẩn hóa hàng loạt và bỏ qua trong TensorFlow (cụ thể là sử dụng Contrib.layers), tôi có cần lo lắng về thứ tự không?

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

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

Cảm ơn bạn rất nhiều!

CẬP NHẬT:

Một thử nghiệm thực nghiệm dường như cho thấy rằng việc đặt hàng ý nghĩa. Tôi đã chạy cùng một mạng hai lần chỉ với định mức hàng loạt và đảo ngược thời gian bỏ học. Khi người bỏ học trước định mức lô, mất xác thực dường như sẽ tăng lên vì mất đào tạo đang giảm 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à đó chỉ là một bài kiểm tra duy nhất. Một câu trả lời dứt khoát và đầy đủ thông tin hơn sẽ vẫn được đánh giá cao.

Câu trả lời:


143

Trong Ioffe and Szegedy 2015 , các tác giả nói 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 ra các kích hoạt với phân phối mong muốn". Vì vậy, Lớp chuẩn hóa hàng loạt thực sự được chèn ngay sau Lớp chuyển đổi / Lớp được kết nối đầy đủ, nhưng trước khi đưa vào kích hoạt ReLu (hoặc bất kỳ loại nào khác). Xem video này vào khoảng thời gian 53 phút để biết thêm chi tiết.

Theo như thời gian bỏ học, tôi tin rằng việc bỏ học được áp dụng sau lớp kích hoạt. Trong giấy bỏ hình 3b, r ma trận nhân tố bỏ học / xác suất (l) cho ẩn layer l được áp dụng cho nó vào y (l), nơi y (l) là kết quả sau khi áp dụng chức năng kích hoạt f.

Vì vậy, tóm lại, thứ tự sử dụng chuẩn hóa hàng loạt và loại bỏ là:

-> CONV / FC -> BatchNorm -> ReLu (hoặc kích hoạt khác) -> Bỏ học -> CONV / FC ->


63
Có vẻ như ngay cả Christian Szegedy bây giờ cũng thích thực hiện BatchNorm sau ReLU (không phải trước nó). Trích lời của F. Chollet, tác giả của Keras: "Tôi chưa quay 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 đoạn mã do Christian viết gần đây sẽ áp dụng relu trước BN. Đôi khi nó vẫn là một chủ đề của cuộc tranh luận, mặc dù. " nguồn
pseudomarvin

3
Còn về việc gộp chung, điều đó sẽ nằm giữa batchnorm và kích hoạt?
wordsforthewise

5
Ngoài ra, có vẻ như độ chính xác có thể cao hơn với BN sau khi kích hoạt: github.com/cvjena/cnn-models/issues/3
wordsforthewise

1
video bị xóa bằng cách nào đó!
blitu12345

10
Bài báo này cho thấy rằng thông thường bỏ cuộc với BN dẫn đến kết quả tồi tệ hơn trừ khi thực hiện một số biện pháp điều trị để tránh nguy cơ thay đổi phương sai.
Haramoz

37

Như đã lưu ý trong các bình luận, một tài nguyên tuyệt vời để đọc theo thứ tự của các lớp là ở đây . Tôi đã xem qua các nhận xét và đó là tài nguyên tốt nhất về chủ đề mà tôi tìm thấy trên internet

2 xu của tôi:

Bỏ học có nghĩa là chặn hoàn toàn thông tin từ một số tế bào thần kinh nhất định để đảm bảo rằng các tế bào thần kinh không cùng thích ứng. Vì vậy, quá trình chuẩn hóa hàng loạt phải được thực hiện sau khi bỏ qua nếu không bạn đang chuyển thông tin qua thống kê chuẩn hóa.

Nếu bạn nghĩ về nó, trong các vấn đề ML điển hình, đây là lý do chúng tôi không tính giá trị trung bình và độ lệch chuẩn trên toàn bộ dữ liệu và sau đó chia nó thành các tập huấn luyện, kiểm tra và xác nhận. Chúng tôi chia nhỏ và sau đó tính toán số liệu thống kê trên tập hợp đoàn tàu và sử dụng chúng để chuẩn hóa và căn giữa các bộ dữ liệu xác thực và kiểm tra

vì vậy tôi đề xuất Đề án 1 (Điều này có xem xét nhận xét của pseudomarvin về câu trả lời được chấp nhận)

-> CONV / FC -> ReLu (hoặc kích hoạt khác) -> Bỏ học -> BatchNorm -> CONV / FC

trái ngược với Đề án 2

-> CONV / FC -> BatchNorm -> ReLu (hoặc kích hoạt khác) -> Bỏ học -> CONV / FC -> trong câu trả lời được chấp nhận

Xin lưu ý rằng điều này có nghĩa là mạng trong Sơ đồ 2 sẽ hiển thị quá phù hợp so với mạng trong Sơ đồ 1 nhưng OP đã chạy một số thử nghiệm như đã đề cập trong câu hỏi và chúng hỗ trợ Sơ đồ 2


Thảo luận reddit có liên quan về vị trí BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
Nhưng điều này sẽ không làm sai số liệu thống kê BN của bạn vì bạn sẽ tính toán chúng sau khi áp dụng tình trạng bỏ cuộc, điều này sẽ không xảy ra tại thời điểm thử nghiệm?
ZakJ

@ZakJ Tôi đoán là không. Vì chúng tôi tính BN trên mỗi đơn vị (cho từng tính năng bên trong) và hơn thế nữa, nó được chia tỷ lệ để bù đắp cho số người bỏ học.
zeal

@ZakJ là chính xác. Xem câu trả lời của mohammed adel và bài báo này tại đây: arxiv.org/pdf/1801.05134.pdf . Trên thực tế, các lớp Chuẩn hóa hàng loạt học cách chống lại sự thay đổi hiệp biến trong dữ liệu không còn tồn tại khi Bỏ qua bị tắt tại thời điểm thử nghiệm.
skeller88

@ skeller88 Tôi không đọc bài báo. Trên đầu tôi nghĩ rằng nếu bạn có BN trước khi bỏ học thì điều đó về cơ bản củng cố mục đích của lớp BN vì chức năng của BN là cung cấp dữ liệu chuẩn hóa cho lớp tiếp theo.
MiloMinderbinder

12

Thông thường, chỉ cần thả Dropout(khi bạn có BN):

  • "BN loại bỏ sự cần thiết Dropouttrong một số trường hợp vì BN cung cấp các lợi ích về quy định tương tự như Dropout bằng trực giác"
  • "Các kiến ​​trúc như ResNet, DenseNet, v.v. không sử dụng Dropout

Để biết thêm chi tiết, hãy tham khảo bài báo này [ Hiểu sự bất đồng giữa việc bỏ học và chuẩn hóa hàng loạt bằng cách thay đổi phương sai ] như đã được đề cập bởi @Haramoz trong các nhận xét.


những gì về MLPs là nó hữu ích để kết hợp chúng.
DINA TAKLIT

1
@DINATAKLIT Khi bạn thực sự không có đủ dữ liệu đào tạo, theo tôi, CÓ.
xtluo

@xtulo bạn có nghĩa là công việc này hoạt động khi họ là một dữ liệu nhỏ? giống như nếu tôi đã đọc rằng Chuẩn hóa hàng loạt hoạt động tốt hơn với các bộ dữ liệu lớn! Tôi hơi bối rối:!
DINA TAKLIT

1
@DINATAKLIT Trong nhận xét trước của bạn what about MLPs is it useful to combine them, ý bạn có phải là như Is it useful to combine Dropout and BN when using MLPsvậy không? Cảm nhận của tôi về điều này là nó chủ yếu phụ thuộc vào kích thước mô hình của bạn và số lượng dữ liệu đào tạo bạn có.
xtluo

@xtulo vâng Ý tôi là việc kết hợp Droupout và BN có hữu ích không, vâng, tôi đồng ý với câu trả lời cuối cùng của bạn.
DINA TAKLIT

6

Tôi đã tìm thấy một bài báo giải thích sự bất hòa giữa Dropout và Batch Norm (BN). Ý tưởng chính là cái mà họ gọi là "sự thay đổi phương sai" . Điều này là do người bỏ học có hành vi khác nhau giữa giai đoạn đào tạo và thử nghiệm, điều này làm thay đổi số liệu thống kê đầu vào mà BN học được. Ý tưởng chính có thể được tìm thấy trong hình này được lấy từ bài báo này . nhập mô tả hình ảnh ở đây

Có thể tìm thấy một bản demo nhỏ cho hiệu ứng này trong sổ tay này .


3
Làm thế nào để trả lời câu hỏi này?
nbubis

1
Bài báo cung cấp 2 chiến lược tiềm năng: - Chỉ áp dụng Dropout (chỉ) sau tất cả các lớp BN - Thay đổi Dropout thành một hình thức ổn định hơn
user3641187

@nbubis Tôi nghĩ nó trả lời gián tiếp. Có vẻ như đề nghị không sử dụng chúng cùng nhau ("giải thích sự bất hòa giữa Dropout và Batch Norm (BN)").
NelsonGon

3

Dựa trên tài liệu nghiên cứu để có hiệu suất tốt hơn, chúng ta nên sử dụng BN trước khi áp dụng Dropouts


Câu trả lời không giải quyết toàn bộ ngăn xếp, được hỏi trong câu hỏi.
salehinejad

2

Thứ tự đúng là: Chuyển đổi> Chuẩn hóa> Kích hoạt> Bỏ qua> Tổng hợp


2

Chuyển đổi - Kích hoạt - DropOut - BatchNorm - Pool -> Test_loss: 0.04261355847120285

Chuyển đổi - Kích hoạt - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396

Chuyển đổi - Kích hoạt - BatchNorm - Pool - DropOut -> Test_loss: 0.04911309853196144

Chuyển đổi - Kích hoạt - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Chuyển đổi - BatchNorm - Kích hoạt - DropOut - Pool -> Test_loss: 0.038886815309524536

Chuyển đổi - BatchNorm - Kích hoạt - Pool - DropOut -> Test_loss: 0.04126095026731491

Chuyển đổi - BatchNorm - DropOut - Kích hoạt - Pool -> Test_loss: 0,05142546817660332

Chuyển đổi - DropOut - Kích hoạt - BatchNorm - Pool -> Test_loss: 0.04827788099646568

Chuyển đổi - DropOut - Kích hoạt - Pool - BatchNorm -> Test_loss: 0.04722036048769951

Chuyển đổi - DropOut - BatchNorm - Kích hoạt - Pool -> Test_loss: 0.03238215297460556


Được đào tạo về tập dữ liệu MNIST (20 kỷ nguyên) với 2 mô-đun tích hợp (xem bên dưới), theo sau mỗi lần với

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

Các lớp Convolutions có kích thước hạt nhân (3,3), đệm mặc định, kích hoạt là elu. Pooling là một MaxPooling bên hồ bơi (2,2). Mất mát là categorical_crossentropyvà tối ưu hóa là adam.

Xác suất Bỏ học tương ứng là 0.2hoặc 0.3, tương ứng. Số lượng bản đồ đối tượng tương ứng là 32hoặc 64.

Chỉnh sửa: Khi tôi bỏ Dropout, như được khuyến nghị trong một số câu trả lời, nó hội tụ nhanh hơn nhưng có khả năng tổng quát hóa kém hơn so với khi tôi sử dụng BatchNorm Dropout.


Vì bản chất ngẫu nhiên của NN, chỉ chơi với một lần đào tạo là không đủ. Khi bạn thực hiện khoảng 100 bài tập và lấy điểm trung bình - kết quả sẽ chính xác hơn.
GensaGames

0

ConV / FC - BN - Sigmoid / tanh - bỏ học. Nếu chức năng kích hoạt là Relu hoặc cách khác, thứ tự chuẩn hóa và bỏ qua tùy thuộc vào nhiệm vụ của bạn


0

Tôi đã đọc các bài được đề xuất trong câu trả lời và nhận xét từ https://stackoverflow.com/a/40295999/8625228

Theo quan điểm của Ioffe và Szegedy (2015), chỉ sử dụng BN trong cấu trúc mạng. Li và cộng sự. (2018) đưa ra các phân tích thống kê và thử nghiệm, rằng có sự thay đổi phương sai khi các học viên sử dụng Dropout trước BN. Do đó, Li et al. (2018) khuyên bạn nên áp dụng Dropout sau tất cả các lớp BN.

Theo quan điểm của Ioffe và Szegedy (2015), BN nằm bên trong / trước chức năng kích hoạt. Tuy nhiên, Chen et al. (2019) sử dụng một lớp vi mạch kết hợp giữa người bỏ học và BN, và Chen et al. (2019) khuyến nghị sử dụng BN sau ReLU.

Về nền tảng an toàn, tôi chỉ sử dụng Dropout hoặc BN trong mạng.

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao và Shengyu Zhang. 2019. “Suy nghĩ lại việc sử dụng Bình thường hóa hàng loạt và Bỏ học trong Đào tạo Mạng Neural Sâu.” CoRR abs / 1905.05928. http://arxiv.org/abs/1905.05928 .

Ioffe, Sergey và Christian Szegedy. 2015. “Chuẩn hóa hàng loạt: Tăng tốc đào tạo mạng sâu bằng cách giảm sự thay đổi hiệp biến nội bộ.” CoRR abs / 1502.03167. http://arxiv.org/abs/1502.03167 .

Li, Xiang, Shuo Chen, Xiaolin Hu và Jian Yang. 2018. “Hiểu được sự bất hòa giữa việc bỏ học và chuẩn hóa hàng loạt bằng Variance Shift.” CoRR abs / 1801.05134. http://arxiv.org/abs/1801.05134 .

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.