التحسين2019متوسط8 دقيقة قراءة

أمثَلة الدُّفعات الكبيرة للتعلُّم العميق: تدريب BERT في 76 دقيقة

Large Batch Optimization for Deep Learning: Training BERT in 76 Minutes

You, Y. · Li, J. · Reddi, S. · Hseu, J. · Kumar, S. · Bhojanapalli, S. · Song, X. · Demmel, J. · Keutzer, K. · Hsieh, C.-J. — ICLR

المشكلة

نماذج ضخمة كـ BERT على كمّيات هائلة من البيانات يستغرق أياماً حتى على أقوى العتاد المتاح. الحل البديهي هو تكبير الدفعة لتوزيع الحسابات على عدد أكبر من المعالجات، لكن تكبيرها بشكل عشوائي يُدمّر جودة النموذج. أفضل ما كان متاحاً وقتها هو مُحسِّن LARS، الذي أعطى نتائج ممتازة مع الشبكات الالتفافية كـ ResNet لكنه انهار تماماً أمام نماذج الانتباه مثل BERT. ببساطة، لم يكن هناك مُحسِّن واحد يستطيع تكبير الدفعة للشبكات الالتفافية والمُحوِّلات معاً دون أن تتراجع الدقة.

الإسهام

— مُحسِّن العزوم التكيُّفية الطبقية للتدريب بالدُّفعات الكبيرة — يأخذ معدلات التعلم التكيُّفية لكل مُعامِل من Adam ويُضيف إليها نسب ثقة طبقية. تُعيّر تحديث كل طبقة بحاصل قسمة مقياس أوزانها على مقياس التحديث المقترح، فتمنع أي طبقة من القفز بخطوة أكبر مما ينبغي. بهذا استطاع LAMB رفع دفعة تدريب BERT إلى 32,868 دون أي تراجع في الدقة، وقلّص زمن التدريب من 3 أيام إلى 76 دقيقة على عنقود TPUv3 Pod. كذلك حقّق أفضل دقة على ResNet-50 — وهو أول مُحسِّن تكيُّفي ينجح في ذلك.

الأثر

أثبت LAMB أن التدريب بدفعات كبيرة لا يقتصر على الشبكات الالتفافية، بل يصلح للمُحوِّلات أيضاً بشرط أن يراعي المُحسِّن مقياس كل طبقة. هذه النتيجة فتحت الباب أمام أنابيب التدريب الموزَّع واسعة النطاق التي تقف وراء نماذج الأساس الحالية. ومفهوم نسبة الثقة الطبقية أثّر في المُحسِّنات التي جاءت بعده وصار مكوّناً أساسياً لتوسيع التدريب ليشمل آلاف المُسرِّعات.

تخيّل طريقاً سريعاً بمئة حارة. حين لا يكون عليه سوى 8 سيارات، أي حد للسرعة يؤدي الغرض. لكن ضع 64,000 سيارة على الطريق نفسه بحد سرعة واحد — ستجد السيارات الرياضية تسير ببطء محبط، والشاحنات تنطلق بسرعة خطرة، والنتيجة فوضى واصطدامات.

LARS حاول حل المشكلة بأن أعطى كل حارة حد سرعة مستقلاً يعتمد على وزن مركباتها. نجحت الفكرة على طريق مستقيم بلا منعطفات (ResNet)، لكنها انهارت تماماً على طريق جبلي متعرج (BERT).

ما يفعله LAMB هو إضافة طبقة ذكاء ثانية: لا يكتفي بضبط السرعة لكل حارة، بل يأخذ بالحسبان أيضاً السرعة الحالية لكل مركبة () ومدى وعورة الطريق أمامها (تباين التدرُّج). النتيجة: 64,000 مركبة تصل بسلام في 76 دقيقة بدل 3 أيام.

المشكلة: الدفعات الكبيرة تُفسد التدريب

هناك بُعد في التدريب قابل للتوازي بطبيعته: حساب التدرُّجات. كل مثال في الدفعة يُعالَج باستقلال عن غيره، وبالتالي مضاعفة تُنصِّف الوقت الفعلي لكل تكرار — هذا نظرياً. لكن عملياً تظهر مشكلتان.

المشكلة الأولى أن الدفعة الأكبر تُنتج تقديرات تدرُّج أنظف وأقل ضجيجاً. يبدو هذا إيجابياً للوهلة الأولى، لكن هذا الضجيج يلعب دور منظِّم ضمني يساعد النموذج على التعميم. حين يختفي، يميل النموذج إلى الحفظ بدل التعلُّم، أو يستقر عند نقاط دنيا حادة وهشّة.

المشكلة الثانية أن المناسب لدفعة صغيرة لا يصلح لدفعة كبيرة. الحل الشائع — تكبير معدَّل التعلُّم خطياً مع حجم الدفعة — يعمل إلى حد معيّن فقط. بعد ذلك الحد يفقد التدريب استقراره وينحرف النموذج.

افتح في المختبر
كبِّر حجم الدفعة وراقب كيف يتسبب معدل تعلُّم عام واحد في انحراف التدريب.
تستيقظ التجربة عند وصولك…

لماذا يفشل LARS مع BERT

كان LARS أول من استخدم نسب الثقة الطبقية في . الفكرة بسيطة: عيّر معدَّل التعلُّم لكل طبقة بنسبة مقياس أوزانها إلى مقياس تدرُّجاتها. أعطى ذلك نتائج مذهلة مع ResNet على ImageNet — تدريبٌ كان يمتد لساعات صار ينتهي في دقائق.

المشكلة أن LARS يستخدم مع الزخم كمُحسِّن أساسي، وهذا المُحسِّن يتعامل مع جميع معاملات الطبقة الواحدة بمعدَّل تعلُّم موحَّد. الأمر مقبول في الطبقات الالتفافية لأن معاملاتها بمقاييس متقاربة، لكنه لا يصلح لـ. في BERT مثلاً، إحصائيات التدرُّج في طبقة تختلف جذرياً عنها في رؤوس ، بل إن المعاملات داخل الطبقة الواحدة تتفاوت حساسيتها بعدة مراتب من الحجم. التكييف على مستوى الطبقة وحده — كما يفعل LARS — لا يكفي لتعويض هذا التباين بين المعاملات الفردية.

افتح في المختبر
قارن بين أسلوبَي LARS وLAMB في التعامل مع الطبقات المتباينة. LARS يطبق مقياساً واحداً لكل طبقة؛ LAMB يُكيّف لكل مُعامِل أولاً ثم يطبق نسبة الثقة الطبقية.
تستيقظ التجربة عند وصولك…

مُحسِّن LAMB

ينطلق LAMB من Adam — المُحسِّن القياسي لتدريب المُحوِّلات — ويُضيف إليه مكوِّناً واحداً محورياً: نسبة الثقة الطبقية. الفكرة أنيقة وواضحة. أولاً، احسب تحديث Adam لكل مُعامِل كالمعتاد: المتوسطات المتحركة الأسّية للتدرُّج (العزم الأول) وللتدرُّج المربَّع (العزم الثاني). بعد ذلك، خُذ كل طبقة واحسب النسبة بين مقياس أوزانها ومقياس التحديث المقترح لها، ثم اضرب تحديث الطبقة بهذه النسبة.

فكّر في الأمر كصمّام أمان. إذا كان التحديث المقترح لطبقة ما ضخماً نسبةً إلى أوزانها الحالية، تُقلّصه نسبة الثقة. وإذا كان ضئيلاً، تُضخّمه. المحصلة أن كل طبقة تتحرك بخطوة تتناسب مع حجمها الفعلي — فلا تستطيع طبقة واحدة أن تهيمن على التحديث وتُزعزع استقرار التدريب.

mt=β1mt1+(1β1)gtvt=β2vt1+(1β2)gt2m^t=mt/(1β1t),v^t=vt/(1β2t)rt(i)=m^t(i)v^t(i)+ϵ+λwt(i)wt+1(i)=wt(i)ηϕ ⁣(wt(i)rt(i))rt(i)\begin{aligned} m_t &= \beta_1 \, m_{t-1} + (1-\beta_1) \, g_t \\ v_t &= \beta_2 \, v_{t-1} + (1-\beta_2) \, g_t^2 \\ \hat{m}_t &= m_t / (1-\beta_1^t), \quad \hat{v}_t = v_t / (1-\beta_2^t) \\ r_t^{(i)} &= \frac{\hat{m}_t^{(i)}}{\sqrt{\hat{v}_t^{(i)}} + \epsilon} + \lambda \, w_t^{(i)} \\ w_{t+1}^{(i)} &= w_t^{(i)} - \eta \cdot \phi\!\left(\frac{\|w_t^{(i)}\|}{\|r_t^{(i)}\|}\right) \cdot r_t^{(i)} \end{aligned}
قاعدة تحديث LAMBالأسطر 1–3 مطابقة لـ Adam: متوسطات متحركة أسّية للتدرُّج والتدرُّج المربَّع مع تصحيح الانحياز. السطر 4 يُضيف اضمحلال الأوزان مباشرة داخل التحديث (النهج نفسه المُتَّبع في AdamW). السطر 5 هو الإضافة الجوهرية: نسبة الثقة φ(‖w‖/‖r‖) تُعيّر التحديث الكامل بحيث يتناسب حجم الخطوة مع مقدار أوزان الطبقة.
افتح في المختبر
تنقّل عبر خطوات خوارزمية LAMB لترى كيف يُحوِّل كل مكوِّن التدرُّجَ إلى التحديث النهائي.
تستيقظ التجربة عند وصولك…
مُحسِّن LAMB — الحلقة الأساسيةpython

مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.

def lamb_update(params, grads, m, v, t, lr, beta1, beta2, eps, wd):
    for i, (w, g) in enumerate(zip(params, grads)):
        # عزوم Adam
        m[i] = beta1 * m[i] + (1 - beta1) * g
        v[i] = beta2 * v[i] + (1 - beta2) * g ** 2
        # تصحيح الانحياز
        m_hat = m[i] / (1 - beta1 ** t)
        v_hat = v[i] / (1 - beta2 ** t)
        # تحديث Adam + اضمحلال الأوزان
        update = m_hat / (v_hat.sqrt() + eps) + wd * w
        # نسبة الثقة — إضافة LAMB الجوهرية
        w_norm = w.norm()
        u_norm = update.norm()
        trust = w_norm / u_norm if w_norm > 0 and u_norm > 0 else 1.0
        # تطبيق التحديث المُعيَّر
        w -= lr * trust * update

توسيع تدريب BERT

دُرِّب BERT الأصلي بـحجم دفعة 256 على مدى مليون خطوة — أي نحو 3 أيام على 16 شريحة . فريق LAMB رفع هذا الحجم تدريجياً: 512، ثم 4 آلاف، 8 آلاف، 16 ألفاً، 32 ألفاً، وأخيراً 64 ألفاً. في كل مرحلة تحقّقوا من أن النموذج يحافظ على دقة BERT الأصلي في المهام اللاحقة.

النتيجة الأبرز: حافظ LAMB على دقة BERT عند حجم دفعة 32,868 باستخدام 8,599 تكراراً فقط بدلاً من مليون. وحين دفعوا الحجم إلى 64 ألفاً على عنقود TPUv3 Pod كامل (1,024 شريحة)، انخفض زمن التدريب الإجمالي إلى 76 دقيقة. وصفة التدريب اعتمدت أيضاً مرحلة تدريجية يرتفع فيها معدَّل التعلُّم خطياً خلال الجزء الأول من الخطوات، ثم يتبعه اضمحلال كثير الحدود.

افتح في المختبر
شاهد كيف يُقلّص تكبير حجم الدفعة وقتَ التدريب الإجمالي بينما يحافظ LAMB على جودة النموذج.
تستيقظ التجربة عند وصولك…

ضمانات التقارب

إلى جانب النتائج التجريبية القوية، تقدم الورقة تحليل لكلٍّ من LARS وLAMB في السياقات غير المحدبة العامة. الرؤية الأساسية هي أن يمكن فهمه على أنه شكل من أشكال النزول التدرُّجي مسبوق الشرط، حيث تكون مصفوفة الشرط المسبق قطرية كتلية وكل كتلة فيها مُعيَّرة بـنسبة الثقة.

اللافت هنا أن معدل التقارب يعتمد على متوسط ثابت ليبشيتز عبر الطبقات لا على قيمته القصوى. لماذا هذا مهم؟ لأن الشبكات العميقة غالباً ما تحتوي على طبقات قليلة بثوابت ليبشيتز أكبر بكثير من بقية الطبقات. المُحسِّنات التقليدية ترتهن بأسوأ طبقة في الشبكة، أما الأساليب التكيُّفية الطبقية فترتبط بالمتوسط — وهو مقدار أصغر بكثير.

1Tt=1TEf(xt)2    O ⁣(Lavg(f(x1)f)T  +  LavgσbT)\frac{1}{T}\sum_{t=1}^{T}\mathbb{E}\|\nabla f(x_t)\|^2 \;\leq\; O\!\left(\frac{L_{\mathrm{avg}}\,(f(x_1)-f^*)}{T} \;+\; \frac{L_{\mathrm{avg}}\,\sigma}{\sqrt{bT}}\right)
حدود تقارب LAMBمعدل التقارب يعتمد على متوسط ثابت ليبشيتز L_avg وليس القيمة القصوى L_∞. يعني هذا أن LAMB يستفيد فعلياً من تفاوت الطبقات — وهو نفس الشيء الذي يُعرقل المُحسِّنات التقليدية. b يمثل حجم الدفعة وσ يمثل ضجيج التدرُّج.

وصفة التدريب العملية

تُقدّم الورقة دروساً عملية قيّمة لمن يريد التدريب بدفعات كبيرة. أولها أن مرحلة الإحماء لا غنى عنها: يبدأ معدَّل التعلُّم من قيمة قريبة من الصفر ويرتفع خطياً خلال جزء من إجمالي خطوات التدريب. بدون إحماء، ينحرف التدريب بالدفعات الكبيرة من الخطوة الأولى. بعد انتهاء الإحماء، يتبع معدَّل التعلُّم منحنى اضمحلال كثير الحدود.

يُطبَّق مباشرة داخل خطوة التحديث (اضمحلال أوزان مفصول كما في AdamW) بدلاً من تنظيم L2. المعاملات الفائقة β₁=0.9 وβ₂=0.999 وε=10⁻⁶ تعمل مع BERT وResNet على حد سواء بأقل ضبط ممكن. المعامل الوحيد الذي يتغير مع حجم الدفعة هو ذروة معدَّل التعلُّم، وهي تتكيّف خطياً بشكل تقريبي.

الجدول الزمني للتدريب بالدفعات الكبيرة

  1. 2017

    قاعدة التكييف الخطي

    أظهر غويال وزملاؤه أن ResNet-50 يمكن تدريبه بدفعة حجمها 8,192 عبر تكبير معدل التعلم خطياً مع مرحلة إحماء. ساعة واحدة بدل 29.

  2. 2017

    LARS

    قدّم يو وزملاؤه التكييف الطبقي لمعدل التعلم. نجحوا في تدريب ResNet على ImageNet في دقائق برفع الدفعة إلى 32 ألفاً، لكنه فشل مع نماذج الانتباه.

  3. 2019

    LAMB

    جمع بين التكيُّف على مستوى المُعامِل من Adam ونسب الثقة الطبقية. أول مُحسِّن يرفع دفعة BERT إلى 64 ألفاً. زمن التدريب انخفض من 3 أيام إلى 76 دقيقة.

  4. 2020

    NVLAMB وتوسيع التدريب المسبق

    تبنّت NVIDIA نُسخاً من LAMB لتدريب Megatron-LM والنماذج اللغوية الكبيرة اللاحقة. صارت المُحسِّنات التكيُّفية للدفعات الكبيرة جزءاً أساسياً من أنابيب الإنتاج الصناعية.

المرجعYou, Li, Reddi, Hseu, Kumar, Bhojanapalli, Song, Demmel, Keutzer, Hsieh. Large Batch Optimization for Deep Learning: Training BERT in 76 Minutes. ICLR, 2020.

مصطلحات هذه الورقة