การสั่งซื้อชุดงานปกติและการออกกลางคัน?


118

คำถามเดิมนั้นเกี่ยวกับการใช้งาน TensorFlow โดยเฉพาะ อย่างไรก็ตามคำตอบสำหรับการใช้งานโดยทั่วไป คำตอบทั่วไปนี้เป็นคำตอบที่ถูกต้องสำหรับ TensorFlow

เมื่อใช้ batch normalization และ dropout ใน TensorFlow (โดยเฉพาะการใช้ Contrib.layers) ฉันต้องกังวลเกี่ยวกับการสั่งซื้อหรือไม่

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

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

ขอบคุณมาก!

อัพเดท:

การทดสอบการทดลองดูเหมือนจะชี้ให้เห็นว่าการสั่งซื้อไม่ว่า ฉันรันเครือข่ายเดียวกันสองครั้งโดยมีเพียงบรรทัดฐานแบทช์และย้อนกลับกลางคัน เมื่อการออกกลางคันอยู่ก่อนบรรทัดฐานของแบทช์การสูญเสียการตรวจสอบความถูกต้องดูเหมือนจะเพิ่มขึ้นเนื่องจากการสูญเสียการฝึกกำลังจะลดลง พวกเขาทั้งสองจะลดลงในอีกกรณีหนึ่ง แต่ในกรณีของฉันการเคลื่อนไหวช้าดังนั้นสิ่งต่างๆอาจเปลี่ยนไปหลังจากการฝึกฝนมากขึ้นและเป็นการทดสอบเพียงครั้งเดียว คำตอบที่ชัดเจนและมีข้อมูลมากขึ้นจะยังคงได้รับการชื่นชม

คำตอบ:


143

ในงานIoffe and Szegedy 2015ผู้เขียนระบุว่า "เราต้องการให้แน่ใจว่าสำหรับค่าพารามิเตอร์ใด ๆ เครือข่ายจะสร้างการเปิดใช้งานด้วยการแจกแจงที่ต้องการเสมอ" ดังนั้น Batch Normalization Layer จึงถูกแทรกทันทีหลังจาก Conv Layer / Fully Connected Layer แต่ก่อนที่จะป้อนเข้าสู่การเปิดใช้งาน ReLu (หรือชนิดอื่น ๆ ) ดูวิดีโอนี้เวลาประมาณ 53 นาทีสำหรับรายละเอียดเพิ่มเติม

ฉันเชื่อว่าการออกกลางคันจะถูกนำไปใช้หลังจากเลเยอร์การเปิดใช้งาน ในรูปกระดาษกลางคัน 3b เมทริกซ์การออกกลางคัน / เมทริกซ์ความน่าจะเป็น r (l) สำหรับเลเยอร์ที่ซ่อนอยู่ l ถูกนำไปใช้กับ y (l) โดยที่ y (l) เป็นผลลัพธ์หลังจากใช้ฟังก์ชันการเปิดใช้งาน f

ดังนั้นโดยสรุปลำดับของการใช้ batch normalization และ dropout คือ:

-> CONV / FC -> BatchNorm -> ReLu (หรือการเปิดใช้งานอื่น ๆ ) -> กลางคัน -> CONV / FC ->


63
ดูเหมือนว่าตอนนี้ Christian Szegedy จะชอบแสดง BatchNorm หลังจาก ReLU (ไม่ใช่ก่อนหน้านี้) คำกล่าวของ F.Chollet ผู้เขียน Keras: "ฉันไม่ได้กลับไปตรวจสอบสิ่งที่พวกเขาแนะนำในเอกสารต้นฉบับของพวกเขา แต่ฉันสามารถรับประกันได้ว่าโค้ดล่าสุดที่เขียนโดย Christian ใช้ relu ก่อน BN มันยังคงเป็นหัวข้อในบางครั้ง ของการถกเถียงกัน " ที่มา
pseudomarvin

3
สิ่งที่เกี่ยวกับการรวมกันนั้นจะอยู่ระหว่าง batchnorm และการเปิดใช้งานหรือไม่?
พูดต่อไป

5
นอกจากนี้ดูเหมือน
ว่าความ

1
วิดีโอถูกลบไปแล้ว!
blitu12345

10
บทความนี้แสดงให้เห็นว่าโดยปกติแล้วการเลิกใช้ BN จะนำไปสู่ผลลัพธ์ที่แย่กว่าเว้นแต่จะมีการปรับสภาพบางอย่างเพื่อหลีกเลี่ยงความเสี่ยงของการเปลี่ยนแปลงความแปรปรวน
Haramoz

37

ตามที่ระบุไว้ในความคิดเห็นที่เป็นทรัพยากรที่น่าตื่นตาตื่นใจที่จะอ่านข้อมูลเกี่ยวกับคำสั่งของชั้นคือที่นี่ ฉันได้อ่านความคิดเห็นและเป็นแหล่งข้อมูลที่ดีที่สุดในหัวข้อที่ฉันพบบนอินเทอร์เน็ต

2 เซ็นต์ของฉัน:

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

หากคุณคิดเกี่ยวกับเรื่องนี้ในปัญหา ML ทั่วไปนี่คือเหตุผลที่เราไม่คำนวณค่าเฉลี่ยและส่วนเบี่ยงเบนมาตรฐานของข้อมูลทั้งหมดแล้วแยกเป็นชุดฝึกอบรมการทดสอบและการตรวจสอบความถูกต้อง เราแยกและคำนวณสถิติจากชุดรถไฟและใช้เพื่อทำให้เป็นมาตรฐานและจัดกึ่งกลางการตรวจสอบความถูกต้องและชุดข้อมูลการทดสอบ

ดังนั้นฉันขอแนะนำ Scheme 1 (สิ่งนี้ใช้ความคิดเห็นของ pseudomarvinเกี่ยวกับคำตอบที่ได้รับการยอมรับในการพิจารณา)

-> CONV / FC -> ReLu (หรือการเปิดใช้งานอื่น ๆ ) -> Dropout -> BatchNorm -> CONV / FC

ตรงข้ามกับโครงการ 2

-> CONV / FC -> BatchNorm -> ReLu (หรือการเปิดใช้งานอื่น ๆ ) -> Dropout -> CONV / FC -> ในคำตอบที่ยอมรับ

โปรดทราบว่านั่นหมายความว่าเครือข่ายภายใต้ Scheme 2 ควรแสดงมากเกินไปเมื่อเทียบกับเครือข่ายภายใต้ Scheme 1 แต่ OP ทำการทดสอบบางอย่างตามที่กล่าวไว้ในคำถามและรองรับ Scheme 2


การสนทนา reddit ที่เกี่ยวข้องในการจัดวาง BatchNorm: reddit.com/r/MachineLearning/comments/67gonq/…
saetch_g

3
แต่สิ่งนี้จะไม่ทำให้สถิติ BN ของคุณเสียหายเนื่องจากคุณจะคำนวณหลังจากที่ใช้การออกกลางคันซึ่งจะไม่เป็นเช่นนั้นในเวลาทดสอบ?
ZakJ

@ZakJ เดาไม่ถูก เนื่องจากเราคำนวณ BN ต่อหน่วย (สำหรับคุณลักษณะภายในแต่ละรายการ) และยิ่งไปกว่านั้นยังมีการปรับขนาดเพื่อชดเชยการออกกลางคัน
ความกระตือรือร้น

@ZakJ ถูกต้อง. ดูคำตอบของโมฮัมเหม็ adel และกระดาษที่นี่: arxiv.org/pdf/1801.05134.pdf มีผลบังคับใช้เลเยอร์ Normalization Batch จะเรียนรู้ที่จะต่อต้านการเปลี่ยนแปลงของความแปรปรวนร่วมในข้อมูลที่ไม่มีอยู่อีกต่อไปเมื่อปิด Dropout ในเวลาทดสอบ
skeller88

@ skeller88 ฉันยังไม่ได้อ่านบทความนี้ ในหัวของฉันฉันคิดว่าถ้าคุณมี BN ก่อนที่จะออกกลางคันนั่นก็เป็นการสกรูเจตนาของเลเยอร์ BN เนื่องจากหน้าที่ของ BN คือการให้ข้อมูลที่เป็นมาตรฐานไปยังเลเยอร์ถัดไป
MiloMinderbinder

12

โดยปกติเพียงแค่วางDropout(เมื่อคุณมีBN):

  • "BN ไม่จำเป็นต้องใช้Dropoutในบางกรณีสาเหตุที่ BN ให้ผลประโยชน์การทำให้เป็นระเบียบเหมือนกับการออกกลางคันโดยสัญชาตญาณ"
  • "สถาปัตยกรรมเช่น ResNet, DenseNet ฯลฯ ไม่ได้ใช้ Dropout

สำหรับรายละเอียดเพิ่มเติมโปรดดูเอกสารนี้ [การทำความเข้าใจความแตกต่างระหว่าง Dropout และ Batch Normalization by Variance Shift ] ตามที่ @Haramoz กล่าวไว้แล้วในความคิดเห็น


สิ่งที่เกี่ยวกับ MLP การรวมเข้าด้วยกันมีประโยชน์อย่างไร
DINA TAKLIT

1
@DINATAKLIT เมื่อคุณมีข้อมูลการฝึกอบรมไม่เพียงพอในความคิดของฉันใช่
xtluo

@xtulo คุณหมายถึงงานนี้เมื่อพวกเขาเป็นวันที่เล็ก ๆ หรือไม่? เช่นถ้าฉันได้อ่านแล้วว่า Batch normalization ทำงานได้ดีขึ้นกับชุดข้อมูลขนาดใหญ่! ฉันสับสนเล็กน้อย:!
DINA TAKLIT

1
@DINATAKLIT ในความเห็นก่อนหน้านี้what about MLPs is it useful to combine themคุณหมายความว่าอย่างนั้นIs it useful to combine Dropout and BN when using MLPsหรือ? ความรู้สึกของฉันเกี่ยวกับเรื่องนี้ส่วนใหญ่ขึ้นอยู่กับขนาดของแบบจำลองและปริมาณข้อมูลการฝึกอบรมที่คุณมี
xtluo

@xtulo ใช่ฉันหมายความว่าการรวม Droupout และ BN มีประโยชน์ใช่ฉันเห็นด้วยกับคำตอบสุดท้ายของคุณ
DINA TAKLIT

6

ฉันพบกระดาษที่อธิบายถึงความไม่ลงรอยกันระหว่าง Dropout และ Batch Norm (BN) ความคิดที่สำคัญคือสิ่งที่พวกเขาเรียกว่า"กะแปรปรวน" เนื่องจากข้อเท็จจริงที่ว่าการออกกลางคันมีพฤติกรรมที่แตกต่างกันระหว่างขั้นตอนการฝึกอบรมและการทดสอบซึ่งจะเปลี่ยนสถิติการป้อนข้อมูลที่ BN เรียนรู้ แนวคิดหลักสามารถพบได้ในรูปนี้ซึ่งนำมาจากกระดาษนี้ ใส่คำอธิบายภาพที่นี่

การสาธิตเล็กน้อยสำหรับเอฟเฟกต์นี้สามารถพบได้ในสมุดบันทึกนี้


3
สิ่งนี้ตอบคำถามได้อย่างไร?
nbubis

1
กระดาษมี 2 กลยุทธ์ที่เป็นไปได้: - ใช้ Dropout (เท่านั้น) หลังจากเลเยอร์ BN ทั้งหมด - เปลี่ยน Dropout เป็นรูปแบบที่มีความแปรปรวนมากขึ้น
user3641187

@nbubis คิดว่าตอบทางอ้อมนะ ดูเหมือนว่าจะไม่แนะนำให้ใช้ร่วมกันเลย ("อธิบายถึงการไม่ลงรอยกันระหว่าง Dropout และ Batch Norm (BN)")
NelsonGon



2

Conv - การเปิดใช้งาน - DropOut - BatchNorm - กลุ่ม -> Test_loss: 0.04261355847120285

Conv - การเปิดใช้งาน - DropOut - Pool - BatchNorm -> Test_loss: 0.050065308809280396

Conv - การเปิดใช้งาน - BatchNorm - พูล - DropOut -> Test_loss: 0.04911309853196144

Conv - การเปิดใช้งาน - BatchNorm - DropOut - Pool -> Test_loss: 0.06809622049331665

Conv - BatchNorm - การเปิดใช้งาน - DropOut - Pool -> Test_loss: 0.038886815309524536

Conv - BatchNorm - การเปิดใช้งาน - พูล - DropOut -> Test_loss: 0.04126095026731491

Conv - BatchNorm - DropOut - การเปิดใช้งาน - พูล -> Test_loss: 0.05142546817660332

Conv - DropOut - การเปิดใช้งาน - BatchNorm - กลุ่ม -> Test_loss: 0.04827788099646568

Conv - DropOut - การเปิดใช้งาน - กลุ่ม - BatchNorm -> Test_loss: 0.04722036048769951

Conv - DropOut - BatchNorm - การเปิดใช้งาน - พูล -> Test_loss: 0.03238215297460556


ได้รับการฝึกฝนเกี่ยวกับชุดข้อมูล MNIST (20 ยุค) โดยมีโมดูล Convolutional 2 โมดูล (ดูด้านล่าง) ตามแต่ละครั้งด้วย

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

ชั้น Convolutional มีขนาดเมล็ดรองค่าเริ่มต้นการเปิดใช้งานคือ(3,3) eluรวมการเป็น MaxPooling (2,2)ของสระว่ายน้ำ การสูญเสียและเพิ่มประสิทธิภาพคือcategorical_crossentropyadam

ความน่าจะเป็นของการออกกลางคันที่สอดคล้องกันคือ0.2หรือ0.3ตามลำดับ จำนวนแผนที่คุณลักษณะคือ32หรือ64ตามลำดับ

แก้ไข: เมื่อฉันทิ้ง Dropout ตามที่แนะนำในบางคำตอบมันจะมาบรรจบกันเร็วขึ้น แต่มีความสามารถในการสรุปทั่วไปที่แย่กว่าเมื่อฉันใช้ BatchNorm และ Dropout


เนื่องจากลักษณะสุ่มของ NN จึงไม่เพียงพอเพียงแค่เล่นกับการฝึกอบรมเพียงครั้งเดียว เมื่อคุณทำการฝึกอบรมประมาณ 100 ครั้งและใช้เวลาเฉลี่ยผลลัพธ์จะแม่นยำมากขึ้น
GensaGames

0

ConV / FC - BN - Sigmoid / tanh - ออกกลางคัน หากการเปิดใช้งาน func เป็น Relu หรืออย่างอื่นลำดับของการทำให้เป็นมาตรฐานและการออกกลางคันขึ้นอยู่กับงานของคุณ


0

ฉันอ่านเอกสารที่แนะนำในคำตอบและความคิดเห็นจาก https://stackoverflow.com/a/40295999/8625228

จากมุมมองของ Ioffe และ Szegedy (2015) ใช้ BN ในโครงสร้างเครือข่ายเท่านั้น Li et al. (2018) ให้การวิเคราะห์ทางสถิติและการทดลองว่ามีการเปลี่ยนแปลงความแปรปรวนเมื่อผู้ปฏิบัติงานใช้ Dropout ก่อน BN ดังนั้น Li et al. (2018) แนะนำให้ใช้ Dropout หลังจากเลเยอร์ BN ทั้งหมด

จากมุมมองของ Ioffe และ Szegedy (2015) BN จะอยู่ ภายใน / ก่อนฟังก์ชันการเปิดใช้งาน อย่างไรก็ตาม Chen et al. (2019) ใช้เลเยอร์ IC ซึ่งรวมการออกกลางคันและ BN และ Chen et al (2019) แนะนำให้ใช้ BN หลัง ReLU

ในด้านความปลอดภัยฉันใช้ Dropout หรือ BN เฉพาะในเครือข่าย

Chen, Guangyong, Pengfei Chen, Yujun Shi, Chang-Yu Hsieh, Benben Liao และ Shengyu Zhang 2019. “ ทบทวนการใช้ Batch Normalization และ Dropout ใหม่ในการฝึก Deep Neural Networks” CoRR abs / 1905.05928 http://arxiv.org/abs/1905.05928

Ioffe, Sergey และ Christian Szegedy 2015. “ Batch Normalization: การเร่งการฝึกอบรมเครือข่ายในระดับลึกโดยการลดการเปลี่ยนแปลงของความแปรปรวนภายใน” CoRR abs / 1502.03167 http://arxiv.org/abs/1502.03167

Li, Xiang, Shuo Chen, Xiaolin Hu และ Jian Yang 2018“ การทำความเข้าใจความไม่ลงรอยกันระหว่างการออกกลางคันและการทำให้เป็นมาตรฐานแบทช์โดย Variance Shift” CoRR abs / 1801.05134 http://arxiv.org/abs/1801.05134

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