เหตุใดขนาดชุดเล็กจึงดีกว่า“ ชุดเดียว” ที่มีข้อมูลการฝึกอบรมทั้งหมด?


40

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

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


1
ชำระเงินนี้คำตอบ
Icyblade



คำตอบ:


46

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

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

ในทางกลับกันคุณสามารถอัปเดตพารามิเตอร์ของคุณโดยเพิ่ม (เครื่องหมายลบ) การไล่ระดับสีที่คำนวณในอินสแตนซ์เดียวของชุดข้อมูล เนื่องจากมันขึ้นอยู่กับจุดข้อมูลแบบสุ่มจุดหนึ่งจึงมีเสียงดังมากและอาจดับไปในทิศทางที่ไกลจากการไล่ระดับแบทช์ อย่างไรก็ตามเสียงดังเป็นสิ่งที่คุณต้องการในการเพิ่มประสิทธิภาพแบบไม่ต้องนูนเพราะมันช่วยให้คุณรอดพ้นจากจุดอานหรือจุดต่ำสุดในท้องถิ่น (ทฤษฎีบท 6 ใน [2]) ข้อเสียคือมันไม่มีประสิทธิภาพมากและคุณจำเป็นต้องวนซ้ำชุดข้อมูลทั้งหมดหลายครั้งเพื่อหาทางออกที่ดี

วิธีการ minibatch เป็นการประนีประนอมที่ฉีดเสียงรบกวนที่เพียงพอในการปรับปรุงการไล่ระดับสีแต่ละครั้งในขณะที่การบรรจบกันอย่างรวดเร็ว

1 Bottou, L. (2010) การเรียนรู้ของเครื่องขนาดใหญ่พร้อมการไล่ระดับสีแบบสุ่ม ในการดำเนินการของ COMPSTAT'2010 (pp. 177-186) Physica-Verlag HD

[2] Ge, R. , Huang, F. , Jin, C. , & Yuan, Y. (2015, มิถุนายน) หลบหนีจากการไล่ระดับสีแบบสุ่มของ Saddle Points ออนไลน์เพื่อการสลายตัวของเทนเซอร์ ใน COLT (pp. 797-842)

แก้ไข:

ฉันเพิ่งเห็นความคิดเห็นนี้บน Facebook ของ Yann LeCun ซึ่งให้มุมมองที่สดใหม่สำหรับคำถามนี้ (ขออภัยไม่รู้วิธีเชื่อมโยงไปยัง fb)

การฝึกฝนกับรถมินิบัสขนาดใหญ่นั้นไม่ดีต่อสุขภาพของคุณ ที่สำคัญกว่านั้นไม่ดีสำหรับข้อผิดพลาดในการทดสอบของคุณ เพื่อน ๆ อย่าปล่อยให้เพื่อนใช้มินิบัสที่มีขนาดใหญ่กว่า 32 ลองดูสิ: มีเพียงคนเดียวที่เปลี่ยนมาเป็นมินิบัสขนาดใหญ่กว่าหนึ่งตั้งแต่ปี 2012 เพราะ GPUs ไม่มีประสิทธิภาพสำหรับขนาดแบทช์ที่เล็กกว่า 32 นั่นเป็นเหตุผลที่แย่มาก มันหมายถึงฮาร์ดแวร์ของเราแย่

เขาอ้างถึงบทความนี้ซึ่งเพิ่งโพสต์เมื่อวันที่ arXiv ไม่กี่วันที่ผ่านมา (เม.ย. 2018) ซึ่งมีมูลค่าการอ่าน

Dominic Masters, Carlo Luschi, มาฝึกอบรมแบบกลุ่มเล็กสำหรับเครือข่าย Neural Deep , arXiv: 1804.07612v1

จากนามธรรม

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

ประสิทธิภาพที่ดีที่สุดได้รับอย่างต่อเนื่องสำหรับขนาดมินิ - แบทช์ระหว่าง m = 2 และ m = 32 ซึ่งตรงกันข้ามกับงานล่าสุดที่สนับสนุนการใช้ขนาดมินิ - แบทช์ในหลักพัน


2
ทำไมการไล่ระดับสีแบบมินิ - แบทช์จึงมีแนวโน้มที่จะหลีกเลี่ยงมินิมาในท้องถิ่นที่ไม่ดีมากกว่าการไล่ระดับสีแบบแบทช์ คุณมีสิ่งใดบ้างที่สนับสนุนการอ้างสิทธิ์นี้
Martin Thoma

@MartinThoma ดูทฤษฎีบทที่ 6 ใน [2] บทความล่าสุดเกี่ยวกับ JMLR
horaceT

2
ϕ(w,X)

2
@MartinThoma เนื่องจากมีหนึ่ง minima ระดับโลกสำหรับชุดข้อมูลที่เราได้รับเส้นทางที่ถูกต้องไปยัง minima ทั่วโลกนั้นขึ้นอยู่กับสิ่งที่แตกต่างกันสำหรับแต่ละวิธี GD สำหรับแบตช์ stochastic กว้างยาวเท่านั้นคือน้ำหนักที่เริ่มต้น เส้นทางการไล่ระดับสีจะเหมือนกันหากคุณฝึกอบรม NN อีกครั้งด้วยน้ำหนักเริ่มต้นและชุดข้อมูลเดียวกัน สำหรับ mini-batch และ SGD เส้นทางจะมีลักษณะสุ่มอยู่ระหว่างแต่ละขั้นตอนจากการสุ่มสุ่มจุดข้อมูลสำหรับการฝึกอบรมในแต่ละขั้นตอน การทำเช่นนี้จะช่วยให้มินิแบทช์และ SGD สามารถหลบเลี่ยง Optima ท้องถิ่นหากพวกเขากำลังไป
Wesley

8

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

เหตุผลที่ใช้งาน SGD อย่างกว้างขวางก็คือ:

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

2) การเพิ่มประสิทธิภาพ: การอัปเดตที่มีเสียงดังอาจอนุญาตให้คุณเด้งจาก optima ท้องถิ่นที่ไม่ดี (แม้ว่าฉันจะไม่มีแหล่งข้อมูลที่แสดงให้เห็นว่าเรื่องนี้ในทางปฏิบัติ)

3) ลักษณะทั่วไป ดูเหมือน (ดูจางและคณะ: ทฤษฎีการเรียนรู้ลึก III: คุณสมบัติทั่วไปของ SGD ) ที่จริงแล้ว SGD ช่วยให้การวางนัยทั่วไปโดยการค้นหาคำว่า "แบน" ต่ำสุดในชุดการฝึกอบรมซึ่งมีแนวโน้มที่จะน้อยที่สุดในชุดทดสอบ โดยสัญชาตญาณเราสามารถคิดว่า SGD เป็นถุงแบบห่อ - โดยการคำนวณพารามิเตอร์ของเราตามข้อมูลรถมินิบัสหลาย ๆ ตัวเราจึงบังคับใช้กฎที่พูดคุยกันทั่วไปในรถมินิบัสและยกเลิกกฎที่ไม่ทำให้เรามีแนวโน้มที่จะ ชุดฝึกอบรม


3

เว้นแต่ว่าฉันเข้าใจผิดขนาดแบทช์คือจำนวนอินสแตนซ์การฝึกอบรมที่เห็นโดยโมเดลระหว่างการทำซ้ำการฝึกอบรม

ถูกต้อง (แม้ว่าฉันจะเรียกมันว่า "ขั้นตอนการอัปเดตน้ำหนัก")

และยุคคือการเปิดเต็มเมื่อแต่ละกรณีการฝึกอบรมได้รับการเห็นโดยรูปแบบ

แก้ไข

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

ดีมากที่ คุณมักจะมีหน่วยความจำไม่เพียงพอ ช่วยบอกว่าเรากำลังพูดถึงการจำแนกภาพ ImageNet เป็นชุดข้อมูลยอดนิยม ในขณะที่ VGG-16D เป็นหนึ่งใน mod.els ที่นิยมมากที่สุด ต้องมีการคำนวณ 15 245 800 ลอย (ในแผนที่คุณสมบัติ) สำหรับหนึ่ง 224x224 ภาพ ซึ่งหมายความว่าประมาณ 61MB ต่อภาพ นี่เป็นขอบเขตที่ต่ำกว่าคร่าวๆว่าคุณต้องใช้หน่วยความจำเท่าใดระหว่างการฝึกอบรมสำหรับแต่ละภาพ ImageNet มีรูปภาพหลายพัน (ฉันคิดถึงประมาณ 1.2 ล้านภาพ) ในขณะที่คุณอาจมีหน่วยความจำหลักมากคุณไม่ได้มีหน่วยความจำ GPU มากนัก ฉันเคยเห็น GPU เร่งความเร็วในการใช้งานประมาณ 21x ดังนั้นคุณต้องการใช้ GPU อย่างแน่นอน

นอกจากนี้: เวลาสำหรับ mini-batch หนึ่งครั้งนั้นน้อยกว่ามาก ดังนั้นคำถามคือคุณต้องการทำขั้นตอนการอัพเดตด้วย mini-batch ต่อชั่วโมงใน GPU หรือขั้นตอนการอัพเดท m โดยใช้ batch ที่ไม่มี GPU โดยที่ n >> m


มันไม่ได้เป็นเรื่องของหน่วยความจำที่ จำกัด จริงๆ เป็นไปได้เสมอที่จะคำนวณการไล่ระดับสีบนชุดข้อมูลของคุณในชุดจำนวนมากพร้อมพารามิเตอร์รุ่นคงที่ ในทางปฏิบัติแล้วมันเป็นเรื่องเกี่ยวกับคุณสมบัติการวางแนวทั่วไปที่เกิดจากความสุ่ม / ความไม่มีเสียงของ SGD / MBGD และความจริงที่ว่า epochs น้อยลงผ่านชุดข้อมูลของคุณจำเป็นต้องมีเพื่อให้การบรรจบกัน การอัปเดต params ของรุ่นภายใน epoch เดียวนำไปสู่ ​​params ระดับกลางที่ดีกว่าซึ่งทำให้การคำนวณการไล่ระดับสีเพิ่มเติมในยุคนั้นมีข้อมูลมากขึ้น
เมดิสันพฤษภาคม

1

นอกเหนือจากคำตอบอื่น ๆ ฉันคิดว่ามันคุ้มค่าที่ชี้ให้เห็นว่ามีสองปริมาณที่แตกต่างกัน แต่มักจะมีการเชื่อมโยง:

  1. จำนวนอินพุตที่ใช้ในการคำนวณการไล่ระดับสีของพารามิเตอร์ในแต่ละขั้นตอน

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

  1. จำนวนอินพุตที่รวบรวมในอาร์เรย์และคำนวณ "ในเวลาเดียวกัน"

การแลกเปลี่ยนที่นี่เกี่ยวข้องกับประสิทธิภาพอย่างแท้จริง (หน่วยความจำ / รอบ)

ปริมาณเหล่านี้มักจะเหมือนกันคือขนาดของรถมินิบัส แต่โดยหลักการแล้วพวกเขาสามารถแยกได้

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