التحسين2018متقدم13 دقيقة قراءة

Shampoo: أمثَلة المُوتِّرات العشوائية بالتكييف المُسبَق

Shampoo: Preconditioned Stochastic Tensor Optimization

Gupta, V. · Koren, T. · Singer, Y. — ICML

المشكلة

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

الإسهام

يستغل Shampoo حقيقة أن معاملات الشبكات العصبية منظَّمة طبيعياً كمُوتِّرات متعددة الأبعاد. الفكرة أنه بدل بناء مصفوفة تكييف مُسبَق واحدة ضخمة، يحتفظ بمصفوفة تكييف أصغر لكل بُعد على حدة. لمصفوفة أوزان بأبعاد m×n مثلاً، يبني مصفوفة يسرى m×m ومصفوفة يمنى n×n، فتصبح تكلفة التخزين m²+n² بدلاً من m²n². والأهم أن لهاتين المصفوفتين يحدّ من الأسفل مصفوفة التكييف الكاملة بشكل مُثبَت رياضياً، فيحتفظ Shampoo بمعلومات الانحناء المتبادلة التي تفقدها الأساليب القُطرية، مع ضمانات تقارب بمقدار O(√T).

الأثر

أثبت Shampoo أن أمثَلة الدرجة الثانية المُهيكَلة يمكن تطبيقها فعلاً على نطاق التعلّم العميق. نسخة مطوّرة منه فازت بمسابقة AlgoPerf للأمثَلة في نسختها الافتتاحية. فكرة تحليل كرونيكر ترتبط بأسلوب K-FAC وألهمت مباشرةً كلاً من مُحسِّن Muon وأسلوب SOAP. والإطار النظري الذي يربط بنية المُوتِّرات بكفاءة التكييف المُسبَق أثّر أيضاً في أبحاث المعايَرة القُصوى للتحديث muP الخاصة بتوسيع الشبكات العصبية.

تخيّل أنك تدير قاعة مؤتمرات فيها مقاعد مرتّبة في صفوف وأعمدة، ومطلوب منك ضبط ارتفاع كل مقعد حتى يناسب كل ضيف.

العشوائي يعطيك مفتاح ربط واحداً ويقول «أدِر كل برغي بالمقدار نفسه». يعطيك مفتاحاً أذكى يتذكّر مقدار ما أدرتَ كل برغي — لكنه يعامل كل مقعد بمعزل عن جيرانه، ولا يلاحظ أن صفاً كاملاً قد يكون منخفضاً أو عموداً كاملاً قد يكون ضيّقاً.

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

المعضلة: تكييف مُسبَق قوي مقابل حوسبة ممكنة

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

بمصفوفته الكاملة يفعل ذلك تماماً: يُراكم الجداءات الخارجية لمتّجهات الميل السابقة في مصفوفة واحدة Ht=s=1tgsgsH_t = \sum_{s=1}^{t} g_s g_s^\top ثم يستخدم Ht1/2H_t^{-1/2} لتكييف المتّجه. النتيجة خطوة تكيّفية لكل اتجاه في فضاء المعاملات تحقق ندماً مثالياً بشكل مُثبَت. لكن أين المشكلة؟ في شبكة بها dd معامل، حجم HtH_t يصبح d×dd \times d. طبقة عادية بها 1000 مدخل و1000 مخرج تعني d=106d = 10^6 معامل، أي أن HtH_t تصبح مصفوفة فيها تريليون عنصر. تخزينها وحده مستحيل، فما بالك بحساب معكوسها.

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

افتح في المختبر
قارن بين تكلفة الذاكرة لثلاثة أنواع من التكييف المُسبَق — المصفوفة الكاملة، والقُطري، وShampoo — عند أحجام طبقات مختلفة.
تستيقظ التجربة عند وصولك…

الفكرة الجوهرية: المعاملات مُوتِّرات لا متّجهات مسطحة

الملاحظة المحورية وراء Shampoo بسيطة لدرجة مفاجئة: معاملات الشبكات العصبية مُنظَّمة أصلاً على هيئة مصفوفات و، لا متّجهات مسطّحة. أوزان مثلاً هي مصفوفة بأبعاد m×nm \times n، وأوزان مُوتِّر رباعي الأبعاد (قنوات-الدخل × العرض × الارتفاع × قنوات-الخرج). حين نُسطّح هذه البنى في متّجه واحد كما تفرض أساليب المصفوفة الكاملة، نُضيّع المعلومات البنيوية التي كان بالإمكان استغلالها لتسهيل التكييف المُسبَق.

هنا يأتي سؤال Shampoo الذكي: ماذا لو كيّفنا كل بُعد من أبعاد المُوتِّر على حدة؟ بالنسبة لـ WW بأبعاد m×nm \times n، بدلاً من مصفوفة تكييف واحدة ضخمة بحجم mn×mnmn \times mn، نحتفظ بمصفوفتين أصغر بكثير — مصفوفة تكييف يسرى LtRm×mL_t \in \mathbb{R}^{m \times m} تلتقط انحناء الصفوف (أي المخرجات)، ومصفوفة تكييف يمنى RtRn×nR_t \in \mathbb{R}^{n \times n} تلتقط انحناء الأعمدة (أي المدخلات).

افتح في المختبر
كيف يفكّك Shampoo مصفوفة التكييف الضخمة الواحدة إلى مصفوفات لكل بُعد. اضغط على كل بُعد لرؤية مصفوفة التكييف المقابلة.
تستيقظ التجربة عند وصولك…

قاعدة التحديث تُراكم إحصائيات متّجه الميل بشكل مستقل لكل بُعد. في كل خطوة tt ومع وجود مصفوفة المتّجه GtG_t، يجري ما يلي:

  • تحديث مصفوفة التكييف اليسرى: Lt=Lt1+GtGtL_t = L_{t-1} + G_t G_t^\top (ترصد الارتباطات بين الصفوف)
  • تحديث مصفوفة التكييف اليمنى: Rt=Rt1+GtGtR_t = R_{t-1} + G_t^\top G_t (ترصد الارتباطات بين الأعمدة)
  • اتخاذ الخطوة المكيَّفة: Wt+1=WtηLt1/4GtRt1/4W_{t+1} = W_t - \eta \, L_t^{-1/4} \, G_t \, R_t^{-1/4}

لاحظ أن GtGtG_t G_t^\top حجمها m×mm \times m فقط، وGtGtG_t^\top G_t حجمها n×nn \times n — أي أن كلتيهما صغيرة وسهلة التعامل. النقطة الدقيقة هنا هي الأُس 1/4-1/4 بدلاً من 1/2-1/2 المعتاد في AdaGrad الكامل: بما أن لدينا مصفوفتَي تكييف تعملان معاً، كل واحدة تأخذ الجذر الرابع فقط، فيكون أثرهما المُركَّب مكافئاً للجذر التربيعي، مما يُنتج التناقص المألوف O(1/t)O(1/\sqrt{t}) في حجم الخطوة.

Wt+1=WtηLt1/4GtRt1/4W_{t+1} = W_t - \eta \, L_t^{-1/4} \, G_t \, R_t^{-1/4}
قاعدة تحديث Shampoo للمصفوفات — المعادلة الجوهريةمتّجه الميل G يُكيَّف من اليسار بالمصفوفة L التي ترصد انحناء الصفوف، ومن اليمين بالمصفوفة R التي ترصد انحناء الأعمدة. كل مصفوفة مرفوعة للأُس -1/4 حتى يكافئ أثرهما المشترك الأُس -1/2 المستخدم في التكييف بالمصفوفة الكاملة.

لماذا ينجح: الرابط بجداء كرونيكر

التبرير النظري لـShampoo ينبع من علاقة أنيقة بـجداء كرونيكر. حين نُسطّح مصفوفة الأوزان WW إلى متّجه w=vec(W)w = \overline{\text{vec}}(W)، فإن تحديث Shampoo يتحوّل إلى خطوة انحدار تدريجي مكيَّفة بالمعنى المعتاد، حيث مصفوفة التكييف هي Ht=Lt1/4Rt1/4H_t = L_t^{1/4} \otimes R_t^{1/4}.

والنتيجة الأهم هي المبرهنة 8 من الورقة: جداء كرونيكر للإحصائيات المحسوبة لكل بُعد يحدّ من الأسفل مصفوفة الإحصائيات الكاملة. بصيغة رسمية، لمتّجهات ميل بـ لا تتجاوز rr:

ϵI+1rtgtgt    LT1/2RT1/2\epsilon I + \frac{1}{r} \sum_t g_t g_t^\top \;\leq\; L_T^{1/2} \otimes R_T^{1/2}

ماذا يعني هذا عملياً؟ مصفوفة تكييف Shampoo الضمنية ليست مجرّد تقريب للمصفوفة الكاملة — بل هي أقوى منها أو تساويها (بعد تصحيح عامل الرتبة). الصغيرة، وهي الأكثر أهمية لأنها تمثّل الاتجاهات سيئة التكييف، تبقى محفوظة. بعبارة أخرى، Shampoo لا يقرّب المصفوفة الكاملة فحسب، بل يهيمن عليها بشكل مُثبَت رياضياً بمعنى المؤثرات.

افتح في المختبر
اسحب أشرطة حجم الطبقة لترى كيف يضغط تحليل كرونيكر مصفوفة التكييف مع الحفاظ على بنيتها الطيفية.
تستيقظ التجربة عند وصولك…

أبعد من المصفوفات: Shampoo للمُوتِّرات العامة

الحالة المصفوفية واضحة ومباشرة، لكن قوة Shampoo الحقيقية تتجلّى عند التعامل مع مُوتِّرات أعلى درجةً. أوزان الطبقة الالتفافية مثلاً رباعية الأبعاد: قنوات-الدخل × العرض × الارتفاع × قنوات-الخرج. وShampoo يبني مصفوفة تكييف مستقلة لكل بُعد من هذه الأبعاد الأربعة.

التعميم يتمّ بسلاسة. لمُوتِّر من الدرجة kk بأبعاد n1××nkn_1 \times \cdots \times n_k، يحتفظ Shampoo بعدد kk من مصفوفات التكييف HtiRni×niH_t^i \in \mathbb{R}^{n_i \times n_i}. كل واحدة تُحدَّث عبر متّجه الميل مع نفسه على جميع الأبعاد ما عدا البُعد ii: Hti=Ht1i+Gt(i)H_t^i = H_{t-1}^i + G_t^{(i)} حيث Gt(i)=mati(Gt)mati(Gt)G_t^{(i)} = \text{mat}_i(G_t)\text{mat}_i(G_t)^\top. والمتّجه المكيَّف يُحسب بضرب كل بُعد في (Hti)1/2k(H_t^i)^{-1/2k} باستخدام جداء المُوتِّر-المصفوفة ×i\times_i.

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

G~t=Gt×1(Ht1)1/2k×2(Ht2)1/2k×k(Htk)1/2k\widetilde{G}_t = G_t \times_1 (H_t^1)^{-1/2k} \times_2 (H_t^2)^{-1/2k} \cdots \times_k (H_t^k)^{-1/2k}
قاعدة تحديث Shampoo للمُوتِّرات من الدرجة k العامةكل بُعد i له مصفوفة تكييف خاصة مرفوعة للأُس -1/2k. جداء المُوتِّر-المصفوفة ×_i يُطبّق التكييف على البُعد i وحده دون المساس بالأبعاد الأخرى.

ضمانات التقارب: ندم بمقدار O(√T)

تحليل Shampoo النظري مبنيّ في إطار . الفكرة أن المتعلم يواجه سلسلة من دوال الخسارة f1,,fTf_1, \ldots, f_T ويسعى لتقليل الندم — وهو الفرق بين خسارته الكلية وخسارة أفضل نقطة ثابتة كان يمكن اختيارها بأثر رجعي.

المبرهنة الرئيسية (المبرهنة 10) تضع حداً أعلى لندم النسخة المُوتِّرية العامة:

RegretT2rDi=1kTr((HTi)1/2k)\text{Regret}_T \leq \sqrt{2r}\, D \prod_{i=1}^{k} \text{Tr}\big((H_T^i)^{1/2k}\big)

حيث rr هو المتوسط الهندسي لرتب متّجه الميل عبر الأبعاد، وDD قطر مسار المعاملات، وHTiH_T^i الإحصائيات المتراكمة للبُعد ii. في ظل الافتراضات المعتادة، كل حدّ أثر يتدرّج بمقدار O(T1/2k)O(T^{1/2k})، وبالتالي جداء kk من هذه الحدود يعطي O(Tk1/2k)=O(T)O(T^{k \cdot 1/2k}) = O(\sqrt{T}) — وهو المعدّل الأمثل نظرياً للأمثَلة المحدَّبة العشوائية.

جعله عملياً: حيل التنفيذ

الخوارزمية بشكلها الأساسي تحتاج إلى حساب القوى المصفوفية (Hti)1/2k(H_t^i)^{-1/2k} في كل خطوة، وهذا يستلزم أو . ثلاث حيل عملية تجعل Shampoo قابلاً للمنافسة من حيث الزمن الفعلي:

  • تأخير تحديث مصفوفات التكييف. بدلاً من إعادة حساب الجذور المصفوفية كل خطوة، نحسبها مرة كل 20 إلى 100 خطوة ونُعيد استخدام النتائج القديمة بينها. المؤلفون وجدوا أن هذا التأخير لا يكاد يؤثر في الدقة.
  • . نُدمج زخماً معيارياً: Gˉt=αGˉt1+(1α)Gt\bar{G}_t = \alpha \bar{G}_{t-1} + (1-\alpha) G_t مع α=0.9\alpha = 0.9. مصفوفات التكييف تُحدَّث بـمتّجه الميل الخام كالمعتاد، لكن خطوة التحديث الفعلية تُتَّخذ بالمتّجه المُوسَّط بالزخم.
  • التراجع إلى التقريب القُطري للأبعاد الكبيرة. حين يتجاوز بُعد ما حوالي 1200، ننتقل إلى تكييف قُطري لذلك البُعد فقط مع إبقاء المصفوفات الكاملة للأبعاد الأخرى. هذا يجعل Shampoo قابلاً للتطبيق حتى مع مُوتِّرات فيها بُعد ضخم.

المفاجأة أنه رغم هذه الحسابات الإضافية، فإن زمن تنفيذ Shampoo لكل خطوة قريب من زمن الانحدار التدريجي العشوائي وAdam وAdaGrad في الممارسة العملية. السبب أن العمليات المصفوفية قابلة للتوازي بكفاءة على ، ومصفوفات التكييف صغيرة بما يكفي لتحليل طيفي سريع.

افتح في المختبر
تقدّم خطوة بخطوة عبر خوارزمية Shampoo لترى كيف تتطوّر مصفوفات التكييف وتعيد تشكيل متّجه الميل.
تستيقظ التجربة عند وصولك…

التجارب: تقارب أسرع عبر مجالات مختلفة

الورقة تختبر Shampoo على (CIFAR-10/100 بشبكات ResNet وInception) و (LM1B بنماذج ). في جميع التجارب، تقارب Shampoo أسرع بفارق واضح من الانحدار التدريجي العشوائي وAdam وAdaGrad من حيث عدد خطوات .

على CIFAR-10 بشبكة ResNet من 32 طبقة مثلاً، وصل Shampoo إلى خسارة تدريب أقل بنحو نصف عدد الخطوات التي احتاجها Adam. وفي نمذجة لغة LM1B، حقّق اختبار مماثلة لـAdam في جزء بسيط من الخطوات. والأهم أن زمن التنفيذ لكل خطوة كان متقارباً — الحساب الإضافي لبناء مصفوفات التكييف وتطبيقها مهمل مقارنة بـ و للشبكة.

النتيجة الأكثر لفتاً هي مقارنة السرعة الفعلية: رغم العمليات المصفوفية الإضافية التي تتضمن تفكيكاً قيمياً مفرداً، يعالج Shampoo العدد نفسه تقريباً من في الثانية على وحدة Tesla K40. بل في بعض الإعدادات (ResNet-55 على CIFAR-100)، كان Shampoo فعلاً أسرع لكل خطوة من الأساليب المرجعية.

افتح في المختبر
شاهد كيف يتعامل كل من الانحدار التدريجي العشوائي وAdam وShampoo مع سطح الخسارة نفسه. لاحظ كيف يتنقّل Shampoo عبر الانحناءات المتفاوتة بكفاءة أعلى بكثير.
تستيقظ التجربة عند وصولك…

Shampoo مقابل K-FAC: طريقان إلى تكييف كرونيكر

Shampoo وK-FAC كلاهما يستخدم مصفوفات تكييف مُحلَّلة بـجداء كرونيكر، لكن المنطلق مختلف تماماً:

  • K-FAC ينطلق من تقريب للشبكة بافتراض استقلال إحصائي بين ومتّجهات الميل المنتشرة عكسياً. وهو مرتبط جوهرياً ببنية في الشبكات الأمامية، ويحتاج إلى أخذ عيّنات من التوزيع التنبؤي للنموذج.
  • Shampoo لا يفترض شيئاً عن بنية النموذج أصلاً. كل ما يفعله هو ملاحظة أن المعاملات تعيش في فضاءات مُوتِّرية واستخدام إحصائيات المتّجه نفسه لبناء مصفوفة تكييف لكل بُعد. وضمانات التقارب تسري لأي دالة خسارة محدَّبة، لا لخسائر الشبكات العصبية وحدها.

هذا الاستقلال عن البنية هو الميزة العملية الكبرى لـShampoo: يمكنك استخدامه كبديل مباشر لأي مُحسِّن دون تعديل النموذج أو شفرة التدريب. في المقابل، K-FAC يتطلب معرفة تفصيلية بنوع كل طبقة وبنيتها، مما يُصعّب استخدامه كأداة عامة.

الإرث: من Shampoo إلى Muon وmuP

فتح Shampoo الباب أمام عائلة كاملة من العملية في . وتأثيره يمتدّ في عدة اتجاهات:

  • SOAP (2024) أوضح أن Shampoo بالأُس 1/2 مكافئ لتشغيل Adafactor في القاعدة الذاتية لـمصفوفة التكييف، وحسّن استقراره باستخدام بأسلوب Adam بدلاً من المجاميع التراكمية.
  • Muon (2024) يبسّط Shampoo بالتخلّي عن التراكم الزمني كلياً: الفكرة أننا نأخذ التفكيك القيمي المفرد لـمتّجه الميل الحالي فقط ونحوّله إلى تحليله القطبي UVUV^\top، فنحصل على تحديث يُسوّي جميع القيم المفردة. Muon يقرّب هذا بتكرارات نيوتن-شولتز الأسرع من التفكيك القيمي المفرد، مما يجعله عملياً حتى مع النماذج الضخمة.
  • أبحاث المعايَرة القُصوى للتحديث (muP) كشفت أن Shampoo وK-FAC كليهما يتصلان بسؤال نظري أعمق: كيف نُعاير الشبكة العصبية حتى تنتقل المثلى بين أحجام النماذج المختلفة؟ المعايرة الصحيحة لمعاملات في Shampoo تُمكّن من تدريب مستقل عن عرض الشبكة.

نسخة مطوّرة من Shampoo فازت بمسابقة AlgoPerf في نسختها الافتتاحية عام 2023، فأثبتت أن التكييف المُسبَق المُهيكَل يمكن أن يتفوّق على مُحسِّنات عائلة Adam في إطار معياري موحّد.

  1. 2011

    AdaGrad: تراكم المتّجه التكيّفي

    قدّم دوتشي وهازان وسنجر أساليب التدرُّج التكيّفي بنسختين: مصفوفة كاملة وقُطرية، وكلتاهما بندم O(√T). النسخة الكاملة باهظة الثمن حسابياً، فسادت النسخة القُطرية.

  2. 2015

    K-FAC: الانحناء المحلَّل بكرونيكر

    قرّب مارتنز وغروس مصفوفة فيشر بجداء كرونيكر مستفيدين من بنية الانتشار العكسي. الأسلوب مرتبط ببنية الشبكة لكنه فعّال جداً.

  3. 2018

    Shampoo: تكييف مُوتِّري لا يعتمد على البنية

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

  4. 2023

    AlgoPerf: نسخة من Shampoo تفوز بمسابقة الأمثَلة

    نسخة مطوّرة من Shampoo تفوز بمسابقة AlgoPerf من MLCommons في نسختها الأولى، مُظهرةً تفوقاً عملياً على مُحسِّنات عائلة Adam عبر مهام متنوعة.

  5. 2024

    SOAP وMuon: تبسيط Shampoo

    SOAP يربط Shampoo بـAdafactor عبر التحليل الطيفي، وMuon يتخلّى عن التراكم الزمني كلياً ويستخدم التحليل القطبي لتحديث أبسط. كلاهما يبني مباشرةً على فكرة كرونيكر في Shampoo.

مُحسِّن Shampoo — شفرة مبسَّطة للحالة المصفوفيةpython

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

# Shampoo لمصفوفة أوزان واحدة بأبعاد m×n
import numpy as np

def shampoo_step(W, G, L, R, lr, epsilon=1e-6):
    """
    W:  الأوزان الحالية              (m × n)
    G:  متّجه ميل الخسارة بالنسبة لـW (m × n)
    L:  مصفوفة التكييف اليسرى         (m × m)
    R:  مصفوفة التكييف اليمنى          (n × n)
    lr: معدّل التعلّم
    """
    # 1. تراكم إحصائيات العزم الثاني
    L = L + G @ G.T          # انحناء الصفوف (المخرجات)
    R = R + G.T @ G          # انحناء الأعمدة (المدخلات)

    # 2. حساب القوة المصفوفية -1/4 عبر التحليل الذاتي
    def mat_power_neg_quarter(M):
        eigvals, eigvecs = np.linalg.eigh(M)
        eigvals = np.maximum(eigvals, epsilon)
        return eigvecs @ np.diag(eigvals ** (-0.25)) @ eigvecs.T

    L_inv4 = mat_power_neg_quarter(L)
    R_inv4 = mat_power_neg_quarter(R)

    # 3. التحديث المكيَّف: يسار × متّجه ميل × يمين
    W_new = W - lr * (L_inv4 @ G @ R_inv4)

    return W_new, L, R

المرجعGupta, V., Koren, T., Singer, Y.. Shampoo: Preconditioned Stochastic Tensor Optimization. ICML, 2018.

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