أصدر Maksim Sekretov نموذج محول (transformer) صغيرًا بلغة JavaScript خالصة، يعمل على Node.js ويُظهر كل قيمة قياسية (scalar) ووزن (weight) وتدرج (gradient) أثناء عملية التدريب. يتيح المستودع tiny-language-model-neuro-js لأي شخص البدء بنموذج عشوائي، وتزويده بمطالبة (prompt) مثل "can human read ?"، ومشاهدة فشله، ثم تشغيل عملية تدريب بأمر واحد ورؤية الإجابة وهي تصبح صحيحة.
لماذا تخفي معظم عروض نماذج اللغة الكبيرة (LLM) الرياضيات
تعتمد الدروس التعليمية النموذجية لنماذج اللغة على TensorFlow أو PyTorch. تقوم هذه الأطر تلقائيًا ببناء رسوم بيانية حسابية (computation graphs) وحساب التدرجات (gradients) خلف الكواليس، لذا لا يرى المتعلمون سوى كود عالي المستوى ومنحنيات الخسارة (loss curves). أما العمليات الأساسية — كيف يتحول كل رمز (token) إلى تضمين (embedding)، وكيف تُحسب درجات الانتباه (attention scores)، وكيف تتدفق التدرجات عبر كل مصفوفة — فتظل غير مرئية.
ما الذي يفعله نموذج JavaScript بشكل مختلف
تعمل نسخة Sekretov على تجريد كل شيء إلى نص Node.js برمجي واحد خالٍ من التبعيات. يتبع مسار التدريب تسلسلاً مباشرًا:
- التجزئة (Tokenization)
- التضمينات (Embeddings)
- كتل المحول السببية (Causal transformer blocks)
- الانتباه الذاتي متعدد الرؤوس (Multi-head self-attention)
- الشبكات الأمامية (Feed-forward networks - FFN)
- رأس نموذج اللغة و softmax
- خسارة الإنتروبيا المتقاطعة (Cross-entropy loss)
- الانتشار العكسي (Backpropagation)
تشغيل الأمر node src/train.js --generalize --adaptive-teach يطلق حلقة التدريب الكاملة. ولأن الكود مكتوب بلغة JavaScript بسيطة، فإن كل تنسور (tensor) هو مجرد مصفوفة بسيطة، وكل عملية ضرب مصفوفات هي حلقة تكرارية صريحة، وكل تدرج يقع بجانب الوزن المصدر له.
من التخمينات العشوائية إلى الإجابات الصحيحة
عندما يبدأ النموذج، تكون جميع المعلمات عشوائية. لذا فإن سؤاله "can human read ?" ينتج عنه كلام غير مفهوم. وبعد مرحلة قصيرة من ما قبل التدريب (pre-training) وجولة من الضبط الدقيق الخاضع للإشراف (SFT)، تعيد نفس المطالبة إجابة منطقية. إشارة المعلم — وهي تسلسلات الرموز الصحيحة التي يتم تمريرها عبر دالة الخسارة — تنتشر عائدة عبر التضمينات، ورؤوس الانتباه، وطبقات FFN، مما يؤدي إلى تحديث كل قيمة قياسية بدورها.
معالجة النسيان الكارثي (Catastrophic forgetting)
أظهرت عمليات التشغيل الأولى مشكلة كلاسيكية: تعلم حقيقة جديدة يؤدي إلى محو الحقائق التي تم تعلمها مسبقًا. قام Sekretov بإصلاح ذلك باستخدام أسلوب "المراجعة" (rehearsal) — أي إعادة تقديم الأمثلة القديمة أثناء إدخال بيانات جديدة. يتوقف التدريب فقط عندما يصل كل رمز مستهدف (target token) إلى احتمالية 95% على الأقل ويصمد أمام عشرة فحوصات متتالية. توضح هذه الحلقة البسيطة تحديًا بحثيًا جوهريًا دون الحاجة إلى أي مكتبات خارجية.
من المستفيد ومن قد يُستبعد
لا ينافس هذا المشروع نماذج اللغة الكبيرة التجارية التي تعمل بمليارات المعلمات ومجموعات وحدات معالجة الرسومات (GPU clusters). هذه الفجوة في الأداء تجعله غير مناسب لأعباء عمل الإنتاج، لكنها تحول النموذج إلى وسيلة تعليمية شفافة. الطلاب والهواة والباحثون الذين يجدون صعوبة في رؤية ما بداخل أطر العمل التي تعمل كـ "صندوق أسود" أصبح لديهم الآن بيئة تجريبية (sandbox) تكون فيها الرياضيات عبارة عن كود حرفي.
ما الذي ينقص المشروع وإلى أين يمكن أن يتجه
نظرًا لأن التنفيذ بسيط عمدًا، فإنه يحافظ على سهولة قراءة الكود ولكنه يحد من القابلية للتوسع.
ما الذي يجب مراقبته لاحقًا
المستودع متاح بالفعل للعامة على GitHub.
الخلاصة: من خلال تجريد المحول (transformer) إلى لغة JavaScript خالصة، حول Sekretov تقنية غامضة بشكل سيئ السمعة إلى نص برمجي قابل للقراءة والتعديل. المقايضة هنا هي السرعة، لكن المكسب هو البصيرة — حيث يمكن لأي شخص الآن مشاهدة نموذج لغة يتعلم، وينسى، ويعيد التعلم، قيمة قياسية تلو الأخرى.
