جزءان: البحث والتقييم
محرك الشطرنج برنامجان يعملان معًا. البحث ينظر إلى الأمام: ”إن لعبتُ هذه، فقد يردّ الخصم بتلك، ثم ألعب هذه…“. أما التقييم فينظر إلى وضعية واحدة، دون تحريك أي شيء، ويعطيها رقمًا واحدًا: من الأفضل، وبكم.
كلٌّ منهما يحتاج إلى الآخر. كلما تعمّق البحث قلّ أثر ضعف التقييم، وكلما تحسّن التقييم قلّ العمق المطلوب. ولأن التقييم يعمل عند كل نهاية لكل خط — مئات آلاف المرات في الثانية — فلا بد أن يكون جيدًا وسريعًا جدًا في آن واحد.
البحث
يفكّر المحرك أعمق بمستوى واحد في كل مرة (iterative deepening)، فتكون لديه دائمًا نقلة جاهزة حين ينفد الوقت. فحص كل نقلة إلى كل عمق سيستغرق دهرًا، ولذلك يذهب معظم العمل إلى عدم النظر في نقلات لا يمكن أن تُحدث فرقًا:
- ألفا-بيتا. ما إن يدحض ردٌّ واحد نقلةً حتى يتوقف المحرك عن فحصها. ومع ترتيب جيد للنقلات يتخطى هذا معظم الشجرة دون أن يغيّر النتيجة.
- أفضل النقلات أولًا. تُجرَّب أولًا النقلة التي كانت الأفضل آخر مرة ظهرت فيها هذه الوضعية، وأسر القطع الثمينة، والنقلات الهادئة التي نجحت في وضعيات مشابهة (killer moves وجدول history table).
- الذاكرة. يتذكّر جدول التبديلات الوضعيات التي سبق بحثها، لأن الوضعية نفسها كثيرًا ما يُوصَل إليها بترتيبات مختلفة للنقلات.
- اختصارات مدروسة. النقلات المتأخرة قليلة الأمل تُبحث بعمق أقل (late move reductions)؛ والوضعية الجيدة لدرجة أن التخلّي عن نقلة يُبقي التفوّق تُقطع مبكرًا (null move pruning)؛ ونقلات الكش تُبحث أعمق بنقلة واحدة.
- الوضعيات الهادئة فقط. لا يتوقف البحث أبدًا في منتصف تبادل: في نهاية كل خط يواصل تتبّع عمليات الأسر حتى تستقر الوضعية (quiescence search)، فلا يرى التقييم أبدًا وزيرًا على وشك أن يُؤسر ردًّا.
- عدة أنوية. يستطيع المحرك البحث بعدة خيوط معًا، تتشارك كلها جدول تبديلات واحدًا (Lazy SMP).
الرقعة
داخل المحرك، الرقعة مجموعة من الأعداد ذات 64 بت، بت واحد لكل مربع (bitboards): عدد للأحصنة البيضاء، وعدد للرخاخ السوداء، وهكذا. تصبح النقلات والهجمات بضع عمليات على البتات، أما القطع بعيدة المدى فتجد هجماتها في جداول محسوبة مسبقًا (magic bitboards). والقطع المركّبة في هذا النوع — المهراجا ورئيس الأساقفة والمستشار — تتحرك كاجتماع حركات مكوّناتها، ولذلك تستخدم الجداول نفسها.
تقييم الوضعية يدويًا
التقييم الأصلي للمحرك قائمة من القواعد الشطرنجية المستمدة من الخبرة، لكل منها وزن: المادة، وموقع كل قطعة، وعدد المربعات التي تسيطر عليها، والبيادق الحرة والمعزولة، وزوج الفيلين، والرخاخ على الأعمدة المفتوحة، ودرع البيادق أمام الملك. وتتغير الأوزان تدريجيًا من الافتتاح إلى النهاية.
إنه يعمل، وهو الذي يلعب في التطبيق اليوم، لكنه لا يعرف إلا ما خطر لأحدهم أن يدوّنه. وكل ما عدا ذلك خفيّ عنه.
الشبكة العصبية
الشبكة العصبية تحلّ محلّ التقييم وحده. ويبقى البحث كما هو تمامًا — فالشبكة لا تختار النقلات، بل تجيب عن سؤال واحد، مرات كثيرة في الثانية: ما مدى جودة هذه الوضعية؟
- المدخل هو الرقعة نفسها. هناك 18 نوعًا من القطع — البيدق والحصان والفيل والرخ والوزير والملك والقطع المركّبة الثلاث، بلونين — و64 مربعًا: 18 × 64 = 1152 سؤالًا جوابه نعم أو لا، مثل ”هل يوجد حصان أبيض على f3؟“. وفي وضعية عادية يكون جواب نحو 32 منها ”نعم“. القطع المركّبة مدخلات قائمة بذاتها، لا خليط من قطع أخرى، ولذلك تتعلم الشبكة قيمة المهراجا كما هو بذاته.
- من وجهتي النظر كلتيهما. تدخل الرقعة مرتين: كما يراها الطرف الذي عليه الدور، ومعكوسةً كما يراها الخصم. فلا تحتاج الشبكة أبدًا إلى تعلّم الشطرنج مرتين، مرة للأبيض ومرة للأسود.
- العصبونات غير مبرمجة. لا أحد يخبر العصبون بما عليه أن يبحث عنه. أثناء التدريب تتحول من تلقاء نفسها إلى كواشف — لشيء مثل ”ملك بلا غطاء من البيادق“ أو ”رخ بلغ الصف السابع“.
لماذا هو سريع
اسم الشبكة، NNUE، اختصار لـEfficiently Updatable Neural Network، أي شبكة عصبية قابلة للتحديث بكفاءة. الطبقة الأولى جدول فيه عمود من الأرقام لكل مدخل، والعصبونات ببساطة مجموع أعمدة المدخلات التي جوابها ”نعم“. والنقلة لا تغيّر إلا مدخلين إلى أربعة، فلا يُعاد حساب المجموع من جديد أبدًا — بل يُحدَّث:
كل شيء يُحسب بأعداد صحيحة صغيرة، كثير منها دفعة واحدة بتعليمات المتجهات في المعالج. في قياساتنا، يبلغ المحرك مع الشبكة عمق البحث نفسه أسرع بنحو الضعف مقارنة بالتقييم اليدوي (0.95 مقابل 2.0 ثانية على وضعيات الاختبار لدينا، على نواة واحدة من جهاز الاختبار لدينا).
كيف يتعلّم
كل مثال تدريبي وضعيةٌ لها وسمان: التقييم الذي منحها إياه بحثٌ بعمق بضع نقلات، والطريقة التي انتهت بها المباراة في النهاية. وتتعلم الشبكة تخمين الاثنين من نظرة واحدة. وهذا هو السر كله: حين يسأل البحث الشبكة عن وضعية، يحمل الجواب سلفًا ما كانت نظرة أعمق ستكتشفه، كأن البحث ذهب أبعد بلا مقابل.
يتعلم المحرك من مبارياته هو فقط، بما فيها القطع المركّبة والجيوش المخصصة — ولا يدخل فيه تحليل أي محرك آخر. ولا تُعتمد شبكة جديدة إلا إذا هزمت سابقتها في مواجهة من مئات المباريات. وحتى الآن كانت كل جولة أقوى بوضوح من سابقتها:
| الشبكة | وضعيات التدريب | النتيجة في اللعب الذاتي |
|---|---|---|
| الأولى | 3 ملايين | +44 إيلو على التقييم اليدوي |
| الثانية | 10 ملايين | +168 إيلو على الأولى |
| الثالثة | 30 مليونًا | +157 إيلو على الثانية |
| الرابعة | 68 مليونًا | +102 إيلو على الثالثة |
تأتي هذه الأرقام من مباريات تبدأ من افتتاحيات تقليدية بين إصدارات محركنا نفسه، بواقع 600 مباراة في كل مواجهة. ويميل اللعب الذاتي إلى تضخيم المكاسب؛ أما القياس ضد محرك خارجي فتجده في صفحة قوة المحرك.
أين وصلنا
- الشبكة الرابعة مدمجة في المحرك. ضد Fairy-Stockfish مضبوطًا على قوة 2500 تحرز 55%، أي نحو 2535 على ذلك المقياس؛ ويبلغ التقييم اليدوي نحو 2210 في الاختبار نفسه.
- تعرف الشبكة النوع الموسّع أقل مما تعرف الشطرنج التقليدي. كل جيش مخصص تدرّبت عليه جاء من مولّدنا، لا من لاعب، لذا فهذه الأوضاع الابتدائية مصطنعة بعض الشيء. أما الجيوش التي كان سيصفّها لاعبون حقيقيون، فلا نعرفها بعد. ثم إن النوع الموسّع أصعب في اللعب أصلًا: أنواع أكثر من القطع، ووضع ابتدائي جديد في كل مباراة تقريبًا.
- لا تُجمع مباريات اللاعبين بعد. الفكرة أن يحفظ الخادم المباريات التي اختار فيها اللاعب المستوى 5 وهزم المحرك بجيش مخصص. هذا غير ممكن بعد. تحتاج الشبكة إلى عشرات الملايين من أوضاع التدريب — تعلّمت الرابعة من 68 مليونًا — ولم يلعب اللاعبون بعد ما يقارب ما يكفي من مباريات النوع الموسّع لتوفيرها.