التحسين2015متقدم10 دقيقة قراءة
أمثَلة الشبكات العصبية بتقريب الانحناء عبر تحليل كرونيكر
Optimizing Neural Networks with Kronecker-Factored Approximate Curvature
Martens, J. · Grosse, R. — ICML
المشكلة
مُحسِّنات الرتبة الأولى مثل SGD تفترض أن سطح الخسارة ينحني بنفس الشدّة في كل الاتجاهات. الواقع مختلف تماماً: سطح الخسارة في الشبكات العصبية فيه اتجاهات شديدة الانحدار وأخرى شبه مسطّحة. هذا التفاوت يفرض علينا استخدام معدل تعلُّم صغير حتى لا تنفجر الأوزان في الاتجاهات الحادّة، لكن الثمن هو بطء شديد في الاتجاهات المسطّحة. أساليب الرتبة الثانية مثل نزول التدرُّج الطبيعي تعالج المشكلة باستخدام لإعادة قياس التدرُّجات، لكنّ أبعاد هذه المصفوفة N×N حيث N عدد المعاملات — وتخزينها فضلاً عن عكسها مستحيل عملياً في شبكات بملايين المعاملات.
الإسهام
يقرّب K-FAC مصفوفة فيشر بمصفوفة — كتلة واحدة لكل طبقة — ثم يُفكِّك كل كتلة إلى بين مصفوفتين صغيرتين: مصفوفة تغاير التنشيطات A ومصفوفة تغاير التدرُّجات G. الحيلة أن معكوس جداء كرونيكر يساوي جداء كرونيكر للمعكوسات، فبدلاً من عكس مصفوفة ضخمة نعكس مصفوفتين صغيرتين لكل طبقة. النتيجة: كل خطوة تكلّف أضعافاً قليلة مقارنة بـSGD العادي، لكنّها تحقّق تقدُّماً أكبر بكثير فيتسارع التقارب إجمالاً.
الأثر
حوَّل K-FAC أساليب الأمثَلة من الرتبة الثانية من فكرة نظرية إلى أداة عملية للشبكات العميقة. ألهم مباشرةً خوارزمية Shampoo التي تعتمد مُشرِّطات مسبقة بهيكل كرونيكر دون الاعتماد على تفسير فيشر، وأدّى إلى نسخ موزَّعة واسع النطاق وامتدادات تغطي الشبكات الالتفافية والتكرارية والمحوِّلات. أصبح تحليل كرونيكر أداة أساسية في حقيبة مصمِّمي المُحسِّنات، يسدّ الفجوة بين أساليب الرتبة الأولى الرخيصة وأساليب الرتبة الثانية المتينة نظرياً لكن المكلفة حسابياً.
تخيّل أنك تنزل من جبل في ضباب كثيف. يعطيك بوصلة تشير نحو الأسفل، لكنه لا يعرف شيئاً عن طبيعة الأرض تحت قدميك — فتضطر لاتخاذ خطوات حذرة متساوية في كل مكان، حتى لو كنت تمشي على مَرْج واسع ومستوٍ.
يمنحك خريطة طبوغرافية كاملة للتضاريس المحيطة، فتخطو بثقة عبر المروج المسطحة وتتحسّس طريقك فوق الحوافّ الضيقة. المشكلة أنّ هذه الخريطة تغطي الجبل بأكمله وتحتاج ساعات لرسمها.
K-FAC يختصر عليك الطريق: بدلاً من مسح كل متر مربع، تمسح كل قطاع من المسار على حِدة ثم تجمع الخرائط بحيلة طيّ ذكية (جداء كرونيكر). تحصل على 90% من الفهم الطبوغرافي بـ1% فقط من وقت المسح.
المشكلة: نزول التدرُّج يتجاهل شكل سطح الخسارة
المعياري يبحث عن الاتجاه الذي يُنقص بأسرع ما يمكن، لكنه يقيس المسافات في الفضاء الإقليدي العادي. المشكلة أنّ خطوة بمقدار 0.01 في الفضاء الإقليدي تبدو واحدة في كل الاتجاهات، بينما أثرها على سطح الخسارة يختلف جذرياً: في اتجاه جدار وادٍ حاد قد تقذفك هذه الخطوة خارج الوادي كلياً، وعلى أرضية الوادي بالكاد تُحدث فرقاً.
جوهر المشكلة هو — أي مدى سرعة تغيُّر التدرُّج نفسه من نقطة لأخرى — وهذا الانحناء يتفاوت تفاوتاً هائلاً بين اتجاهات المختلفة. أساليب لا ترى هذا الانحناء أصلاً، فيضطر الممارس إلى ضبط على أساس الاتجاه الأشدّ انحداراً، وبذلك يُضيّع فرصة التقدّم السريع في بقية الاتجاهات.
الحل: نزول التدرُّج الطبيعي
اقترح أماري (1998) طريقة تفكير مختلفة: بدلاً من أن نسأل «أيّ تغيير في المعاملات بطول إقليدي ε يُنقص الخسارة أكثر؟»، نسأل «أيّ تغيير يُحرِّك توزيع المخرجات بمقدار لا يتجاوز ε ويُنقص الخسارة أكثر؟» هذا هو مبدأ .
الفكرة عملياً هي استبدال مصفوفة الوحدة في قاعدة التحديث بـمصفوفة معلومات فيشر ، التي تقيس مدى حساسية توزيع مخرجات النموذج لتغيُّر كل معامل. فيصبح التحديث:
حين نضرب التدرُّج بـ، نمدّ الخطوة في الاتجاهات المسطّحة (حيث لفيشر صغيرة) ونضغطها في الاتجاهات الحادة (حيث القيم الذاتية كبيرة). الأثر النهائي أنّ عملية تصبح مستقلة عن طريقة صياغة المعاملات — سواء أعدت كتابة الشبكة بمعاملات مختلفة، يظلّ سلوك التدريب هو نفسه.
يمكنك تخيُّل مصفوفة فيشر كمسطرة تقيس المسافات في «فضاء التوزيعات» لا في «فضاء المعاملات». ما يهمّنا فعلاً ليس كم تغيّرت قيم الأوزان بالأرقام، بل كم تغيّر سلوك النموذج. متجها معاملات قد يبدوان متباعدَين بالأرقام لكنّهما يُعطيان تقريباً نفس المخرجات — هذان ينبغي اعتبارهما قريبَين. وبالمقابل، متجهان قريبان رقمياً لكن مخرجاتهما مختلفة تماماً — هذان بعيدان فعلياً. مصفوفة فيشر تُجسِّد هذه الهندسة بالضبط.
بصيرة K-FAC: تقريبان يجعلان المسألة قابلة للحل
يعتمد K-FAC على تقريبين هيكليين لـمصفوفة فيشر:
التقريب الأول — مصفوفة قُطرية كتلية. نفترض أنّ معاملات كل طبقة مستقلة إحصائياً عن الطبقات الأخرى. هذا الافتراض يحوِّل مصفوفة فيشر العملاقة إلى مصفوفة قُطرية كتلية، كل كتلة فيها تخصّ طبقة واحدة. نعم، نحن نتجاهل التفاعلات بين الطبقات، لكنّها مقايضة معقولة لأنّ الجزء الأكبر من بنية الانحناء يتركّز داخل كل طبقة لا بين الطبقات.
التقريب الثاني — تحليل كرونيكر. لطبقة كاملة الاتصال بـ ، تكون كتلة فيشر مصفوفة ضخمة بأبعاد . K-FAC يقرّبها بـجداء كرونيكر بين مصفوفتين أصغر بكثير: حيث هي لمدخلات الطبقة (التنشيطات)، و هي مصفوفة التغاير للتدرُّجات المنتشرة عكسياً.
ما يفعله تحليل كرونيكر عملياً هو افتراض أنّ التنشيطات والتدرُّجات المنتشرة عكسياً مستقلة إحصائياً عن بعضها. هذا الافتراض ليس مثالياً، لكنّه يلتقط الجزء الأهم من البنية: مصفوفة تُخبرنا أيّ سمات المدخلات تُنشَّط معاً، ومصفوفة تُخبرنا أيّ تدرُّجات المخرجات تتحرّك معاً. جداء كرونيكر بينهما يُجسِّد بطريقة طبيعية كيف تتفاعل ارتباطات المدخلات مع ارتباطات التدرُّجات لتُشكِّل الانحناء الكلّي.
لماذا جداء كرونيكر هو المفتاح: عكسٌ رخيص التكلفة
جداء كرونيكر بين مصفوفة ومصفوفة يُنتج نظرياً مصفوفة — لكنّ الخبر السارّ أنّك لا تحتاج أبداً لبنائها فعلياً. السرّ كلّه في هذه الهُوية:
بدلاً من عكس مصفوفة واحدة بتكلفة ، تعكس كل مصفوفة على حِدة بتكلفة فقط. مثال عملي: طبقة بها 512 مدخلاً و256 مخرجاً تحوِّل عملية العكس من مسألة بحجم إلى مسألتين بحجم و — أي توفير بعامل يقارب مليار مرة.
حساب تحديث K-FAC خطوةً بخطوة
لكل طبقة بـمصفوفة أوزان ، يمرّ تحديث K-FAC بثلاث مراحل:
المرحلة الأولى — تجميع الإحصاءات. أثناء التدريب، نحتفظ بمتوسطات متحركة لـمصفوفة تغاير التنشيطات ومصفوفة تغاير التدرُّجات . هذه الإحصاءات تُحسب من و اللتين نُجريهما أصلاً في SGD — أي بلا عبء حسابي إضافي يُذكر.
المرحلة الثانية — عكس العوامل. على فترات دورية (ليس في كل خطوة)، نعكس و كلاًّ على حِدة. كل منهما مصفوفة صغيرة، فالعكس سريع ويمكن تشغيله بشكل لامتزامن على المعالج المركزي بينما تُكمل وحدة الرسوميات التمريرة الأمامية التالية.
المرحلة الثالثة — تطبيق التدرُّج المُشرَّط. تحديث التدرُّج الطبيعي للأوزان المُسطَّحة هو . بفضل هيكل كرونيكر، يتبسّط إلى «شطيرة مصفوفية»: وهذا عبارة عن ضربَي مصفوفات فقط — النمط الحسابي نفسه الذي نستخدمه في التمريرة الأمامية.
التخميد: الحفاظ على استقرار التقريب
تقريب فيشر ليس مثالياً، وقد تحتوي عوامل كرونيكر على قيم ذاتية صغيرة جداً تُنتج خطوات تحديث ضخمة وخطيرة. للتعامل مع هذا، يستخدم K-FAC تيخونوف — إضافة ثابت صغير على القطر قبل العكس:
لكن لو أضفنا مباشرة إلى ، سنُدمِّر هيكل كرونيكر ويعود العكس مُكلفاً. الحل الذكي هو تخميد تيخونوف المُحلَّل: نوزِّع التخميد على العاملين باستخدام معامل موازنة :
نختار بحيث يُقلِّل خطأ التقريب، وبهذا نحافظ على هيكل كرونيكر فتظلّ هُوية العكس الرخيصة صالحة.
الفكرة في شيفرة برمجية
مبسَّط لإظهار الفكرة — ليس التنفيذ الحقيقي.
import numpy as np
def kfac_update(grad_W, A_cov, G_cov, damping=1e-3):
"""
التدرُّج المُشرَّط بـ K-FAC لطبقة كاملة الاتصال واحدة.
grad_W : (m, n) — تدرُّج الخسارة بالنسبة لمصفوفة الأوزان W
A_cov : (n, n) — متوسط متحرك لتغاير المدخلات E[a aᵀ]
G_cov : (m, m) — متوسط متحرك لتغاير التدرُّجات E[g gᵀ]
damping: معامل λ لتنظيم تيخونوف
"""
n = A_cov.shape[0]
m = G_cov.shape[0]
# تخميد تيخونوف المُحلَّل: نوزّع λ على العاملين بتوازن
pi = np.sqrt((np.trace(A_cov) / n) / (np.trace(G_cov) / m))
A_damped = A_cov + pi * np.sqrt(damping) * np.eye(n)
G_damped = G_cov + (1/pi) * np.sqrt(damping) * np.eye(m)
# عكس كل عامل صغير على حِدة — هذه هي الحيلة الجوهرية
A_inv = np.linalg.inv(A_damped) # (n, n)
G_inv = np.linalg.inv(G_damped) # (m, m)
# «الشطيرة»: التدرُّج المُشرَّط = G⁻¹ · ∇W · A⁻¹
natural_grad = G_inv @ grad_W @ A_inv
return natural_grad
# الاستخدام في حلقة التدريب:
# 1. تمريرة أمامية: سجّل التنشيطات a لكل طبقة
# 2. تمريرة عكسية: سجّل التدرُّجات g لكل طبقة
# 3. حدّث المتوسطات المتحركة: A ← β·A + (1-β)·a·aᵀ
# G ← β·G + (1-β)·g·gᵀ
# 4. أعِد حساب A_inv وG_inv دورياً (يمكن تشغيله لامتزامنياً على CPU)
# 5. W ← W - η · kfac_update(∇W, A, G, λ)التقارب: خطوات أقل وقفزات أكبر
تجارب الورقة على عميقة وشبكات التفافية أظهرت أنّ K-FAC يصل إلى بعدد تكرارات أقل بكثير من نزول التدرُّج العشوائي مع — في كثير من الحالات يحقّق نفس مستوى الخسارة بتحديثات أقل بـ3 إلى 10 مرات. صحيح أنّ كل خطوة K-FAC تكلّف عدة أضعاف خطوة SGD بسبب تقدير التغايرات والعكس الدوري، لكنّ المحصلة النهائية بزمن الساعة الفعلي هي تقارب أسرع.
وعلى خلاف أمثَلة هيسيان بلا تكوين — التي كانت أفضل أسلوب من الرتبة الثانية قبل K-FAC — يعمل K-FAC جيداً في البيئات شديدة العشوائية مع . تقديرات التغاير بالمتوسط المتحرك تُنعِّم الضوضاء بشكل طبيعي، والتخميد المُحلَّل يمنع التقريب من فقدان استقراره.
خوارزمية K-FAC الكاملة بنظرة شاملة
الأثر والإرث
1998
نزول التدرُّج الطبيعي (أماري)
طرح فكرة استخدام مصفوفة معلومات فيشر لإعادة قياس التدرُّجات بحسب هندسة فضاء توزيعات المخرجات.
2010
أمثَلة بلا تكوين هيسيان (مارتنز)
استخدمت التدرُّجات المترافقة لتقريب الضرب بمعكوس الهيسيان دون بنائه صراحةً. أسلوب فعّال لكنّه بطيء في البيئات العشوائية.
2015
K-FAC (مارتنز وغروس)
تقريب كرونيكر لمصفوفة فيشر. جعل أمثَلة الرتبة الثانية عملية التطبيق على الشبكات العميقة مع التدريب بدُفعات عشوائية صغيرة.
2016
K-FAC للطبقات الالتفافية (غروس ومارتنز)
وسّع تحليل كرونيكر ليشمل الطبقات الالتفافية، ما فتح الباب لاستخدام K-FAC في نماذج الرؤية الحاسوبية.
2017
K-FAC الموزَّع (با وغروس ومارتنز)
وزّع حسابات K-FAC على عدة معالجات رسوميات، ممّا أتاح أمثَلة الرتبة الثانية على نطاق تدريب بحجم ImageNet.
2018
Shampoo (غوبتا وكورين وسينغر)
اعتمد مُشرِّطات مسبقة بهيكل كرونيكر مع عمليات جذر مصفوفي. أبسط من K-FAC إذ لا يحتاج تفسير فيشر، ووُسِّع لاحقاً للاستخدام الإنتاجي في Google.
المرجعMartens, Grosse. Optimizing Neural Networks with Kronecker-factored Approximate Curvature. ICML, 2015.
مصطلحات هذه الورقة
- مصفوفة معلومات فيشرFisher Information Matrix
- المُتدرِّج الطبيعيNatural Gradient
- جداء كرونيكرKronecker Product
- انحناءCurvature
- العزم الثانيSecond Moment
- مُهيِّئ التقاربPreconditioner
- مصفوفة هيسيHessian
- قُطرية كتليةBlock-Diagonal
- تخميدDamping
- مصفوفة التباين المشتركCovariance Matrix
- الانحدار التدريجيGradient Descent
- التقارب الحسابيConvergence