مشكلة الخطية
في الدرس اللي فات شفنا إن الـ support vector machines (آلات المتجهات الداعمة) بتلاقي الـ hyperplane اللي الـ margin بتاعه أقصى — فكرة قوية، بس مبتشتغلش غير لما الفئتين ينفع يتفصلوا بخط مستقيم أو مستوى مسطّح. والبيانات الحقيقية نادرًا ما بتبقى بالسهولة دي. تخيّل فئتين مترتّبين في حلقات متحدة المركز، أو pattern زي XOR: مفيش hyperplane يقدر يفصلهم.
الطريقة الكلاسيكية للمسائل اللي مش خطية هي الـ feature engineering (هندسة الميزات): إنك تبني features جديدة بإيدك تخلّي المسألة بتتفصل خطيًا. مثلًا، لو بياناتك فيها feature اسمها x، ممكن تزوّد x2 كـ feature جديدة. بس الطريقة دي متعبة ومحتاجة خبرة في المجال، وكمان بتبقى مستحيلة في الأبعاد العالية.
والـ kernel trick (خدعة النواة) بيعمل الفكرة دي أوتوماتيك وبيعمّمها بشكل أنيق: بيخلّي الـ SVMs تشتغل في فضاء features أبعاده كتير جدًا (لحد ما لا نهاية) من غير ما تحسب إحداثيات الفضاء ده خالص.
الـ feature maps
رسميًا، الـ feature map (دالة تعيين الميزات) φ بتحوّل نقطة البيانات x من فضاء الـ input الأصلي لفضاء features أبعاده أعلى:
بعد ما نطبّق φ على كل الـ inputs، بندرّب linear SVM في الفضاء الجديد. الـ decision boundary خطي في فضاء الـ features، بس بيقابل حد مش خطي في فضاء الـ input الأصلي. المشكلة: لو φ نقلت لفضاء أبعاده كتير جدًا، إنك تحسب φ(x) صراحةً وبعدين تعمل dot product لنقطها بيبقى مكلّف جدًا حسابيًا.
مثلًا، الـ polynomial feature map من الدرجة التانية لـ featureين (x1، x2) بتطلّع 6 features: (1، x1، x2، x12، x1x2، x22). ولدرجة d مع p feature أصلية، حجم فضاء الـ features بيوصل O(pd) — رقم فلكي بسرعة.
الـ kernel function
وهنا الملاحظة الأساسية: في صياغة مسألة الـ SVM الـ dual (الثنائية)، نقط البيانات بتظهر بس كـ dot product φ(x)Tφ(z). مش محتاجين إحداثيات φ(x) وφ(z) لوحدهم — محتاجين الـ inner product بتاعهم بس. والـ kernel function (دالة النواة) بتحسب الحاصل ده على طول من الـ inputs الأصلية، من غير ما تبني φ خالص:
وده معناه كبير: نقدر نشتغل في فضاء أبعاده كتير جدًا (أو مالهاش نهاية) بتكلفة حسابية زي إنك تقيّم function بسيطة في الفضاء الأصلي. والتعقيد الحسابي بيعتمد على البُعد الأصلي، مش على بُعد فضاء الـ features.
الـ kernel بيبقى صالح إمتى؟
مش كل function K(x، z) بتقابل inner product صحيح في فضاء ما. الـ function K تبقى kernel صالح (اسمه كمان Mercer kernel (نواة ميرسر)) لو وبس لو الـ kernel matrix K (اللي فيها Kij = K(xi، xj)) positive semi-definite (شبه محددة موجبة) لكل training sets الممكنة. وده شرط ميرسر (Mercer's condition).
وبالإحساس، الـ matrix الـ positive semi-definite بتضمن إننا بنحسب inner products في فضاء inner product صحيح. ولو الشرط ده متحققش، ممكن الـ optimization ميبقاش ليه حل واحد أو ميتقاربش. وعمليًا، الـ kernels المعتادة (RBF، polynomial، linear) كلها بتحقق شرط ميرسر، ونادرًا ما بنحتاج نتأكد منه صراحةً.
الـ kernels المشهورة
مجموعة صغيرة من الـ kernels المعتادة كفاية لأغلب المسائل العملية:
| الـ kernel | المعادلة | فضاء الـ features |
|---|---|---|
| linear | K(x,z) = xTz | الفضاء الأصلي (من غير نقل) |
| polynomial | K(x,z) = (xTz + c)d | كل الـ monomials لحد الدرجة d |
| RBF / Gaussian | K(x,z) = exp(−γ‖x−z‖²) | أبعاده مالهاش نهاية |
| sigmoid | K(x,z) = tanh(κxTz + θ) | بيقرّب layer في neural network |
الـ RBF kernel بالتفصيل
الـ radial basis function (RBF) kernel (نواة دالة الأساس الشعاعي)، أو الـ Gaussian kernel، هو الأكتر استخدامًا. بيقيس التشابه كـ Gaussian function في المسافة الإقليدية بين نقطتين:
الـ RBF kernel بيقابل فضاء features أبعاده مالهاش نهاية — وتقدر تتأكد من ده بفك Taylor series بتاعة الأُسّي. ومع كده، التدريب والتنبؤ بيفضلوا ممكنين لأننا مبنحسبش غير K(xi، xj) ومبنحسبش φ(x) أبدًا. والـ RBF kernel هو universal approximator: ببيانات كفاية وقيمة γ مناسبة، يقدر يمثّل أي decision boundary مستمر.
الـ parameter γ في الـ RBF kernel ساعات بيتكتب 1/(2σ2) فبيرتبط بالـ variance بتاع الـ Gaussian. والقيمة الافتراضية المعتادة γ = 1/عدد_الـ features (الافتراضي في scikit-learn). وزي C، بيتظبط بالـ cross-validation. γ كبير بيخاطر بالـ overfitting (الحد بيحفظ نقط التدريب)؛ وγ صغير بيخاطر بالـ underfitting (الحد أنعم من اللازم).
ليه الصياغة الـ dual مهمة؟
الـ kernel trick محتاج البيانات تظهر كـ dot products بس. وده مضمون لما نشتغل في الشكل الـ dual للـ optimization بتاع الـ SVM. والصياغة الـ dual بتعيد كتابة مسألة الـ SVM الأصلية (تصغير ‖w‖ مع القيود) كمسألة مكافئة على الـ Lagrange multipliers (مضاعفات لاغرانج) αi:
وبعد ما نحل الصياغة الـ dual، التنبؤ لنقطة جديدة x بيبقى:
المجموع ماشي على الـ support vectors بس (اللي عندها αi > 0)، وده بيخلّي التنبؤ كفء. وتعقيد المسألة الـ dual من O(n2) لـ O(n3) في عدد أمثلة التدريب n — ودي عنق الزجاجة الأساسي في إن الـ SVMs تكبر مع datasets ضخمة جدًا.
اختيار الـ kernel المناسب
اختيار الـ kernel فن وعلم في نفس الوقت. ودي شوية إرشادات عملية:
الـ linear kernel: ابدأ بيه. أسرع في التدريب وأسهل في التفسير. ولو بياناتك فيها features أكتر بكتير من الأمثلة (text classification، علم الجينوم)، الـ linear SVM غالبًا بيغلب اللي مش خطي.
الـ RBF kernel: الاختيار الافتراضي لأغلب المسائل لما الـ linear kernel ميكفيش. اختيار آمن لما ميبقاش عندك معرفة مسبقة قوية بشكل البيانات. ظبط C وγ مع بعض بـ grid search على مقياس لوغاريتمي.
الـ polynomial kernel: مفيد لما تكون شايف إن تفاعل الـ features مهم عند درجة معيّنة. الدرجة التانية مشهورة في مهام الـ computer vision. وأقل استقرارًا عدديًا من الـ RBF في الدرجات العالية.
الـ custom kernels: تقدر تعرّف K بتاعك طالما بيحقق شرط ميرسر. والـ kernels الخاصة بالمجال — string kernels للنصوص، وgraph kernels للجزيئات — تقدر تحط معرفة المجال على طول في مقياس التشابه.
من الاستنتاجات الأنيقة للـ kernel trick: الـ model كله متشفّر في الـ kernel matrix K. أي algorithmين بيستخدموا نفس الـ kernel على نفس البيانات هيطلّعوا نفس الـ decision boundary، مهما كان تنفيذهم من جوه. وعشان كده طرق الـ kernel modular بمرونة — لما تبدّل الـ kernel بتبدّل مفهوم التشابه من غير ما تغيّر أي حاجة تانية في الـ algorithm.
نقط القوة والقيود
الـ kernel SVMs بتدّي مرونة من غير feature engineering صريح. مبنية على أساس متين، وليها ضمانات generalization قوية، وبتشتغل كويس حتى مع البيانات القليلة. والـ RBF kernel هو universal approximator وهيقرّب، بأمثلة كفاية، أي decision boundary ناعم.
القيد الأساسي هو الـ scalability (قابلية التوسع). تخزين الـ kernel matrix وحلها بياكلوا O(n2) memory وO(n3) وقت تدريب. ولـ datasets أكبر من ~100 ألف مثال، الـ kernel SVMs بتبقى مش عملية من غير طرق تقريب (زي Nyström approximation أو random features). وعشان كده الـ deep learning، اللي بيكبر خطيًا مع حجم الـ dataset عن طريق الـ stochastic gradient descent، خد مكان الـ SVMs في المهام الكبيرة — والـ kernel SVMs لسه بتنافس على الـ datasets الصغيرة والمتوسطة.
- الـ kernel trick بيخلّي الـ SVMs تشتغل في فضاءات features أبعادها عالية من غير ما تحسب الـ feature map φ صراحةً.
- الـ kernel function K(x, z) بتحسب الـ inner product φ(x)·φ(z) على طول من الـ inputs الأصلية.
- شرط ميرسر (kernel matrix positive semi-definite) بيضمن إن الـ kernel بيقابل فضاء inner product صحيح.
- التلات kernels المعتادين: linear (من غير نقل)، وpolynomial (monomials لحد الدرجة d)، وRBF (Gaussian أبعاده مالهاش نهاية).
- الـ RBF kernel هو الأكتر استخدامًا؛ وγ بيتحكم في عرض جرس التشابه — γ كبير معناه حد معقّد، وγ صغير معناه حد ناعم.
- في الصياغة الـ dual، التنبؤ بيستخدم تقييمات الـ kernel قصاد الـ support vectors بس، وده بيخلّيه كفء حتى في فضاءات أبعادها مالهاش نهاية.
- الـ kernel SVMs بتكبر بـ O(n²) في الـ memory وO(n³) في التدريب — مش عملية للـ datasets الضخمة جدًا من غير تقريب.