التحسين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) طريقة تفكير مختلفة: بدلاً من أن نسأل «أيّ تغيير في المعاملات بطول إقليدي ε يُنقص الخسارة أكثر؟»، نسأل «أيّ تغيير يُحرِّك توزيع المخرجات بمقدار لا يتجاوز ε ويُنقص الخسارة أكثر؟» هذا هو مبدأ .

الفكرة عملياً هي استبدال مصفوفة الوحدة في قاعدة التحديث بـمصفوفة معلومات فيشر FF، التي تقيس مدى حساسية توزيع مخرجات النموذج لتغيُّر كل معامل. فيصبح التحديث:

θt+1=θtηF1L(θt)\theta_{t+1} = \theta_t - \eta F^{-1} \nabla L(\theta_t)

حين نضرب التدرُّج بـF1F^{-1}، نمدّ الخطوة في الاتجاهات المسطّحة (حيث لفيشر صغيرة) ونضغطها في الاتجاهات الحادة (حيث القيم الذاتية كبيرة). الأثر النهائي أنّ عملية تصبح مستقلة عن طريقة صياغة المعاملات — سواء أعدت كتابة الشبكة بمعاملات مختلفة، يظلّ سلوك التدريب هو نفسه.

θt+1=θtηF1L(θt)\theta_{t+1} = \theta_t - \eta \, F^{-1} \nabla L(\theta_t)
قاعدة تحديث التدرُّج الطبيعيF = مصفوفة معلومات فيشر · F⁻¹ تُعيد قياس التدرُّج مع مراعاة الانحناء · η = معدَّل التعلُّم · النتيجة: تقدُّم منتظم في كل اتجاهات المعاملات

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

بصيرة K-FAC: تقريبان يجعلان المسألة قابلة للحل

يعتمد K-FAC على تقريبين هيكليين لـمصفوفة فيشر:

التقريب الأول — مصفوفة قُطرية كتلية. نفترض أنّ معاملات كل طبقة مستقلة إحصائياً عن الطبقات الأخرى. هذا الافتراض يحوِّل مصفوفة فيشر العملاقة N×NN \times N إلى مصفوفة قُطرية كتلية، كل كتلة فيها تخصّ طبقة واحدة. نعم، نحن نتجاهل التفاعلات بين الطبقات، لكنّها مقايضة معقولة لأنّ الجزء الأكبر من بنية الانحناء يتركّز داخل كل طبقة لا بين الطبقات.

التقريب الثاني — تحليل كرونيكر. لطبقة كاملة الاتصال بـ WRm×nW \in \mathbb{R}^{m \times n}، تكون كتلة فيشر مصفوفة ضخمة بأبعاد mn×mnmn \times mn. K-FAC يقرّبها بـجداء كرونيكر بين مصفوفتين أصغر بكثير: F^A1G\hat{F}_\ell \approx A_{\ell-1} \otimes G_\ell حيث A1=E[a1a1]A_{\ell-1} = \mathbb{E}[a_{\ell-1} a_{\ell-1}^\top] هي n×nn \times n لمدخلات الطبقة (التنشيطات)، وG=E[gg]G_\ell = \mathbb{E}[g_\ell g_\ell^\top] هي مصفوفة التغاير m×mm \times m للتدرُّجات المنتشرة عكسياً.

افتح في المختبر
مصفوفة فيشر الكاملة (يساراً) مقابل تقريب K-FAC القُطري الكتلي بتحليل كرونيكر (يميناً). انقر على كتلة أي طبقة لتشاهد تحليلها.
تستيقظ التجربة عند وصولك…

ما يفعله تحليل كرونيكر عملياً هو افتراض أنّ التنشيطات aa والتدرُّجات المنتشرة عكسياً gg مستقلة إحصائياً عن بعضها. هذا الافتراض ليس مثالياً، لكنّه يلتقط الجزء الأهم من البنية: مصفوفة AA تُخبرنا أيّ سمات المدخلات تُنشَّط معاً، ومصفوفة GG تُخبرنا أيّ تدرُّجات المخرجات تتحرّك معاً. جداء كرونيكر بينهما يُجسِّد بطريقة طبيعية كيف تتفاعل ارتباطات المدخلات مع ارتباطات التدرُّجات لتُشكِّل الانحناء الكلّي.

لماذا جداء كرونيكر هو المفتاح: عكسٌ رخيص التكلفة

جداء كرونيكر AGA \otimes G بين مصفوفة n×nn \times n ومصفوفة m×mm \times m يُنتج نظرياً مصفوفة mn×mnmn \times mn — لكنّ الخبر السارّ أنّك لا تحتاج أبداً لبنائها فعلياً. السرّ كلّه في هذه الهُوية:

(AG)1=A1G1(A \otimes G)^{-1} = A^{-1} \otimes G^{-1}

بدلاً من عكس مصفوفة واحدة mn×mnmn \times mn بتكلفة O(m3n3)O(m^3 n^3)، تعكس كل مصفوفة على حِدة بتكلفة O(n3+m3)O(n^3 + m^3) فقط. مثال عملي: طبقة بها 512 مدخلاً و256 مخرجاً تحوِّل عملية العكس من مسألة بحجم 131,072×131,072131{,}072 \times 131{,}072 إلى مسألتين بحجم 512×512512 \times 512 و256×256256 \times 256 — أي توفير بعامل يقارب مليار مرة.

(AG)1=A1G1(A \otimes G)^{-1} = A^{-1} \otimes G^{-1}
هُوية عكس كرونيكر — محرِّك K-FACعكس جداء كرونيكر = عكس كل عامل على حِدة · هذا ما يجعل تكلفة كل خطوة في K-FAC معقولة
افتح في المختبر
شاهد كيف تتّحد مصفوفتان صغيرتان في جداء كرونيكر واحد كبير. حرّك المنزلق لتغيير حجم المصفوفة وقارن تكاليف العكس.
تستيقظ التجربة عند وصولك…

حساب تحديث K-FAC خطوةً بخطوة

لكل طبقة \ell بـمصفوفة أوزان WW_\ell، يمرّ تحديث K-FAC بثلاث مراحل:

المرحلة الأولى — تجميع الإحصاءات. أثناء التدريب، نحتفظ بمتوسطات متحركة لـمصفوفة تغاير التنشيطات A1=E[a1a1]A_{\ell-1} = \mathbb{E}[a_{\ell-1} a_{\ell-1}^\top] ومصفوفة تغاير التدرُّجات G=E[gg]G_\ell = \mathbb{E}[g_\ell g_\ell^\top]. هذه الإحصاءات تُحسب من و اللتين نُجريهما أصلاً في SGD — أي بلا عبء حسابي إضافي يُذكر.

المرحلة الثانية — عكس العوامل. على فترات دورية (ليس في كل خطوة)، نعكس A1A_{\ell-1} وGG_\ell كلاًّ على حِدة. كل منهما مصفوفة صغيرة، فالعكس سريع ويمكن تشغيله بشكل لامتزامن على المعالج المركزي بينما تُكمل وحدة الرسوميات التمريرة الأمامية التالية.

المرحلة الثالثة — تطبيق التدرُّج المُشرَّط. تحديث التدرُّج الطبيعي للأوزان المُسطَّحة هو F1vec(L)F^{-1} \text{vec}(\nabla L). بفضل هيكل كرونيكر، يتبسّط إلى «شطيرة مصفوفية»: ΔW=G1(WL)A11\Delta W_\ell = G_\ell^{-1} \, (\nabla_{W_\ell} L) \, A_{\ell-1}^{-1} وهذا عبارة عن ضربَي مصفوفات فقط — النمط الحسابي نفسه الذي نستخدمه في التمريرة الأمامية.

ΔW=G1(WL)A11\Delta W_\ell = G_\ell^{-1} \, (\nabla_{W_\ell} L) \, A_{\ell-1}^{-1}
تحديث K-FAC — التدرُّج المُشرَّط كشطيرة مصفوفيةG⁻¹ تُعيد القياس في بُعد المخرجات · A⁻¹ تُعيد القياس في بُعد المدخلات · التدرُّج «يُعصر» بين تحويلين يراعيان الانحناء
افتح في المختبر
تابع المراحل الثلاث لتحديث K-FAC في طبقة واحدة.
تستيقظ التجربة عند وصولك…

التخميد: الحفاظ على استقرار التقريب

تقريب فيشر ليس مثالياً، وقد تحتوي عوامل كرونيكر على قيم ذاتية صغيرة جداً تُنتج خطوات تحديث ضخمة وخطيرة. للتعامل مع هذا، يستخدم K-FAC تيخونوف — إضافة ثابت صغير λ\lambda على القطر قبل العكس:

(F^+λI)1(\hat{F}_\ell + \lambda I)^{-1}

لكن لو أضفنا λI\lambda I مباشرة إلى AGA \otimes G، سنُدمِّر هيكل كرونيكر ويعود العكس مُكلفاً. الحل الذكي هو تخميد تيخونوف المُحلَّل: نوزِّع التخميد على العاملين باستخدام معامل موازنة π\pi:

(A+πλI)1(G+1πλI)1(A + \pi\sqrt{\lambda}\,I)^{-1} \otimes (G + \frac{1}{\pi}\sqrt{\lambda}\,I)^{-1}

نختار π\pi بحيث يُقلِّل خطأ التقريب، وبهذا نحافظ على هيكل كرونيكر فتظلّ هُوية العكس الرخيصة صالحة.

الفكرة في شيفرة برمجية

تحديث K-FAC لطبقة كاملة الاتصال واحدةpython

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

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 جيداً في البيئات شديدة العشوائية مع . تقديرات التغاير بالمتوسط المتحرك تُنعِّم الضوضاء بشكل طبيعي، والتخميد المُحلَّل يمنع التقريب من فقدان استقراره.

افتح في المختبر
قارن منحنيات التقارب بين SGD وAdam وK-FAC على مُرمِّز تلقائي عميق.
تستيقظ التجربة عند وصولك…

خوارزمية K-FAC الكاملة بنظرة شاملة

افتح في المختبر
تابع خوارزمية K-FAC الكاملة مرحلةً بمرحلة.
تستيقظ التجربة عند وصولك…

الأثر والإرث

  1. 1998

    نزول التدرُّج الطبيعي (أماري)

    طرح فكرة استخدام مصفوفة معلومات فيشر لإعادة قياس التدرُّجات بحسب هندسة فضاء توزيعات المخرجات.

  2. 2010

    أمثَلة بلا تكوين هيسيان (مارتنز)

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

  3. 2015

    K-FAC (مارتنز وغروس)

    تقريب كرونيكر لمصفوفة فيشر. جعل أمثَلة الرتبة الثانية عملية التطبيق على الشبكات العميقة مع التدريب بدُفعات عشوائية صغيرة.

  4. 2016

    K-FAC للطبقات الالتفافية (غروس ومارتنز)

    وسّع تحليل كرونيكر ليشمل الطبقات الالتفافية، ما فتح الباب لاستخدام K-FAC في نماذج الرؤية الحاسوبية.

  5. 2017

    K-FAC الموزَّع (با وغروس ومارتنز)

    وزّع حسابات K-FAC على عدة معالجات رسوميات، ممّا أتاح أمثَلة الرتبة الثانية على نطاق تدريب بحجم ImageNet.

  6. 2018

    Shampoo (غوبتا وكورين وسينغر)

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

المرجعMartens, Grosse. Optimizing Neural Networks with Kronecker-factored Approximate Curvature. ICML, 2015.

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