الجبر الخطي عمليًا
درس 5 من 9
5الجبر الخطي عمليًا
الصورة الكبيرةثلاث أفكار فقط ترافقك إلى آخر المسار: المتجه كمعنى، والضرب النقطي كتشابه، والمصفوفة كتحويل. لا مبرهنات، فقط ما ستستخدمه فعلًا.
ماذا تشاهد في الرسم: المستندان a وb عن الشبكات والتدريب فالزاوية بينهما صغيرة، والمستند c عن الطبخ فيكاد يكون عموديًا على a. التشابه الجيبي يقرأ هذه الزاوية ويتجاهل طول السهم.
خارطة هذا الجزء
المفاهيم بالترتيب، اضغط أيًّا منها للقفز إليه:
طريقان إلى نفس الفكرة
المتجه قائمة أرقام تصف شيئًا: طول الشخص ووزنه وعمره مثلًا. لو وصفنا كل كلمة بمتجه، نستطيع أن نقيس كم تتشابه كلمتان بمقارنة متجهيهما. والمصفوفة آلة تحوّل المتجه: تدوّره أو تمدّه أو تنقله إلى مكان آخر. هذا كل ما تحتاجه لتفهم النماذج.
المتجه نقطة في فضاء أبعاده السمات. الضرب النقطي a @ b يقيس التوافق، وبعد القسمة على الطولين يصير التشابه الجيبي. وضرب المصفوفة في متجه تحويل خطي، وهو ما تفعله كل طبقة Linear في الشبكة العصبية: y = W @ x + b.
قبل أن تبدأ
🧱المصفوفات
تعرف shape والعمليات عنصرًا بعنصر من درس المصفوفات.
📐هندسة المدرسة
تتذكّر الزاوية القائمة، وأن الطول يُحسب بالجذر التربيعي لمجموع المربعات.
الفكرة الجوهرية
ثلاث أفكار بالترتيب: المتجه كمعنى، ثم الضرب النقطي والتشابه الجيبي كقياس للتشابه، ثم المصفوفة كتحويل.
1المتجه كمعنى
المتجه قائمة أرقام تمثّل شيئًا واحدًا. هنا كل مستند يُمثَّل بعدد مرات ظهور أربع كلمات فيه.
انظر إلى الرسم: المستند a فيه «شبكة» مرتين و«تدريب» ثلاث مرات، ولا يذكر الطبخ أبدًا.
كل رقم يقيس بعدًا من المعنى، فيصير المستند نقطة في فضاء. والقرب في هذا الفضاء يعني التشابه، وهو المكان الذي يعمل فيه كل بحث متجهي ستبنيه.
2الضرب النقطي: اضرب واجمع
اضرب العنصرين المتقابلين في كل موضع، ثم اجمع النواتج. انظر إلى الرسم: ناتج كل كلمة بين المستندين a وb.
الرقم يكبر حين يتّفق المتجهان في الاتجاه، ويصير صفرًا حين لا يشتركان في شيء. وهذه العملية الواحدة هي جوهر الطبقة الكثيفة وجوهر الانتباه.
3التشابه الجيبي: اقسم على الطول
للضرب النقطي الخام عيب: المستند الطويل أرقامه أكبر، فيبدو أنه يشبه كل شيء. الحل أن تقسم على طولي المتجهين، فتقارن الاتجاه وحده.
import numpy as np
vocab = ["شبكة", "تدريب", "بيانات", "طبخ"]
doc_a = np.array([2, 3, 1, 0])
doc_b = np.array([1, 2, 2, 0])
doc_c = np.array([0, 0, 1, 4])
def cosine(u, v):
return float(u @ v) / (float(np.linalg.norm(u)) * float(np.linalg.norm(v)))
print(int(doc_a @ doc_b))
print(f"a.b = {cosine(doc_a, doc_b):.3f}")
print(f"a.c = {cosine(doc_a, doc_c):.3f}")
print(f"b.c = {cosine(doc_b, doc_c):.3f}")
المستندان الأول والثاني عن الشبكات والتدريب فتشابههما 0.891، والثالث عن الطبخ فتشابهه مع الأول 0.065 أي قريب من الصفر. لم نستخدم أي نموذج هنا، فقط أربعة أرقام وزاوية بينها. هذه هي النواة التي ستبني عليها الاسترجاع كله.
4المصفوفة كتحويل
المصفوفة تأخذ متجهًا وتعيد متجهًا آخر: تدوّره أو تمدّه أو تفعل الاثنين. انظر إلى الرسم: النقطة [2, 1] قبل التحويل وبعد كل تحويل.
import numpy as np rotate = np.array([[0.0, -1.0], [1.0, 0.0]]) stretch = np.array([[3.0, 0.0], [0.0, 1.0]]) point = np.array([2.0, 1.0]) print([round(float(v), 1) for v in rotate @ point]) print([round(float(v), 1) for v in stretch @ point]) print([round(float(v), 1) for v in (stretch @ rotate) @ point]) print([round(float(v), 1) for v in (rotate @ stretch) @ point]) print(round(float(np.linalg.norm(point)), 3))
لاحظ السطرين الثالث والرابع: stretch @ rotate أعطى [-3.0, 2.0] وrotate @ stretch أعطى [-1.0, 6.0]. نفس التحويلين وترتيب مختلف ونتيجة مختلفة، ولهذا ترتيب الطبقات في الشبكة ليس تفصيلًا شكليًا.
كل طبقة في الشبكة مصفوفة تحوّل متجهًا إلى آخر، والتدريب هو تعديل أرقامها حتى يصير التحويل مفيدًا. ولأن الترتيب يغيّر النتيجة، فترتيب الطبقات ليس تفصيلًا شكليًا.
كيف يعمل، خطوة بخطوة: كيف يُحسب التشابه الجيبي بين مستندين
مثّل كل مستند بعدد مرات ظهور كل كلمة من المفردات، فيصير doc_a المتجه [2, 3, 1, 0].
احسب الضرب النقطي: اضرب المتقابلين واجمع، فيعطي doc_a @ doc_b القيمة 10.
احسب طول كل متجه بـ np.linalg.norm، أي الجذر التربيعي لمجموع مربعات عناصره.
اقسم الضرب النقطي على حاصل ضرب الطولين. العدّ لا يكون سالبًا، فيقع الناتج هنا بين 0 و1، وهو 0.891 لـ a وb.
مثال محلول
جرّب بلا كود
خرافة مقابل حقيقة
| الخرافة | الحقيقة |
|---|---|
| الضرب النقطي الأكبر يعني تشابهًا أكبر. | المتجه الأطول يعطي ضربًا أكبر مع كل شيء، ولذلك يتصدّر المستند الأطول كل بحث. اقسم على الطولين أولًا. |
| ترتيب ضرب المصفوفات لا يهمّ، كضرب الأرقام. | في الدرس أعطى stretch @ rotate النتيجة [-3.0, 2.0] وأعطى rotate @ stretch النتيجة [-1.0, 6.0]. ضرب المصفوفات غير تبادلي. |
| تحتاج الجبر الخطي كله قبل أن تبدأ. | ثلاث أفكار تكفي لهذا المسار: المتجه كمعنى، والضرب النقطي كتشابه، والمصفوفة كتحويل. |
جرّب بنفسك
تبني بحثًا في مستندات، وتلاحظ أن أطول مستند عندك يظهر في أعلى النتائج لأي استعلام. ما السبب الأرجح؟
بلا تطبيع، المستند الطويل له أرقام أكبر في كل بعد فحاصله النقطي أكبر مع أي استعلام تقريبًا. القسمة على المعيار، أي التشابه الجيبي، تحذف تأثير الطول وتقارن الاتجاه فقط. هذه نفس الزلّة التي تقع فيها أنظمة استرجاع كاملة قبل أول تقييم رقمي لها.
بطاقات مراجعة سريعة
تحقق من فهمك
متجهان تشابههما الجيبي 0. ماذا يعني ذلك عمليًا؟
أنهما متعامدان ولا يشتركان في أي بعد له قيمة في كليهما. في تمثيل الكلمات هذا يعني مستندين لا تتقاطع مفرداتهما إطلاقًا. ولاحظ أن الصفر لا يعني «متناقضان» بل «لا علاقة»، والتناقض لا يُقاس بهذه الطريقة أصلًا.
ما طول المتجه [2.0, 1.0]، ولماذا؟
2.236، لأنه الجذر التربيعي لـ 2² + 1²، أي جذر 5، وهو ما طبعه السطر الأخير في مثال التحويل.
مصادر هذا الدرس
مرتّبة بالنوع. ابدأ بالتوثيق الرسمي إذا تبي المرجع الدقيق، وبالمقال أو الفيديو إذا تبي الشرح أولًا.
خلّصت الدرس؟
سجّل الدخول ليُحفظ تقدّمك.