النماذج التوليدية1985متوسط12 دقيقة قراءة

خوارزمية تعلُّم لآلات بولتزمان

A Learning Algorithm for Boltzmann Machines

Ackley, D. H. · Hinton, G. E. · Sejnowski, T. J. — Cognitive Science

المشكلة

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

الإسهام

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

الأثر

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

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

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

آلة بولتزمان هي بالضبط هذه اللجنة. خوارزمية التعلّم تضبط قوة كل علاقة () بحيث تتطابق الأنماط التي تستقر عليها اللجنة تلقائياً مع البيانات الحقيقية التي نريد من النظام نمذجتها.

المشكلة: كيف تتعلم الوحدات الخفية دون مُعلِّم؟

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

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

افتح في المختبر
اضغط «أحدِث خطأً» لترى أيّ الوصلات الخفية يجب أن تتغير — ولماذا الإجابة ليست واضحة.
تستيقظ التجربة عند وصولك…

الفكرة المحورية: الشبكات كأنظمة فيزيائية ذات طاقة

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

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

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

E(s)=i<jwijsisjibisiE(\mathbf{s}) = -\sum_{i<j} w_{ij}\, s_i\, s_j - \sum_i b_i\, s_i
دالة الطاقة — قلب آلة بولتزمانكل وحدة i لها حالة ثنائية sᵢ تأخذ القيمة 0 أو 1. wᵢⱼ يمثّل الوزن بين الوحدتين i وj، وbᵢ هو انحياز الوحدة i. حين تكون وحدتان نشطتان ومرتبطتان بوزن موجب، تنخفض الطاقة — وهذه هي التشكيلات التي «تُفضّلها» الشبكة.

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

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

الوحدات العشوائية والتلدين المحاكى: الهروب من الفخاخ

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

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

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

P(si=1)=11+ezi/T,zi=bi+jwijsjP(s_i = 1) = \frac{1}{1 + e^{-z_i / T}}, \quad z_i = b_i + \sum_j w_{ij}\, s_j
قاعدة التحديث العشوائية — تقليب الوحدةالوحدة i تُفعَّل باحتمال σ(zᵢ/T). عند حرارة مرتفعة يقترب الاحتمال من 0.5 مهما كانت قيمة المُدخلات، أي أن الوحدة تتصرف عشوائياً. أما عند T→0 فتتحوّل الوحدة حتمياً إلى الحالة الأدنى طاقةً — وعندها تتصرّف الشبكة تماماً كشبكة هوبفيلد.
افتح في المختبر
اسحب شريط الحرارة وراقب استقرار الوحدات. حرارة عالية = فوضى. حرارة منخفضة = نمط مُتجمّد.
تستيقظ التجربة عند وصولك…

التوازن الحراري: توزيع بولتزمان

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

هذا بالتحديد ما يجعل الشبكة : عند التوازن، تُولّد الوحدات المرئية أنماطاً مسحوبة من توزيع احتمالي مُحدّد رياضياً. والتعلّم يضبط الأوزان بحيث يتطابق هذا التوزيع مع توزيع بيانات التدريب.

P(s)=eE(s)/TueE(u)/TP(\mathbf{s}) = \frac{e^{-E(\mathbf{s}) / T}}{\displaystyle\sum_{\mathbf{u}} e^{-E(\mathbf{u}) / T}}
توزيع بولتزمان — الاحتمال من الطاقةاحتمال الحالة s يتناسب مع e^(−E/T). المقام — وهو دالة التقسيم — يجمع على كل الحالات الممكنة لضمان أن المجموع الكلي للاحتمالات يساوي واحداً. النتيجة: كلما انخفضت طاقة حالة ما، ارتفع احتمالها بشكل أُسِّي.

قاعدة التعلّم: مرحلتان وعملية طرح واحدة

قاعدة التعلّم هنا أنيقة بشكل لافت. لكل وزن wᵢⱼ، تحتاج أن تقيس شيئين:

  • المرحلة الموجبة (التثبيت): ثبِّت الوحدات المرئية على نمط من بيانات التدريب واترك الوحدات الخفية تصل إلى التوازن. سجِّل كم مرة تنشط الوحدتان i وj معاً: ⟨sᵢsⱼ⟩_data.

  • المرحلة السالبة (التشغيل الحر): اترك الشبكة بالكامل — مرئية وخفية — تعمل بحرية حتى التوازن. سجِّل نفس الإحصاء: ⟨sᵢsⱼ⟩_model.

ثم حدِّث الوزن: Δwᵢⱼ = ε (⟨sᵢsⱼ⟩_data − ⟨sᵢsⱼ⟩_model).

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

Δwij=ε(sisjdatasisjmodel)\Delta w_{ij} = \varepsilon \left( \langle s_i\, s_j \rangle_{\text{data}} - \langle s_i\, s_j \rangle_{\text{model}} \right)
قاعدة تعلّم آلة بولتزمانε هو معدَّل التعلّم. القاعدة ترفع الأوزان التي تحتاجها البيانات لكن النموذج لا يُنتجها بما يكفي (الحد الموجب أكبر من السالب)، وتُخفض الأوزان التي يبالغ النموذج في إنتاجها. عند التقارب: ⟨sᵢsⱼ⟩_data = ⟨sᵢsⱼ⟩_model لكل زوج i,j — أي أن إحصاءات النموذج صارت تطابق إحصاءات البيانات.
افتح في المختبر
تابع المرحلتين الموجبة والسالبة خطوة بخطوة. راقب تقارب الارتباطات مع تحديث الأوزان.
تستيقظ التجربة عند وصولك…

الوحدات المرئية والخفية: بنية الشبكة

آلة بولتزمان تتكوّن من نوعين من الوحدات:

  • الوحدات المرئية هي نافذة الشبكة على العالم الخارجي. أثناء المرحلة الموجبة تُثبَّت على أنماط من بيانات التدريب، وأثناء المرحلة السالبة تُترك حرة.

  • الوحدات الخفية تعمل ككاشفات داخلية. ليس لها اتصال مباشر بالبيانات، لكنها تتعلّم التقاط عليا بين الوحدات المرئية — أنماط لا يمكن التعبير عنها بأوزان ثنائية مباشرة فقط.

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

افتح في المختبر
استكشف آلة بولتزمان بأربع وحدات مرئية وثلاث خفية. بدِّل بين وضعَي التثبيت والتشغيل الحر.
تستيقظ التجربة عند وصولك…

مسألة المُرمِّز: إثبات أن الوحدات الخفية تكتشف التمثيلات بنفسها

لإثبات قوة الوحدات الخفية، قدّمت الورقة ما سمّته مسألة : المطلوب تحويل هوية من N مُدخل إلى N مُخرج، لكن عبر من log₂(N) وحدة خفية فقط. على الشبكة أن تتعلّم نسخ أي مُدخل أحادي التنشيط إلى مخرجاتها، رغم أن كل المعلومات يجب أن تمر عبر هذه الطبقة الخفية الضيقة.

في حالة N=8، يجب على 3 وحدات خفية أن تكتشف بنفسها نظام الترميز الثنائي. لم يُخبر أحدٌ الشبكة بأي شيء عن النظام الثنائي — لكنها اخترعته مستقلّةً، فابتكرت ترميزاً مضغوطاً (مثل 101 للمُدخل الخامس) يُقلّل . كان هذا برهاناً مذهلاً على أن آلات بولتزمان تستطيع اكتشاف تمثيلات داخلية مفيدة دون إشراف — وهي بالضبط القدرة التي افتقر إليها البيرسبترون.

افتح في المختبر
راقب تقارب المُرمِّز 8←3←8. الوحدات الخفية تكتشف الترميز الثنائي بشكل مستقل.
تستيقظ التجربة عند وصولك…

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

خوارزمية تعلّم آلة بولتزمان (نسخة مبسَّطة)python

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

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

class BoltzmannMachine:
    def __init__(self, n_visible, n_hidden, lr=0.01):
        n = n_visible + n_hidden
        self.n_vis = n_visible
        self.n_hid = n_hidden
        self.W = np.random.randn(n, n) * 0.01   # أوزان متناظرة
        self.W = (self.W + self.W.T) / 2         # فرض التناظر
        np.fill_diagonal(self.W, 0)               # لا وصلات ذاتية
        self.b = np.zeros(n)
        self.lr = lr

    def _total_input(self, state, i):
        """المُدخل الكلي للوحدة i من كل الوحدات النشطة الأخرى."""
        return self.b[i] + np.dot(self.W[i], state)

    def _anneal(self, state, free_units, steps=100, T_start=10, T_end=1):
        """تشغيل التلدين المحاكى على الوحدات الحرة."""
        for step in range(steps):
            T = T_start * (T_end / T_start) ** (step / steps)
            i = np.random.choice(free_units)
            z = self._total_input(state, i)
            state[i] = 1 if np.random.rand() < sigmoid(z / T) else 0
        return state

    def positive_phase(self, visible_data, n_samples=50):
        """ثبِّت الوحدات المرئية واترك الخفية تصل إلى التوازن."""
        stats = np.zeros_like(self.W)
        state = np.zeros(self.n_vis + self.n_hid)
        hidden_idx = list(range(self.n_vis, self.n_vis + self.n_hid))
        for v in visible_data:
            state[:self.n_vis] = v          # تثبيت المرئية
            self._anneal(state, hidden_idx) # تحرير الخفية
            stats += np.outer(state, state)
        return stats / len(visible_data)

    def negative_phase(self, n_samples=50):
        """اترك كل الوحدات تعمل بحرية حتى التوازن."""
        stats = np.zeros_like(self.W)
        all_idx = list(range(self.n_vis + self.n_hid))
        for _ in range(n_samples):
            state = np.random.randint(0, 2, self.n_vis + self.n_hid).astype(float)
            self._anneal(state, all_idx, steps=200)
            stats += np.outer(state, state)
        return stats / n_samples

    def learn(self, data, epochs=100):
        """خوارزمية التعلّم الكاملة: الموجب − السالب."""
        for epoch in range(epochs):
            pos = self.positive_phase(data)
            neg = self.negative_phase()
            self.W += self.lr * (pos - neg)  # قاعدة التعلّم في سطر واحد
            np.fill_diagonal(self.W, 0)
            self.W = (self.W + self.W.T) / 2

الثمن: لماذا كانت آلات بولتزمان بطيئة جداً

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

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

الإرث والأثر

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

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

  1. 1982

    شبكات هوبفيلد

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

  2. 1985

    هذه الورقة — آلات بولتزمان

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

  3. 1986

    الانتشار العكسي (روملهارت، هينتون، وليامز)

    حل بديل لمسألة إسناد الفضل، أسرع بكثير من تعلّم بولتزمان، لكنه يشترط أن تكون دوال التنشيط قابلة للاشتقاق وأن تتوفر بيانات مُعنونة.

  4. 2002

    التباعد التبايني (هينتون)

    قرّب المرحلة السالبة بخطوة إعادة بناء واحدة فقط بدلاً من التشغيل حتى التوازن الكامل. هذا ما جعل تدريب آلات بولتزمان المقيَّدة ممكناً عملياً للمرة الأولى.

  5. 2006

    شبكات الاعتقاد العميق (هينتون وآخرون)

    استخدمت آلات بولتزمان المقيَّدة المكدّسة للتدريب المسبق على الشبكات العميقة. أعادت إحياء التعلّم العميق وأثبتت أن الإطار النظري لآلة بولتزمان قابل للتوسّع.

  6. 2014

    الشبكات التوليدية التنافسية والمرمّزات التلقائية المتغيّرة

    نماذج توليدية حديثة تعمل بنفس الفلسفة: قارن ما تقوله البيانات بما يعتقده النموذج، ثم عدِّل الأوزان لتقليص الفجوة بينهما.

المرجعAckley, D. H., Hinton, G. E., & Sejnowski, T. J.. A Learning Algorithm for Boltzmann Machines. Cognitive Science, 1985.

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