التعلم العميق2019مبتدئ20 دقيقة قراءة

الشبكات العصبية المتكررة: من ذاكرة تتلاشى إلى الانتباه

Recurrent Neural Networks (RNNs): A Gentle Introduction and Overview

Schmidt, R. M. — arXiv

المشكلة

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

الإسهام

مسح بأسلوب الدروس التعليمية يبني الشبكات المتكررة من أسسها الأولى بترميز واحد متّسق. يكتب معادلة التكرار (المعادلتان 1 و2)، ثم يشتقّ الانتشار العكسي عبر الزمن ويبيّن من أين يأتي حاصل الضرب المتكرر ∂Ht/∂Hk\partial \mathbf{H}_t / \partial \mathbf{H}_k (المعادلات 9 إلى 12)، ويشرح النسخة المبتورة منه. بعد ذلك يمرّ على الحلول المعمارية واحداً بعد الآخر: بوّابات LSTM (المعادلات 13 إلى 18)، والشبكات العميقة وثنائية الاتجاه (المعادلات 19 إلى 24)، ونماذج المُرمِّز والمُفكِّك، والانتباه بست دوالّ للتقييم، وشبكات المؤشّرات (المعادلة 29)، ثم . وفي الملاحق رسوم تشرح كل ذلك خطوةً خطوة.

الأثر

قيمة هذا المسح في أنه خريطة، لا نتيجة جديدة. فهو يختصر الطريق من الشبكة المتكررة البسيطة إلى المحوِّل في وثيقة واحدة سهلة القراءة، كُتبت لتكون مدخلاً إلى نماذج التسلسل. ويختم بالإشارة إلى AlphaStar، الوكيل الذي يلعب StarCraft II ويجمع بين LSTM والمحوِّل وشبكات المؤشّرات، بوصفه مثالاً تلتقي فيه هذه القطع كلها.

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

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

شبكة تتذكّر لأنها تحمل حالتها معها إلى الأمام

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

كيف تتعامل الشبكة مع ذلك؟ تعتمد على : تقرأ عنصراً واحداً في كل خطوة زمنية. وتحتفظ أثناء ذلك بـ Ht\mathbf{H}_t، وهي متّجه يلخّص كل ما رأته حتى تلك اللحظة. تُحسَب الحالة الجديدة في كل خطوة من أمرين: المُدخَل الحالي Xt\mathbf{X}_t، والحالة السابقة Ht−1\mathbf{H}_{t-1}. بعبارة أخرى، لم تعد المعلومات تسير إلى الأمام فقط، بل صارت تدور في حلقة.

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

Ht=ϕh(XtWxh+Ht−1Whh+bh)Ot=ϕo(HtWho+bo)\mathbf{H}_{t} = \phi_{h}\left(\mathbf{X}_{t}\mathbf{W}_{xh} + \mathbf{H}_{t-1}\mathbf{W}_{hh} + \mathbf{b}_{h}\right) \qquad \mathbf{O}_t = \phi_o\left(\mathbf{H}_t\mathbf{W}_{ho} + \mathbf{b}_o\right)
معادلة التكرار ومعادلة الخرج (المعادلتان 1 و2) — المعادلة الأولى تحدّث الذاكرة، والثانية تستخرج منها إجابة. تمزج الحالة المخفية الجديدة بين المُدخَل الحالي (عبر Wxh\mathbf{W}_{xh}) والحالة السابقة (عبر Whh\mathbf{W}_{hh})، ثم تمرّ النتيجة عبر دالة تنشيط ϕh\phi_h تضغطها في مدى محدود، وهي في الغالب دالة tanh. أما الخرج عند الخطوة tt فيعتمد على حالة تلك الخطوة وحدها. ولاحظ أن أيّاً من المصفوفات لا يحمل دليلاً زمنياً: المصفوفات Wxh\mathbf{W}_{xh} وWhh\mathbf{W}_{hh} وWho\mathbf{W}_{ho} نفسها تخدم كل الخطوات.
افتح في المختبر
بدّل بين الحلقة المطويّة والنُّسخ المفرودة. حرّك w_h فتتغيّر كل الوصلات التكرارية معاً، لأنها في الحقيقة وصلة واحدة. ثم حرّك T ولاحظ أن عدد المعاملات لا يتغيّر. وأخيراً أعطِ كل خطوة وزنها المستقل، وارفع T فوق 5: لن تجد الشبكة ما تعمل به.
تستيقظ التجربة عند وصولك…

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

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

التدريب يعني أن نفرد الشبكة أولاً، ثم نُجري الانتشار العكسي عبر كل النُّسخ

بعد أن نفرد الشبكة، يكاد الانتشار العكسي العادي يعمل كما هو. تسمّي الورقة النتيجة (BPTT). تُجمَع الخسارة على الخطوات الزمنية كلها، L(O,Y)=∑t=1Tℓt(Ot,Yt)\mathcal{L}(\mathbf{O},\mathbf{Y}) = \sum_{t=1}^{T}\ell_t(\mathbf{O}_t,\mathbf{Y}_t) (المعادلة 5). وتدرّج أوزان الخرج Who\mathbf{W}_{ho} سهل، لأن كل خرج يعتمد على خطوته وحدها (المعادلة 6).

لكن الأوزان التكرارية أصعب. فأي تغيير في Whh\mathbf{W}_{hh} يؤثّر في H1\mathbf{H}_1، وهذه تؤثّر في H2\mathbf{H}_2، وهكذا. معنى ذلك أن الخسارة عند الخطوة tt تعتمد على Whh\mathbf{W}_{hh} عبر كل خطوة سابقة kk. هنا تُنتج مجموعاً على كل هذه المسارات. وكل مسار منها يحمل العامل ∂Ht/∂Hk\partial \mathbf{H}_t / \partial \mathbf{H}_k، أي مقدار ما تبقّى للحالة عند الخطوة kk من تأثير في الحالة عند الخطوة tt.

∂L∂Whh=∑t=1T∂ℓt∂Ot⋅∂Ot∂ϕo⋅Who∑k=1t∂Ht∂Hk⋅∂Hk∂Whh\frac{\partial \mathcal{L}}{\partial \mathbf{W}_{hh}} = \sum_{t=1}^{T} \frac{\partial \ell_t}{\partial \mathbf{O}_t}\cdot\frac{\partial \mathbf{O}_t}{\partial \phi_o}\cdot\mathbf{W}_{ho}\sum_{k=1}^{t}\frac{\partial \mathbf{H}_t}{\partial \mathbf{H}_k}\cdot\frac{\partial \mathbf{H}_k}{\partial \mathbf{W}_{hh}}
تدرّج الأوزان التكرارية (المعادلة 9) — هذه المعادلة تجمع صعوبة تدريب الشبكة المتكررة في سطر واحد. المجموع الخارجي يجمع الخسارة من كل خطوة. والمجموع الداخلي يعود إلى الوراء على كل خطوة سابقة kk قد تكون سبباً فيها. العامل الذي يستحق المراقبة هو ∂Ht/∂Hk\partial \mathbf{H}_t / \partial \mathbf{H}_k، أي حساسية حالة متأخرة لحالة مبكرة. وهذا العامل بدوره حاصل ضرب t−kt-k من مصفوفات جاكوبي، مصفوفة لكل خطوة، فحجمه يتوقّف على المسافة بين الخطوتين. والمعادلة 10 لها الشكل نفسه بالنسبة إلى Wxh\mathbf{W}_{xh}.

بعد ذلك تبسّط الورقة حاصل الضرب هذا إلى قوّة مصفوفة، (Whh⊤)t−k\left(\mathbf{W}_{hh}^{\top}\right)^{t-k} (المعادلتان 11 و12). احتفظ بهذه الصيغة في ذهنك، لأنها تُسقط شيئاً دون أن تقول ذلك: مشتقّة دالة التنشيط ϕh\phi_h عند كل خطوة. إنها الصورة الخطّية للتكرار. والتجربة التفاعلية في القسم التالي تبدأ من هذه الصيغة بالضبط، ثم تعيد إليها دالة التنشيط.

حساب كل هذه المسارات لتسلسل طويل مكلف، وقوى المصفوفة Whh\mathbf{W}_{hh} غير مستقرة عددياً. والحل العملي الذي تصفه الورقة هو : نضع حدّاً أعلى لعدد الخطوات التي يُسمَح للتدرّج بالرجوع فيها. تخيّله نافذة متحرّكة على الماضي. ما يقع قبل خطوة القطع لا يُحسَب أصلاً، وهذا يعادل تقليل عدد الطبقات في الشبكة المفرودة.

سلاسل الضرب الطويلة إما أن تتلاشى أو تنفجر

تسمّي الورقة المشكلة المركزية للشبكات المتكررة بوضوح. العامل ∂Ht/∂Hk\partial \mathbf{H}_t / \partial \mathbf{H}_k يعني ضرب مصفوفات على امتداد تسلسل قد يكون طويلاً جداً. فإذا كانت القيم الداخلة في الضرب أصغر من 1، صغُر التدرّج مع كل خطوة حتى يختفي. هذا هو ، ونتيجته أن الحالات البعيدة في الماضي تتوقّف عن المساهمة في التعلّم. وإذا كانت القيم أكبر من 1، كبر حاصل الضرب بدل ذلك. هذا هو ، وقد يقذف فيه تحديث واحد بالأوزان بعيداً.

التلاشي هو الفشل الأهدأ، والأشدّ ضرراً. فالتدريب لا ينهار، بل تعجز الشبكة ببساطة عن تعلّم ، لأن الإشارة التي كان يُفترَض أن تعلّمها لا تصل أبداً. وقد حُلّلت هذه الصعوبة قبل المسح بسنوات، وأشهر تحليل لها في ورقة Bengio وSimard وFrasconi سنة 1994 عن سبب تعثّر النزول التدرّجي مع الاعتمادات البعيدة.

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

افتح في المختبر
انقر الإعدادات الأربعة الجاهزة بالترتيب. في الصيغة الخطّية للورقة، يصير الفرق بين w = 0.9 وw = 1.1 بعد 50 خطوة أربع رُتَب في المقدار. ثم انتقل إلى tanh: صار w = 1.1 يتلاشى هو الآخر، وw = 3 يتلاشى أسرع. وأخيراً شغّل القصّ والبتر، وانظر أيّ مشكلة يمسّها كلٌّ منهما.
تستيقظ التجربة عند وصولك…

في الحالة الخطّية لا يحتاج الحساب إلى تعليق: 0.950≈0.0050.9^{50} \approx 0.005، بينما 1.150≈1171.1^{50} \approx 117. الفرق بين الوزنين صغير، لكنه بعد خمسين خطوة يحدّد هل يبقى للخطوة الأولى أي أثر في التعلّم أصلاً.

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

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

البوّابات: أن تتعلّم الشبكة ما تحفظه وما تنساه

تغيّر خليّة الذاكرة الطويلة قصيرة المدى () حاصل الضرب نفسه. فإلى جانب الحالة المخفية تحتفظ بمتّجه ثانٍ هو Ct\mathbf{C}_t. وتتحكّم في ما يدخل إليه وما يخرج منه عبر . البوّابة متّجه من أعداد بين 0 و1، تُنتجه من المُدخَل الحالي والحالة المخفية السابقة. ثم يُضرَب هذا المتّجه عنصراً بعنصر في متّجه آخر. إذا اقتربت البوّابة من 0 حجبت، وإذا اقتربت من 1 سمحت بالمرور.

والبوّابات ثلاث. Ft\mathbf{F}_t تقرّر كم يُحفَظ من الخليّة القديمة (المعادلة 15). و It\mathbf{I}_t تقرّر كم يُكتَب فيها من مرشّح جديد C~t\tilde{\mathbf{C}}_t، يُبنى بدالة tanh (المعادلتان 14 و16). و Ot\mathbf{O}_t تقرّر كم يُكشَف من الخليّة ليصير الحالة المخفية الجديدة (المعادلتان 13 و18).

ما الذي يكسبه ذلك؟ بحسب المسح، تُبقي LSTM الخطأ أقرب إلى الثبات. لذلك تسمح للشبكات المتكررة بأن تتعلّم عبر عدد أكبر بكثير من الخطوات، «أكثر من 1000 بكثير».

Ct=Ft⊙Ct−1+It⊙C~tHt=Ot⊙tanh⁡(Ct)\mathbf{C}_t = \mathbf{F}_t \odot \mathbf{C}_{t-1} + \mathbf{I}_t \odot \tilde{\mathbf{C}}_t \qquad \mathbf{H}_t = \mathbf{O}_t \odot \tanh\left(\mathbf{C}_t\right)
تحديث حالة الخليّة والحالة المخفية الجديدة (المعادلتان 17 و18) — هنا نحدّث الذاكرة بالجمع، لا بتمريرها عبر دالة ضاغطة. بوّابة النسيان تضرب الخليّة القديمة عنصراً بعنصر، فتحدّد كم يبقى من كل عنصر فيها. وبوّابة الإدخال تفعل الشيء نفسه مع المرشّح الجديد. ثم نجمع الاثنين. أما الحالة المخفية فهي الخليّة بعد ضغطها بدالة tanh، وقد مرّت عبر بوّابة. وما أهمية ذلك للتدريب؟ الخليّة القديمة تصل إلى الجديدة عبر الضرب في Ft\mathbf{F}_t وحده. لذلك فإن التدرّج الراجع على امتداد الخليّة يُضرَب في كل خطوة ببوّابة النسيان، لا بمصفوفة أوزان ومشتقّة tanh كما في الشبكة البسيطة.
خطوة واحدة من LSTM بترميز الورقة (المعادلات 13 إلى 18)python

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

import numpy as np

def sigmoid(z):
    return 1.0 / (1.0 + np.exp(-z))

def lstm_step(x_t, h_prev, c_prev, W, b):
    # متّجهات صفّية تُضرَب في مصفوفات، كما في الورقة: X_t W_x? + H_(t-1) W_h?
    o = sigmoid(x_t @ W["xo"] + h_prev @ W["ho"] + b["o"])        # بوّابة الإخراج (13)
    i = sigmoid(x_t @ W["xi"] + h_prev @ W["hi"] + b["i"])        # بوّابة الإدخال (14)
    f = sigmoid(x_t @ W["xf"] + h_prev @ W["hf"] + b["f"])        # بوّابة النسيان (15)
    c_tilde = np.tanh(x_t @ W["xc"] + h_prev @ W["hc"] + b["c"])  # المرشّح (16)

    # (17) احفظ جزءاً من الذاكرة القديمة، واكتب جزءاً من المرشّح الجديد.
    # جمعٌ لا ضغط: هذا هو المسار الذي يسلكه التدرّج.
    c = f * c_prev + i * c_tilde

    # (18) مرّر الذاكرة المضغوطة عبر بوّابة، لتصير الحالة المخفية الجديدة
    h = o * np.tanh(c)
    return h, c
افتح في المختبر
تُخزَّن إشارة في الخطوة الأولى، ثم يصل ضجيج في كل خطوة بعدها. ابدأ بـ f = 0.9، وستجد LSTM تفقد البِتّ تماماً كما تفقده الشبكة العادية. انتقل إلى f = 0.99 فيصمد البِتّ مئة خطوة. ثم أغلق بوّابة الإدخال عند f = 1: تُحفَظ الذاكرة تماماً، ويبقى تدرّجها مساوياً للواحد.
تستيقظ التجربة عند وصولك…

يبيّن السباق لماذا تهمّ بوّابة النسيان إلى هذا الحدّ. على امتداد الخليّة، التدرّج من الخطوة TT إلى الخطوة الأولى هو ببساطة حاصل ضرب بوّابات النسيان الواقعة بينهما. القيمة 0.9 تبدو كبيرة بما يكفي، لكن 0.999≈3×10−50.9^{99} \approx 3\times10^{-5}، فيُمحى البِتّ. أما 0.99 فتُبقي منه نحو الثلث بعد مئة خطوة. ماذا يعني ذلك عملياً؟ تستطيع الشبكة أن تتعلّم إبقاء البوّابة قرب 1 طوال المدة التي تحتاج فيها إلى معلومة ما، لا أكثر.

وللحالة القصوى اسم، وإن لم يستعمله المسح. في LSTM الأصلية سنة 1997 لم تكن هناك بوّابة نسيان أصلاً. كانت الخليّة تغذّي نفسها بوزن ثابت يساوي 1 تماماً، وهو تصميم سمّاه Hochreiter وSchmidhuber . بفضله كانت إشارة الخطأ تدور دون أن تتغيّر، ما دامت البوّابات مغلقة. ثم أضاف Gers وزملاؤه بوّابة النسيان سنة 2000، لتستطيع الخليّة أن تُفرغ نفسها حين لا تعود الذكرى لازمة.

أما GRU فلا يذكرها المسح إلا مرة واحدة، بديلاً عن LSTM داخل نماذج seq2seq. ولاكتمال الصورة: ، التي قدّمها Cho وزملاؤه سنة 2014، تدمج الخليّة والحالة المخفية في متّجه واحد، وتكتفي ببوّابتين. zz تمزج الحالة القديمة بمرشّح جديد، فتؤدّي دور النسيان والإدخال بمقبض واحد. و تقرّر كم يُسمَح للمرشّح بأن يرى من الحالة القديمة. وفي السباق يؤدّي 1−z1-z دور بوّابة النسيان.

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

أعمق، وقراءة في الاتجاهين

هناك امتدادان آخران يغيّران شكل الشبكة لا الخليّة. الأول الشبكة المتكررة العميقة، وتُسمّى أيضاً المكدّسة، لأنها تكدّس طبقات متكررة بعضها فوق بعض. الطبقة الأولى تقرأ المُدخَل، Ht(1)=ϕ1(Xt,Ht−1(1))\mathbf{H}_t^{(1)} = \phi_1(\mathbf{X}_t, \mathbf{H}_{t-1}^{(1)}). وكل طبقة أعلى تقرأ الطبقة التي تحتها في الخطوة نفسها، ومعها حالتها السابقة، Ht(ℓ)=ϕℓ(Ht(ℓ−1),Ht−1(ℓ))\mathbf{H}_t^{(\ell)} = \phi_\ell(\mathbf{H}_t^{(\ell-1)}, \mathbf{H}_{t-1}^{(\ell)}). ثم يأتي الخرج من الطبقة العليا (المعادلات 19 إلى 21). صار للعمق الآن اتجاهان: صعوداً عبر الطبقات، وامتداداً عبر الزمن.

والامتداد الثاني . تضيف هذه الشبكة طبقة متكررة ثانية تقرأ التسلسل بالمقلوب، من العنصر الأخير إلى الأول. فيصير عند كل خطوة حالتان: حالة أمامية H→t\overrightarrow{\mathbf{H}}_t رأت الماضي، وحالة خلفية H←t\overleftarrow{\mathbf{H}}_t رأت المستقبل (المعادلتان 22 و23). ويستعمل الخرج الحالتين معاً بعد وصلهما (المعادلة 24). يفيد هذا كلما اعتمدت الإجابة عند موضع ما على ما يأتي بعده، كما في ملء فراغ داخل تسلسل، وهو المثال الذي تضربه الورقة.

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

من تسلسل إلى آخر، ولماذا لا يكفي متّجه واحد

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

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

يزيل عنق الزجاجة بأن يسمح للمُفكِّك بالعودة إلى كل حالات المُرمِّز، لا إلى الأخيرة وحدها. يُنتج المُرمِّز، وهو في الغالب ثنائي الاتجاه، حالةً لكل موضع في المُدخَل، Ht′\mathbf{H}_{t'}، وهي وصل الحالتين الأمامية والخلفية (المعادلة 25). وعند كل خطوة خرج tt يحسب المُفكِّك جديداً Ct\mathbf{C}_t، هو متوسط موزون لكل هذه الحالات. ثم يستعمله مع حالته السابقة وخرجه السابق ليكوّن حالته الجديدة (المعادلة 26).

والأوزان αt,t′\alpha_{t,t'} تقول كم يجب أن تنتبه خطوة الخرج tt إلى موضع الدخل t′t'. تأتي هذه الأوزان من درجة تقيّم التوافق بين حالة المُفكِّك السابقة وكل حالة من حالات المُرمِّز. ثم تحوّلها دالة إلى توزيع احتمالي. والمثال الذي تعود إليه الورقة هو المحاذاة بين جملة إنجليزية وترجمتها الفرنسية.

Ct=∑t′=1Tαt,t′ Ht′αt,t′=exp⁡(score⁡(St−1,Ht′))∑t′=1Texp⁡(score⁡(St−1,Ht′))\mathbf{C}_t = \sum_{t'=1}^{T}\alpha_{t,t'}\,\mathbf{H}_{t'} \qquad \alpha_{t,t'} = \frac{\exp\left(\operatorname{score}(\mathbf{S}_{t-1},\mathbf{H}_{t'})\right)}{\sum_{t'=1}^{T}\exp\left(\operatorname{score}(\mathbf{S}_{t-1},\mathbf{H}_{t'})\right)}
متّجه سياق لكل خطوة خرج (المعادلتان 27 و28) — بدل ملخّص واحد ثابت، تبني هاتان المعادلتان ملخّصاً جديداً عند الطلب. في كل خطوة خرج، تقيّم دالة التقييم كل حالة من حالات المُرمِّز مقابل حالة المُفكِّك St−1\mathbf{S}_{t-1}، التي تعبّر عمّا يحتاجه الآن. ثم تحوّل softmax هذه الدرجات إلى أوزان موجبة مجموعها 1. ومتّجه السياق هو متوسط حالات المُرمِّز بهذه الأوزان. لذلك قد تطغى عليه كلمة واحدة، وقد يتوزّع على عدة كلمات، بحسب ما يحتاجه هذا الخرج بعينه.
افتح في المختبر
ابدأ بنمط المتّجه الثابت: كل كلمة فرنسية تقرأ المتّجه C نفسه. حرّك طول الجملة، وراقب كم كلمة من الدخل تستطيع ذاكرة مصغّرة بهذا الحجم، مبنية للتوضيح فقط، أن تسترجعها. ثم انتقل إلى الانتباه، وانقر صفوف «zone» و«économique» و«européenne»: المحاذاة تسير عكس القُطر، لأن الفرنسية تقلب ترتيب الكلمات الإنجليزية في هذا الموضع.
تستيقظ التجربة عند وصولك…

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

ويجمع المسح ست طرق لحساب الدرجة. الانتباه المبني على المحتوى يستعمل تشابه جيب التمام بين المتّجهين. و، الذي قدّمه Bahdanau وزملاؤه، يمرّر المتّجهين عبر شبكة صغيرة، va⊤tanh⁡(Wa[St;Ht′])\mathbf{v}_a^{\top}\tanh(\mathbf{W}_a[\mathbf{S}_t;\mathbf{H}_{t'}]). أما الانتباه المبني على الموضع فيحسب الدرجة من حالة المُفكِّك وحدها. والصيغة العامة تضع مصفوفة متعلَّمة بين المتّجهين، St⊤WaHt′\mathbf{S}_t^{\top}\mathbf{W}_a\mathbf{H}_{t'}. ثم الجداء النقطي، وهو الصيغة العامة نفسها بلا هذه المصفوفة. وأخيراً الجداء النقطي المُقيَّس، الذي يقسم الجداء النقطي على ثابت. هذه الطريقة الأخيرة هي ما يستعمله المحوِّل، وسبب القسمة يستحق تجربة تفاعلية خاصة به نصل إليها بعد قليل.

أن تجيب بالإشارة إلى المُدخَل

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

(Ptr-Net) تجعل أوزان الانتباه نفسها هي الخرج. فبدل أن تمزج حالات المُرمِّز في متّجه سياق، تطبّق softmax على الدرجات، وتقرأ النتيجة احتمالاً للإشارة إلى كل موضع في الدخل. وتكتبها الورقة بدرجة جمعية مبسّطة (المعادلة 29). ولأن التوزيع يقع على المُدخَلات، فإن حجم «القاموس» يكبر ويصغر مع المُدخَل. ويذكر المسح أن شبكات المؤشّرات استُعملت لحساب الأغلفة المحدّبة في المستوى، وتثليثات ديلوني، وحلول النسخة المتماثلة المستوية من مسألة البائع المتجوّل.

Yt=softmax⁡(score⁡(St,Ht′))=softmax⁡(va⊤tanh⁡Wa[St;Ht′])\mathbf{Y}_{t} = \operatorname{softmax}\left(\operatorname{score}(\mathbf{S}_{t},\mathbf{H}_{t'})\right) = \operatorname{softmax}\left(\mathbf{v}_{a}^{\top}\tanh\mathbf{W}_{a}[\mathbf{S}_{t};\mathbf{H}_{t'}]\right)
الخرج توزيع على مواضع الدخل (المعادلة 29) — هذه المعادلة هي الانتباه بعد حذف خطوته الأخيرة، أي خطوة المتوسط الموزون. تقارن الدرجة الجمعية حالة المُفكِّك عند الخطوة tt بكل حالة من حالات المُرمِّز Ht′\mathbf{H}_{t'}، وتعمل softmax على مواضع الدخل t′t'. والنتيجة لا تُمزَج في أي شيء، بل هي الإجابة نفسها: الموضع صاحب الاحتمال الأعلى هو العنصر الذي يشير إليه النموذج في هذه الخطوة.
افتح في المختبر
انقر لإضافة نقاط، أو جرّب المجموعات العشوائية. يُقرأ الغلاف قائمةً من مواضع الدخل. ومع 16 نقطة يصادف المُفكِّك ذو المفردات الثابتة نقطةً على الغلاف رقمها أكبر من 10، فلا يجد لها رمزاً. أما مُفكِّك المؤشّرات فيكتفي بالإشارة إليها. الغلاف هنا يُحسَب بخوارزمية معيارية ويُعرَض على هيئة مؤشّرات، لا بشبكة مدرَّبة.
تستيقظ التجربة عند وصولك…

المحوِّل يتخلّى عن التكرار كلياً

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

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

بقي سؤال: إذا لم يعد في النموذج أي تكرار، فكيف يعرف ترتيب الكلمات؟ الجواب ترميزات الموضع. وهي مبنية من موجات جيب وجيب تمام بترددات عدة، وهي ما يخبر النموذج بمكان كل كلمة.

الانتباه في المحوِّل هو الجداء النقطي المُقيَّس. والورقة تذكر الدافع: حين يكبر مُدخَل softmax، قد يصير تدرّجها ضئيلاً جداً، وهذا يعيق التعلّم. لكن لماذا يكبر المُدخَل أصلاً؟ لأن الجداء النقطي لمتّجهات طويلة كبير. فإذا كانت عناصر الاستعلام والمفتاح عشوائية بتباين يساوي 1، فإن انتشار قيم جدائهما النقطي يكبر مع الجذر التربيعي للبُعد dkd_k. والقسمة على dk\sqrt{d_k} تعيد الدرجات إلى مقياس ثابت.

وهنا صياغة في المسح تحتاج إلى تصحيح. فهو يصف المقسوم عليه بأنه عدد أحرف الكلمة الحالية، ويكتبه في جدوله nsource\sqrt{n_{source}}. أما في ورقة المحوِّل فالمقسوم عليه هو dk\sqrt{d_k}، أي بُعد المفاتيح، وهذا ما تستعمله التجربة التفاعلية.

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

ما يتركه المسح خارج الصورة

هذا المسح خريطة، وأنفع ما تفعله أن تقرأه كخريطة. فهو يقدّم ترميزاً واحداً متّسقاً لسلسلة من الأفكار نُشرت بأساليب كثيرة. ويشتقّ التدرّج الذي يسبّب المشكلة. وفي ملاحقه رسوم تبني خليّة LSTM بوّابةً بوّابة، وتشرح نموذج seq2seq مع الانتباه خطوةً خطوة، وتعرض الموجات التي يقوم عليها ترميز الموضع. ويختم بنصح القارئ بالعودة إلى الأوراق الأصلية للتعمّق. ويشير أيضاً إلى AlphaStar، وكيل StarCraft II الذي قدّمه Vinyals وزملاؤه، ويستعمل LSTM والمحوِّل وشبكات المؤشّرات معاً، بوصفه نظاماً واحداً تلتقي فيه هذه القطع كلها.

ما لا يقدّمه المسح هو الدليل. فليست فيه تجارب خاصة به، ولا تُقارَن المعماريات على مهمة مشتركة. لذلك لا يستطيع أن يخبرك متى تتفوّق GRU على LSTM، ولا كم يفيد الانتباه في مسألة بعينها.

كل حلّ يجيب عن ضعف الحلّ الذي سبقه

  1. 1986

    الانتشار العكسي، والتدريب عبر الزمن

    يجعل Rumelhart وHinton وWilliams الانتشار العكسي طريقة شائعة، ويبيّنون كيف تُدرَّب شبكة متكررة بعد فردها عبر الزمن. ثم يقدّم Werbos معالجة كاملة لـ BPTT سنة 1990.

  2. 1990

    الشبكة المتكررة البسيطة

    في ورقة Elman «إيجاد البنية في الزمن» تعود الحالة المخفية إلى الشبكة سياقاً، ويتبيّن أن هذه الشبكات تكتشف البنية في التسلسلات.

  3. 1994

    الاعتمادات البعيدة صعبة

    يحلّل Bengio وSimard وFrasconi سبب فشل النزول التدرّجي مع الاعتمادات بعيدة المدى، بعد أطروحة Hochreiter سنة 1991.

  4. 1997

    LSTM والشبكة ثنائية الاتجاه

    يقدّم Hochreiter وSchmidhuber خليّة LSTM ودوّار الخطأ الثابت فيها. ويقدّم Schuster وPaliwal الشبكات المتكررة ثنائية الاتجاه.

  5. 2000

    بوّابة النسيان

    يمكّن Gers وSchmidhuber وCummins خليّة LSTM من أن تتعلّم إفراغ نفسها.

  6. 2014

    seq2seq وGRU والانتباه

    يحوّل Sutskever وVinyals وLe التسلسلات إلى تسلسلات بخلايا LSTM. ويقدّم Cho وزملاؤه GRU. ويضيف Bahdanau وCho وBengio الانتباه إلى الترجمة.

  7. 2015

    شبكات المؤشّرات، ودوالّ تقييم أخرى

    يجعل Vinyals وFortunato وJaitly الانتباه هو الخرج نفسه. ويقارن Luong وزملاؤه الدرجات العامة والنقطية والمبنية على الموضع.

  8. 2017

    الانتباه هو كل ما تحتاجه

    يتخلّى محوِّل Vaswani وزملائه عن التكرار، ويعتمد على الانتباه الذاتي بالجداء النقطي المُقيَّس.

  9. 2019

    هذا المسح، وAlphaStar

    يجمع Schmidt السلسلة كلها بترميز واحد. وفي السنة نفسها يجمع AlphaStar بين LSTM والمحوِّل وشبكات المؤشّرات.

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

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

المرجعSchmidt. Recurrent Neural Networks (RNNs): A Gentle Introduction and Overview. arXiv:1912.05911, 2019.

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