batch_size ใน Keras มีผลกระทบต่อคุณภาพของผลลัพธ์หรือไม่


38

ฉันกำลังจะฝึกอบรมเครือข่าย LSTM ขนาดใหญ่ด้วยบทความ 2-3 ล้านรายการและกำลังดิ้นรนกับข้อผิดพลาดของหน่วยความจำ (ฉันใช้ AWS EC2 g2x2 ขนาดใหญ่)

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

ฉันไม่รังเกียจหากเครือข่ายของฉันใช้เวลาในการฝึกอบรมนานขึ้น แต่ฉันต้องการทราบว่าการลดbatch_sizeจะทำให้คุณภาพการคาดการณ์ของฉันลดลงหรือไม่

ขอบคุณ


คำถามนี้ไม่เฉพาะเจาะจงกับ keras ฉันคิดว่า consesus ทั่วไปคือขนาดตัวอย่างที่เล็กกว่ามาบรรจบกัน แต่มีแนวโน้มน้อยที่จะติดอยู่ใน minima ท้องถิ่น
Alex

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

คำตอบ:


43

หลังจากหนึ่งปีครึ่งฉันกลับมาที่คำตอบของฉันเพราะคำตอบก่อนหน้าของฉันผิด

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

ข้อดีอีกอย่างของการแบทช์คือการคำนวณ GPU, GPU นั้นดีมากในการคำนวณแบบขนานที่เกิดขึ้นในเครือข่ายประสาทถ้าส่วนหนึ่งของการคำนวณเหมือนกัน (ตัวอย่างเช่นการคูณเมทริกซ์ซ้ำซ้อนกับเมทริกซ์น้ำหนักเดียวกันของเครือข่ายของคุณ) ซึ่งหมายความว่าขนาดของชุดงานที่ 16 จะใช้เวลาน้อยกว่าสองเท่าของจำนวนชุดที่ 8

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

คำตอบที่ไม่ถูกต้อง: [[[ไม่การ batch_size โดยเฉลี่ยเท่านั้นมีผลต่อความเร็วในการเรียนรู้ของคุณไม่ใช่คุณภาพของการเรียนรู้) batch_sizes ยังไม่จำเป็นต้องเป็นพลังของ 2 แม้ว่าฉันเข้าใจว่าแพคเกจบางอย่างอนุญาตเฉพาะพลังของ 2 คุณควรพยายามให้ batch_size ของคุณสูงสุดที่คุณสามารถที่ยังคงเหมาะกับหน่วยความจำของ GPU ของคุณเพื่อให้ได้ความเร็วสูงสุด .]]]]


ฉันไม่สามารถจ่ายได้ 32 แต่จ่ายได้ 16 แต่ฉันสังเกตเห็นว่าช้าเกินไป คุณคิดว่าฉันควรลองค่าระหว่าง 16-32 หรือติดกับ 16 หรือไม่?
hipoglucido

ฉันจะลองและกำหนดเวลาบางค่า ทุกยุคควรอยู่ในช่วงเวลาเดียวกันเพื่อที่จะไม่ใช้เวลานานเกินไป ลองใช้ 17 ก่อนเพื่อดูว่ามันเร็วขึ้นหรือช้าลงเพราะฉันสนใจสิ่งนี้เนื่องจากพลังของ 2 ขึ้นอยู่กับ GPU และ / หรือแบ็กเอนด์ของ Keras แต่ฉันคิดว่าการเติมให้เต็มน่าจะดีที่สุด
ม.ค. van der Vegt

9
คุณแน่ใจหรือไม่ว่าขนาดชุดงานไม่มีผลต่อคุณภาพการเรียนรู้ ฉันจำได้ว่าอ่านบล็อก / เอกสาร (?) ซึ่งพวกเขาบอกว่าแบทช์ขนาดเล็กสร้างการไล่ระดับสีที่มีเสียงดังกว่าแบตช์ที่ใหญ่กว่า ไม่แน่ใจว่า / วิธีนี้ใช้กับ LSTM หรือไม่
stmax

ไม่มั่นใจอย่างเต็มที่ไม่มีประสบการณ์ตัวเองเพียงพอ แต่นั่นคือสิ่งที่ฉันอ่าน ฉันเห็นว่าการไล่ระดับสีมีความเสถียรน้อยกว่าดังนั้นฉันจึงอาจออก
Jan van der Vegt

2
หนึ่งปีครึ่งต่อมาและมีความรู้มากขึ้นในขณะนี้และฉันเห็นด้วย ฉันจะเปลี่ยนคำตอบของฉัน
Jan van der Vegt

11

ฉันรู้สึกว่าคำตอบที่ยอมรับอาจผิด มีสายพันธุ์ในที่มีการไล่โทนสีโคตรอัลกอริทึม

  1. Vanilla Gradient Descent : ที่นี่จะมีการคำนวณการไล่ระดับสีบนจุดข้อมูลทั้งหมดในการถ่ายภาพครั้งเดียวและถ่ายภาพโดยเฉลี่ย ดังนั้นเราจึงมีการไล่ระดับสีที่นุ่มนวลใช้เวลาในการเรียนรู้นานขึ้น

  2. Stochastic Gradient Descent : ที่นี่หนึ่งจุดข้อมูลในเวลาหนึ่งดังนั้นการไล่ระดับสีจะก้าวร้าว (การไล่ระดับสีที่มีเสียงดัง) ดังนั้นจะมีจำนวนมากของการแกว่ง (เราใช้พารามิเตอร์โมเมนตัม - เช่น Nesterov เพื่อควบคุมสิ่งนี้) ดังนั้นจึงมีโอกาสที่ความผันผวนของคุณจะทำให้อัลกอริทึมไม่ถึงจุดต่ำสุดในพื้นที่

  3. Mini-Batch Gradient Descent : ซึ่งใช้ประโยชน์จากทั้งคู่ก่อนหน้านี้โดยเฉลี่ยการไล่ระดับสีของแบทช์ขนาดเล็ก ดังนั้นอย่าก้าวร้าวเกินไปเช่น SGD และอนุญาตให้เรียนออนไลน์ซึ่ง Vanilla GD ไม่เคยได้รับอนุญาต

Mini-Batch ที่เล็กลงจะดีกว่านั่นคือประสิทธิภาพของโมเดลของคุณ (ไม่เสมอไป) และแน่นอนว่ามันต้องเกี่ยวข้องกับยุคของการเรียนรู้ที่เร็วเกินไป หากคุณกำลังฝึกอบรมเกี่ยวกับชุดข้อมูลขนาดใหญ่คุณต้องการคอนเวอร์เจนซ์ที่เร็วขึ้นด้วยประสิทธิภาพที่ดีดังนั้นเราจึงเลือก Batch-GD

SGD มีพารามิเตอร์การเรียนรู้คงที่ดังนั้นเราจึงเริ่ม Adaptive Optimizers อื่น ๆ เช่น Adam, AdaDelta, RMS Prop ฯลฯ ซึ่งเปลี่ยนพารามิเตอร์การเรียนรู้ตามประวัติของการไล่ระดับสี


3) เรียกว่า minibatch ปกติ
Alex

@Alex: เพิ่มการเปลี่ยนแปลง
Jil Jung Juk

1
ฉันยอมรับว่าไม่มีกฎเกี่ยวกับพารามิเตอร์ชุดขนาด แต่คำแถลงนี้ - "Mini-Batch ที่เล็กลงจะยิ่งดีกว่าประสิทธิภาพของโมเดลของคุณ" - ตรงกันข้ามกับกฎทั่วไป โดยทั่วไปคุณต้องการเพิ่มขนาดแบทช์ให้ใหญ่ที่สุด
MonsieurBeilto

4

ผิดปกติพอฉันพบว่าขนาดแบทช์ที่ใหญ่ขึ้นด้วย keras ต้องการยุคที่จะมาบรรจบกัน

ตัวอย่างเช่นผลลัพธ์ของสคริปต์นี้ตามการทดสอบการรวมของ keras คือ

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

ที่เกี่ยวข้อง

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

แก้ไข: ส่วนใหญ่แล้วการเพิ่มขึ้นbatch_sizeนั้นต้องการเพื่อเพิ่มความเร็วในการคำนวณ แต่มีวิธีอื่นที่ง่ายกว่าเช่นการใช้ชนิดข้อมูลของรอยเท้าขนาดเล็กผ่านการdtypeโต้แย้งไม่ว่าจะเป็นkerasหรือtensorflowเช่นfloat32แทนที่จะเป็นfloat64


ด้วยแบทช์ที่มีขนาดใหญ่ขึ้น (และน้อยกว่าต่อยุค) คุณจะมีการอัพเดทไล่ระดับสีน้อยลงต่อยุค "ยุค" เป็นเพียงศัพท์แสง ML สำหรับ "หนึ่งผ่านข้อมูลของคุณในระหว่างการฝึกอบรม" หากคุณพยายามเพิ่มความเร็วในการฝึกอบรมให้วัดเวลากำแพงและเพิกเฉยต่อยุคสมัย
Andrew Wagner
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.