מכונת וקטורים תומכים

מכונת תמך וקטורי (באנגלית Support Vector Machine, לרוב נכתב ונהגה כראשי-תבות SVM) היא טכניקה של למידה מונחית (supervised learning) המשמשת לניתוח נתונים לסיווג ולרגרסיה.

כנהוג בתחום זה, דוגמאות האימון מיוצגות כווקטורים במרחב ליניארי. עבור בעיות סיווג, בשלב האימון מתאימים מסווג שמפריד נכון ככל האפשר בין דוגמאות אימון חיוביות ושליליות. המסווג שנוצר ב-SVM הוא המפריד הליניארי אשר יוצר מרווח גדול ככל האפשר בינו לבין הדוגמאות הקרובות לו ביותר בשתי הקטגוריות. כאשר מוצגת נקודה חדשה, האלגוריתם יזהה האם היא ממוקמת בתוך הקו המגדיר את הקבוצה, או מחוצה לו.

SVM אינו מוגבל רק לסיווג ליניארי, ויכול לבצע גם סיווג לא ליניארי באמצעות הוספת קרנל (kernel, גרעין) שבו ממופה הקלט למרחב במימד גבוה.

==מוטיבציה==
עבור שתי קבוצות שונות של נקודות (מלאות וריקות) נדרש על מישור שיפריד ביניהן לצורך סיווג. H1 אינו מפריד בין הנקודות, H2 מפריד ביניהן אך השוליים צרים. H3 מפריד ביניהן עם הגבול השוליים הרחבים ביותר האפשריים

סיווג מידע היא פעולה נפוצה בלמידת מכונה. בהינתן אוסף נתונים אשר צריך להפריד אותם לשתי קבוצות על סמך ניסיון קודם (דוגמאות - האם דואר אלקטרוני הוא ספאם או לא; האם מוטציית גן מסוימת מסרטנת או לא; האם כלי רכב כבד הוא טנק או משאית) כאשר המטרה היא להחליט לאיזו משתי הקבוצות לשייך נקודה חדשה. כל נקודה באוסף הנתונים מיוצגת על ידי וקטור בגודל קבוע. בגישה של SVM מחלקים את הנקודות במרחב הווקטורי, באמצעות על-מישור (Hyperplane) כך שהמרווח, המרחק, בין אותו על-מישור המחלק את הנקודות לבין הנקודות הממוקמות הכי קרוב אליו, יהיה המרחק המקסימלי האפשרי.

באופן פורמלי יותר, בהינתן קבוצת אימון של n נקודות מהצורה <math>(\vec{x_1} ,y_1) ... (\vec{x_n} ,y_n) </math> כאשר:
* <math>y_i</math> הוא <math>-1</math> או <math>+1</math> ומייצג את הקבוצה לה שייכת דוגמה i.
* <math>\vec{x_i} \in \mathbb {R}^p</math> הוא וקטור מאפיינים (features, פיצ'רים) המתארים את נקודה i.
ה-SVM בונה על-מישור שהוא המפריד הליניארי (מפריד את המרחב לשני חצאי מרחבים שכל אחד מהם אמור להכיל בעיקר דוגמאות מסוג אחד), וכן שני על-מישורים מקבילים לו, אחד מכל צד, במרחק זהה, אשר מתלכדים עם דוגמת אימון אחת מכל מחלקה. מטרת ה-SVM היא להגדיל את המרחק בין המפריד הליניארי ובין כל אחד מהמישורים המקבילים (מרחק המכונה שוליים), ולמעשה למצוא את המפריד בעל השוליים הרחבים ביותר. דוגמאות האימון המתלכדות עם מישורי השוליים נקראות וקטורים תומכים, ומכאן נגזר שם האלגוריתם.

את העל-מישור ניתן לייצג באמצעות הנקודות <math>\vec {x}</math> המקיימות: <math>\vec {w}\cdot \vec{x}-b=0</math> כאשר <math>\vec{w}</math> הוא וקטור נורמלי של העל-מישור (לאו דווקא מנורמל).

=== הפרדה קשיחה (Hard margin) ===
המפריד בעל השוליים הרחבים ביותר

אם ניתן להפריד בצורה ליניארית בין הדוגמאות השייכות לכל קבוצה ניתן למצוא שני על־מישורים שיפרידו ביניהן, כך שהמרחק ביניהם יהיה מרבי. האזור התחום בין שני העל־מישורים קרוי שוליים, והעל-מישור בעל השוליים המרביים הוא העל-מישור המצוי באמצע ביניהם. את שני העל־מישורים הנ"ל ניתן לייצג באמצעות <math>\vec {w}\cdot \vec{x}-b=1</math> ו <math>\vec {w}\cdot \vec{x}-b=-1</math>. גאומטרית, המרחק בין שני העל־מישורים הנ"ל הוא <math>\frac{2}{\|\vec{w}\|}</math>, כך שעל מנת למקסם את המרחק מחפשים את ה-<math>\|\vec{w}\|</math> המינימלי.

כדי למנוע מדוגמאות האימון להימצא בשוליים, מוסיפים את האילוצים הבאים לכל דוגמה <math>i</math>:
* <math>\vec {w}\cdot \vec{x_i}-b \geq 1</math> אם הדוגמה חיובית,
* <math>\vec {w}\cdot \vec{x_i}-b \leq -1</math> אם הדוגמה שלילית.
אילוצים אלו מחייבים שכל נקודה תימצא בצד הנכון של המפריד. לחלופין, ניתן לכתוב אילוצים אלה כאילוץ יחיד 
: <math>y_i (\vec {w}\cdot \vec{x_i}-b) \geq 1</math>.

=== הפרדה רכה (Soft margin) ===
ניתן להרחיב את SVM לטיפול בבעיות שבהן אין הפרדה ליניארית בין שתי הקבוצות באמצעות פונקציית hinge loss:

: <math>\ell = \max(0,1-y_i(\vec{w}\cdot \vec{x_i}-b))</math>

נשים לב כי <math>y_i</math> הוא ערך המטרה של הדוגמה ה i (ובמקרה שלנו, 1 או -1), ו <math>\vec{w}^\cdot\vec{x}_i - b</math> הוא הפלט ה i. הערך של הפונקציה <math>\ell </math> הוא אפס רק כאשר מתקיים האילוץ <math>y_i (\vec {w}\cdot \vec{x_i}-b) \geq 1</math>, כלומר כאשר הדוגמה <math>\vec{x}_i</math> נמצאת בצד "הנכון" של השוליים. עבור דוגמאות שנמצאות בצד ה"לא נכון" של השוליים, ערך הפונקציה <math>\ell </math> פרופורציוני למרחק מהשוליים.

מטרת האופטימיזציה היא למזער את 

<math display="block"> \lVert \mathbf{w} \rVert^2 + C \left[\frac 1 n \sum_{i=1}^n \max\left(0, 1 - y_i(\mathbf{w}^\mathsf{T} \mathbf{x}_i - b)\right) \right],</math>

כאשר הפרמטר <math>C > 0</math> קובע את נקודת האיזון בין הגדלת השוליים לדרישה שלא יהיו נקודות <math>\vec{x}_i</math> בצד ה"לא נכון" של השוליים. על ידי הוספת איבר ל hinge loss ניתן להכליל את בעיית האופטימיזציה 

<math display="block">\begin{align}
&\underset{\mathbf{w},\;b,\;\mathbf{\zeta}}{\operatorname{minimize}} &&\|\mathbf{w}\|_2^2 + C\sum_{i=1}^n \zeta_i\\
&\text{subject to} && y_i(\mathbf{w}^\top \mathbf{x}_i - b) \geq 1 - \zeta_i, \quad \zeta_i \geq 0 \quad \forall i\in \{1,\dots,n\}
\end{align}</math>

עבור ערך גדול של <math>C</math> ההתנהגות תהיה דומה לזו של הפרדה קשיחה, אבל ניתן יהיה לספק את האילוצים גם אם הבעיה אינה ניתנת להפרדה ליניארית.

==היסטוריה==
הבסיס לאלגוריתם למידה חישובית זה הוצג על ידי ולדימיר ופניק ולרנר ב-1963,<ref></ref> ופותח ב-1964 על ידי ופניק ואלכסיי צ'רבוננקיס. מאז מהווה כלי מרכזי בפתרון בעיות באמצעים סטטיסטיים. ב-1992 בוסר, גויון וופניק הציגו כיצד ניתן לבנות מסווגים לא ליניאריים באמצעות טריק הקרנל.

== חישוב המסווג ==
חישוב המסווג נעשה באמצעות מינימיזציה של הביטוי
: <math>\left[\frac 1 n \sum_{i=1}^n \max\left(0, 1 - y_i(w\cdot x_i + b)\right) \right] + \lambda\lVert w \rVert^2 </math> 
הפונקציה שאותה ממזערים היא פונקציה קמורה של <math>\vec w</math> ושל <math>b</math>, שאותה ניתן למזער למשל באמצעות מהלך גרדיאנט סטוכסטי (Stochastic Gradient Descent). ניתן להשתמש ב"תעלול הגרעין" (Kernel trick) כדי לטפל בסיטואציות שבהן על-מישור לא יתאר היטב את ההפרדה בין הדוגמאות החיוביות והשליליות. למשל במקרה שבו הדוגמאות<math>\vec{x}_i</math> הן במישור הממשי הדו-ממדי, כך שהדוגמאות החיוביות נמצאות בתוך מעגל היחידה והשליליות מחוצה לו.

===קבוע ענישה===
אלגוריתם הלמידה מנסה לספק שתי מטרות: סווג נכון של דוגמאות האימון ומיקסום של השוליים. לא אחת המטרות נמצאות בסתירה, ואז יש צורך להגדיר איזו מטרה יותר חשובה. רוב המימושים של SVM מגדירים קבוע ענישה (penalty) על סווג לא נכון (מסומן באות C). ערך C גבוה פירושו העדפת הסיווג הנכון על פני שוליים רחבים, וC נמוך מעדיף הכללה (שוליים רחבים), גם במחיר שדוגמאות האימון הספציפיות אינן מסווגות נכון.

===הפרדה לא ליניארית ותעלול גרעין===
בעיית הפרדה, שימוש ב"תעלול גרעין" כדי לממש מפריד לא-ליניארי

בגרסתו הראשון של המודל שהוצגה ב-1963 על ידי ופניק, הגדיר מסווג ליניארי. ב-1992 בוסר, גויון, וופניק הציגו גישה המאפשרת להשתמש ב-SVM לסיווג לא ליניארי באמצעות שימוש ב"תעלול הגרעין" (Kernel Trick). מהלך זה מעתיק את דוגמאות האימון מהמרחב הליניארי המקורי למרחב במימד גבוה יותר, מתוך הנחה שבמרחב החדש ימצא מפריד ליניארי טוב יותר מאשר במרחב המקורי. ההעתקה נעשית בעזרת ה"תעלול" - מחליפים את המכפלה הפנימית בה משתמשים עבור המפריד הליניארי, בפונקציית גרעין (kernel function) אשר מדמה את פיזורם מחדש של הווקטורים המקוריים במרחב עשיר יותר, ללא עלות חישובית משמעותית. עם זאת המעבר למימד גבוה עלול לגרום להגדלה של טעות ההכללה.

המפריד הליניארי במרחב הווקטורי החדש הוא מפריד לא ליניארי במרחב המקורי. את מלאכת הסיווג מבצעים אף היא בעזרת אופרטור הגרעין.

פונקציות גרעין נפוצות:
* פולינום הומוגני: <math>k(\vec{x_i},\vec{x_j})=(\vec{x_i} \cdot \vec{x_j})^d</math>
* פולינום לא הומוגני: <math>k(\vec{x_i},\vec{x_j})=(\vec{x_i} \cdot \vec{x_j} + 1)^d</math>
* פונקציית בסיס רדיאלי גאוסייני (RBF; radial basis function): <math>k(\vec{x_i},\vec{x_j})=\exp(-\gamma \|\vec{x_i} - \vec{x_j}\|^2)</math> כאשר <math>\gamma > 0</math>. לעיתים מסומן באמצעות <math>\gamma=1/{2 \sigma^2}</math>. כך שכיוונון המערכת מתבצע דרך מציאת ערך לקבוע הענישה (C) ול <math>\sigma</math>
* טנגנס היפרבולי: <math>k(\vec{x_i},\vec{x_j})=\tanh(\kappa \vec{x_i} \cdot \vec{x_j}+c)</math> עבור <math>\kappa > 0 </math> ו-<math> c < 0 </math>

==מימושים נבחרים==
* ספריית libsvm, תומכת בסיווג ורגרסיה בעזרת סוגים שונים של SVM. הספרייה נכתבה במקור ב C++ וקיימות עבורה תוכנות מעטפת במגוון רב של שפות תכנות ופלטפורמות.
* svmlight
* TensorFlow ספריית הקוד הפתוח ללמידת מכונה שפותחה על ידי גוגל.
* בפייתון, חבילת SciKit-Learn כוללת מימוש של SVM וואריאציות נוספות שלו.

==קישורים חיצוניים==

== הערות שוליים ==

קטגוריה:למידת מכונה