Perceptron: אבן בניין של רשת עצבית מלאכותית

צומת המקור: 1216283

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

השראה ביולוגית של רשתות עצביות

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

1: נוירון ביולוגי מול רשת עצבית מלאכותית

מקור תמונה: ווילמס, ק' (2017, 2 במאי). הדרכה של Keras: למידה עמוקה בפייתון.

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

בהשראת התפקוד הביולוגי של נוירון, מדען אמריקאי פרנק רוזנבלט הגה את המושג פרספטרון במעבדה אווירונאוטית של קורנל ב-1957.

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

מרכיבים עיקריים של Perceptron

הפרספטרון של רוזנבלט הוא בעצם מסווג בינארי. הפרספטרון מורכב מ-3 חלקים עיקריים:

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

נראה עוד על אלה בסעיף הבא.

עבודה של Perceptron

בשלב הראשון, כל ערכי הקלט מוכפלים עם המשקלים המתאימים ומתווספים יחד. התוצאה המתקבלת נקראת סכום משוקלל ∑wi*xi, או נאמר אחרת,  x1*w1 + x2*w2 +…wn*xn. סכום זה נותן ייצוג הולם של התשומות בהתאם לחשיבותן. בנוסף, מונח הטיה b מתווסף לסכום זה ∑wi*xi + b. הטיה משמשת כפרמטר נוסף של הדגם (בנוסף למשקלים) שניתן לכוונן כדי לשפר את ביצועי הדגם.

בשלב השני, פונקציית הפעלה f מוחל על הסכום הנ"ל ∑wi*xi + b כדי לקבל פלט Y = f(∑wi*xi + b). בהתאם לתרחיש ולפונקציית ההפעלה שבה נעשה שימוש, ה תְפוּקָה הוא או בינרי {1, 0} או ערך מתמשך. 

עבודה של Perceptron

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

פונקציות הפעלה

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

אם  ∑wi*xi + b > 0:
פלט = 1
אַחֵר:
פלט = 0

הגרף שלו יהיה בערך כך:

פונקציות הפעלה

זוהי למעשה פונקציית ההפעלה של Unit Step (Threshold) אשר שימשה במקור על ידי Rosenblatt. אבל כפי שאתה יכול לראות, הפונקציה הזו היא בלתי רציפה ב-0, ולכן היא גורמת לבעיות בחישובים מתמטיים. גרסה חלקה יותר של הפונקציה לעיל היא הפונקציה הסיגמואידית. הוא מוציא בין 0 ל-1. אחד נוסף הוא ה-Hyperbolic tangent(tanh) function, המייצרת את הפלט בין -1 ל-1. גם פונקציות סיגמואיד וגם פונקציות tanh סובלות מבעיות של גרדיאנטים נעלמים. כיום, ReLU ו-Leaky ReLU הן פונקציות ההפעלה הנפוצות ביותר בשימוש. הם יציבים יחסית ברשתות עמוקות.

Perceptron כמסווג בינארי

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

ייבוא ​​מספר ספריות -

מאת sklearn.datasets ייבוא ​​make_blobs
ייבא matplotlib.pyplot בתור plt
ייבוא ​​numpy בתור np
%matplotlib מוטבע

יצירת מערך נתונים דמה באמצעות לעשות_כתמים פונקציונליות המסופקת על ידי sikit learn -

# צור מערך נתונים
X, Y = make_blobs(n_features = 2, centers = 2, n_samples = 1000, random_state = 12)
# הדמיית מערך נתונים
plt.figure(figsize = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = Y)
plt.title('Ground truth', fontsize = 18)
plt.show()
Perceptron כמסווג בינארי

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

לפני שנמשיך הלאה, הבה נוסיף מונח הטיה (אחדים) לווקטור הקלט -

# הוסף הטיה לווקטור הקלט
X_bias = np.ones([X.shape[0], 3])
X_bias[:, 1:3] = X

מערך הנתונים ייראה בערך כך

מערך נתונים

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

w = w + (צפוי - חזוי) * x

Perceptron w

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

אנו מתחילים בהקצאת ערכים שרירותיים לווקטור המשקל, ואז אנו מתאימים אותם בהדרגה בכל איטרציה באמצעות השגיאה והנתונים הקיימים -

# אתחול משקלים עם ערכים אקראיים
w = np.random.rand(3, 1)
print(w)

פלט:

[[0.37547448]
[0.00239401] [0.18640939]]

הגדר את פונקציית ההפעלה של פרצפטרון -

def activation_func(z): אם z >= 1: החזר 1 אחר: החזר 0

לאחר מכן, אנו מיישמים את כלל למידת הפרצפטרון -

עבור _ בטווח(100): עבור i בטווח(X_bias.shape[0]): y = activation_func(w.transpose().dot(X_bias[i, :])) # עדכן משקלים w = w + (( Y[i] - y) * X_bias[i, :]).reshape(w.shape[0], 1)

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

עכשיו, כשהשגנו את המשקולות האופטימליות, אנחנו חזה את המחלקה עבור כל נקודת נתונים באמצעות Y = f(∑wi*xi + b) או Y = wT.x בצורה וקטורית.

# חיזוי המחלקה של נקודות הנתונים
result_class = [activation_func(w.transpose().dot(x)) עבור x ב-X_bias]

דמיינו את גבול ההחלטה ואת תוויות המעמד החזוי -

# המר לוקטור יחידה
w = w/np.sqrt(w.transpose().dot(w))‎
# הדמיית תוצאות
plt.figure(figsize = (6, 6))
plt.scatter(X[:, 0], X[:, 1], c = result_class)
plt.plot([-10, -1], hyperplane([-10, -1], w), lw = 3, c = 'red')
plt.title('סיווג פרספטרון עם גבול החלטה')
plt.show()
סיווג פרספטרונים עם גבול החלטה

אתה יכול להשוות את תמונת האמת הבסיסית עם תמונת התוצאה החזויה ולראות כמה נקודות שסווגות בצורה שגויה. אם מחשבים את הדיוק, הוא מגיע לכ-98% (אני משאיר זאת כתרגיל לקוראים).

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

הערות סיום

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

על המחבר

פרטיק נבריה הוא מדען נתונים מיומן המועסק כיום בחברת Analytics ובינה מלאכותית שבסיסה מנואידה. הוא בקיא בלמידת מכונה, למידה עמוקה, NLP, ניתוח סדרות זמן, מניפולציה של נתונים, SQL, Python, ומכיר את העבודה בסביבת ענן. בזמנו הפנוי, הוא אוהב להתחרות בהאקתונים, ולכתוב מאמרים טכניים.

המדיה המוצגת במאמר זה אינה בבעלות Analytics Vidhya ונעשה בהם שימוש לפי שיקול דעתו של המחבר.

מקור: https://www.analyticsvidhya.com/blog/2021/10/perceptron-building-block-of-artificial-neural-network/

בול זמן:

עוד מ אנליטיקה וידיה