شغّل اللبِنات الثلاث لتعلُّم الآلة ولاحظ أنّ كلًّا منها ليس إلا حساب مصفوفات — أولاً لائم خطًّا من الصفر واقرأ الميل الذي تستعيده المعادلات السَّوِيّة، ثم فكِّك مصفوفةً بـSVD واقرأ كم من الطاقة تحمله أعلى مُركّباتها القليلة، ثم مرِّر مُدخلًا عبر شبكةٍ عصبيةٍ صغيرة واقرأ مُخرَج التمرير الأمامي. توقَّع كل رقم قبل أن تُظهره الشاشة، ودوّن نتائجك في النهاية.
يبدو تعلُّم الآلة ثلاثة مواضيع مختلفة — الانحدار، وخفض الأبعاد، والشبكات العصبية — لكنها في العمق لغةٌ واحدة. ملاءمة المربّعات الصغرى هي المعادلات السَّوِيّة x̂ = (AᵀA)⁻¹Aᵀb، جبر مصفوفاتٍ محض يستعيد الخطّ بالضبط حين تكون البيانات عليه. وتفكيك المصفوفة هو SVD أي A = UΣVᵀ، والاحتفاظ بأعلى القيم المفردة القليلة هو النموذج منخفض الرتبة وراء PCA وأنظمة التوصية. والتمرير الأمامي لشبكةٍ عصبيةٍ ليس إلا جداءات مصفوفةٍ في متّجهٍ عبر لا خطّية، ŷ = σ(W₂ σ(W₁x)). هذا المشروع هو تلك الوَحدة: ثلاث مراحل، محرّكٌ واحد.
افتح المِنصّات الثلاث في ألسنة تبويب. تُسمّي كل خطوة أدناه المِنصّة الوحيدة التي تقرأها والاختيار الوحيد الذي تتّخذه فيها؛ واترك كل مؤشّر آخر على قيمته الافتراضية لتطابق أرقامُك هذه الأرقام. مِنصّتان في هذا المقرر؛ ومُتدرِّج التمرير الأمامي مُستعارٌ من مقرر Machine Learning 101.
1 Least squares (LA 101) -> xs = 0 1 2 3 4, ys = 1 3 5 7 9 (points on y = 1 + 2x)
2 SVD compression (LA 101) -> rank-5 image, 64x64, seed 1, k = 3 3 Backprop (ML 101) -> 2-2-1 sigmoid, x = [1,0]
اقرأ ثلاثة أرقام عبر الألسنة الثلاثة: الميل المُلائَم في لوحة المربّعات الصغرى، وقراءة “الطاقة المحفوظة” في مستكشف SVD، ومُخرَج التمرير الأمامي في مُتدرِّج الانتشار الخلفي.
في منصّة المربّعات الصغرى اختَر مجموعة النقاط المستقيمة تمامًا xs = 0 1 2 3 4، ys = 1 3 5 7 9 — النقاط على y = 1 + 2x. تحلّ الملاءمة المعادلات السَّوِيّة AᵀA x̂ = Aᵀb بلا أيّ تفاضل. توقَّع الميل المُلائَم c₁، ثمّ اقرأه.
الميل هو c₁ = 2 (والمقطع c₀ = 1 وباقي جذر متوسّط المربّعات 0): تستعيد المعادلات السَّوِيّة الخطّ بالضبط عندما تكون النقاط على استقامةٍ واحدة أصلًا. الانحدار الخطّي ليس إلا جبر مصفوفات — بلا حلقة تدريب. هذا خرج lineFit() الخاصّ بالعرض، لا رقمٌ مكتوب باليد.
انتقل إلى مستكشف SVD، واختَر صورة “rank-5” (64×64، البذرة 1)، واضبط k = 3 واقرأ قراءة “الطاقة المحفوظة” — أي الكسر (Σi≤3 σi2) / (Σi σi2) من التفكيك A = UΣVᵀ. توقَّع هل تلتقط ثلاث مُركّبات معظمَ الطاقة.
تلتقط أعلى 3 قيمٍ مفردة بالفعل 0.9939 من الطاقة — أكثر من 99%. وهذه هي فكرة تعلُّم الآلة منخفض الرتبة برُمّتها: بضعة عوامل من A = UΣVᵀ تحلّ محلّ المصفوفة كلّها، وهو ما يجعل PCA يضغط السمات وأنظمة التوصية تملأ المُدخلات الناقصة. هذا حساب svd() والطاقة المُفسَّرة الخاصّ بالعرض.
أخيرًا، افتح مُتدرِّج الانتشار الخلفي (وهو مِنصّة من مقرر Machine Learning 101) وابنِ شبكة 2-2-1 الصغيرة بـsigmoid: x = [1, 0]، W[1] = [[1,0],[0,0]]، W[2] = [[1,1]]. التمرير الأمامي جداءات مصفوفةٍ في متّجهٍ عبر σ: a[1] = [σ(1), σ(0)] = [0.7311, 0.5]، ثم z[2] = 1.2311. توقَّع ŷ = σ(1.2311)، ثم اقرأه.
يقرأ المُخرَج ŷ = 0.7740 — رقمٌ واحد في (0, 1). هذا هو التمرير الأمامي كلّه: مصفوفة في متّجه، ثم لا خطّية، ثم مرّةً أخرى، فيخرج احتمالٌ واحد. إنّه حساب المصفوفات نفسه من المرحلتَين الأولى والثانية، مكدّسًا الآن في شبكة. هذا خرج forward() الخاصّ بالعرض، لا رقمٌ مكتوب باليد.
افتح المِنصّات الثلاث وشغّل كل لبِنةٍ بنفسك: اسحب نقطةً بعيدًا عن الخطّ وراقب جذر متوسّط المربّعات يتسلّق، وارفع k وراقب إعادة بناء SVD تزداد وضوحًا، ومرِّر قيمةً عبر الشبكة وراقب ضربَ المصفوفة في كلّ طبقة. ثلاثة عروض، وحساب المصفوفات نفسه تحت كلٍّ منها.
أنتجت كل لبِنةٍ رقمًا واحدًا هو في الحقيقة حساب مصفوفات. دوّنها — املأ كل فراغ من المِنصّات، ثم أضِف جملةً واحدة من التعليل. هذا هو المُخرَج؛ ولا يوجد رقمٌ تقرأه من الشاشة هنا.
Stage 1 Regression ...... xs/ys on y = 1 + 2x slope c1 ....... ______
RMS residual ... ______
Stage 2 Factorization ... rank-5 image, k = 3 energy kept .... ______
Stage 3 Forward pass .... 2-2-1 sigmoid, x = [1,0] output y-hat ... ______
Unity note ............... why is each stage just matrix arithmetic? ______
Design note .............. which matrix would you change first, and why? ______
ثم غيّر شيئًا واحدًا — اسحب نقطةً عن الخطّ، أو أنقِص k، أو عدِّل وزنًا — ولاحظ أيّ الأرقام الثلاثة تحرّك وبأي مقدار. إنّ استجابة كل مرحلةٍ لنوع التعديل نفسه، لأنّ كل مرحلةٍ هي حساب المصفوفات نفسه، هي كامل درس المشروع.