تُرجِمت هذه الدروس تلقائيًا إلى العربية ولم تخضع بعد لمراجعة بشرية. إذا بدت أي صياغة غريبة، فالنسخة الإنجليزية هي المرجع.
يحتاج كل نظام ذكاء اصطناعي إلى تخزين البيانات واسترجاعها بسرعة. سواء أكان ذلك قائمة بقيم البكسل في صورة ما، أو مفردات مكونة من 50000 كلمة، أو ملايين من تفضيلات المستخدم، فإن اختيار بنية البيانات يحدد مدى سرعة تفكير الذكاء الاصطناعي لديك.
يهيمن هيكلان: المصفوفات وخرائط التجزئة. أتقن هذه الأمور، وستحصل على الأساس لكل مسارات الذكاء الاصطناعي تقريبًا.
المصفوفة هي ببساطة قائمة مرقمة من العناصر المخزنة جنبًا إلى جنب في الذاكرة. يحتوي كل عنصر على فهرس - موضعه في القائمة، بدءًا من الصفر.
index: 0 1 2 3 4
value: ["cat", "dog", "bird", "fish", "frog"]
نظرًا لوجود العناصر بجوار بعضها البعض، يمكنك القفز مباشرة إلى أي موضع. تريد البند 3؟ تم - لا حاجة للبحث. هذا هو الوصول O(1)، مما يعني أن الأمر يستغرق نفس الوقت سواء كانت المصفوفة تحتوي على 10 عناصر أو 10 ملايين.
يعد إدخال أو إزالة العناصر في المنتصف أمرًا مكلفًا. يجب أن يتم خلط كل عنصر بعد التغيير. هذا O(n) - كلما زاد عدد العناصر، كلما استغرق الأمر وقتًا أطول.
إذا كانت لديك قائمة تشغيل تضم 10000 أغنية وأردت إدراج مسار جديد في الموضع 5، فستحتاج كل أغنية من الموضع 5 فصاعدًا إلى النقل. كيف يمكن لخدمة البث التعامل مع هذا دون تباطؤ؟
تقوم خريطة التجزئة (وتسمى أيضًا القاموس أو جدول التجزئة) بتخزين البيانات على هيئة أزواج قيمة المفتاح. بدلاً من الوصول إلى العناصر عن طريق رقم الفهرس، يمكنك الوصول إليها عن طريق مفتاح ذي معنى.
word_counts = {
"hello": 42,
"world": 37,
"AI": 156
}
سجّل الدخول للانضمام إلى النقاش
هل تحتاج إلى العد لـ "AI"؟ تستخدم خريطة التجزئة وظيفة التجزئة لتحويل المفتاح إلى فهرس خلف الكواليس. النتيجة؟ O(1) متوسط وقت البحث - تمامًا مثل المصفوفات، ولكن باستخدام الأسماء بدلاً من الأرقام.
قواميس بايثون هي خرائط التجزئة. عندما يقوم ChatGPT بحساب ترددات الكلمات أثناء التدريب، فإنه يستخدم هياكل تشبه خريطة التجزئة لتتبع مليارات تكرارات الكلمات عبر نص الإنترنت بالكامل.
| عملية | صفيف | خريطة التجزئة | |-----------|------|----------| | الوصول عن طريق الفهرس | يا(1)⚡ | لا يوجد | | الوصول عن طريق المفتاح | O(ن) 🐢 | يا(1)⚡ | | أدخل في النهاية | يا(1)⚡ | يا(1)⚡ | | أدخل في المنتصف | O(ن) 🐢 | لا يوجد | | البحث عن القيمة | O(ن) 🐢 | يا(1)⚡ |
فكر في O(1) على أنه "فوري، بغض النظر عن الحجم" وO(n) على أنه "أبطأ كلما كبرت البيانات".
لديك 100000 ملف تعريف مستخدم وتحتاج إلى العثور على مستخدم من خلال اسم المستخدم الخاص به. أي هيكل هو الأسرع؟
أحد الأنماط الأكثر فائدة في كل من المقابلات والذكاء الاصطناعي هو حساب الأحداث. ها هي الفكرة في الكود الكاذب:
counts = {}
for each word in text:
if word in counts:
counts[word] = counts[word] + 1
else:
counts[word] = 1
يمنحك هذا المرور الفردي عبر النص تردد كل كلمة. تستخدم النماذج اللغوية هذا النهج بالضبط (على نطاق واسع) لفهم الكلمات الأكثر أهمية.
بالنظر إلى مجموعة من الأرقام والهدف، ابحث عن رقمين يضافان إلى الهدف. يتحقق النهج الساذج من كل زوج - O(n²). يستخدم النهج الذكي خريطة التجزئة:
seen = {}
for each number in array:
complement = target - number
if complement in seen:
return [seen[complement], current_index]
seen[number] = current_index
تمريرة واحدة، O(ن) الوقت. تتذكر خريطة التجزئة ما رأيته بالفعل.
لماذا يعتبر نهج خريطة التجزئة للمجموع الثنائي أسرع من التحقق من كل زوج؟
يحتاج محرك التوصيات إلى التحقق مما إذا كان المستخدم قد شاهد فيلمًا بالفعل قبل اقتراحه. هل ستقوم بتخزين سجل مشاهدة المستخدم في مصفوفة أم في خريطة تجزئة؟ ما هي المقايضات التي تتبادر إلى ذهنك؟
يقوم نموذج الذكاء الاصطناعي بتخزين تضمينات الكلمات كمصفوفات تحتوي كل منها على 300 رقم. لماذا المصفوفات خيار جيد هنا؟
أصبحت تعرف الآن الأداتين الأساسيتين في تعامل الذكاء الاصطناعي مع البيانات. في الدرس التالي، السلاسل ومعالجة النصوص، سنرى كيف يحوّل الذكاء الاصطناعي النص الخام إلى شيء يستطيع النموذج قراءته فعلًا، وهي الخطوة الأولى وراء كل روبوت محادثة ومربع بحث تستخدمه.