רשתות נוירונים: פונקציות הפעלה

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

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

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

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

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

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

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

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

שלוש פונקציות מתמטיות שנמצאות בשימוש נפוץ כפונקציות הפעלה: sigmoid, tanh ו-ReLU.

הפונקציה sigmoid (המפורטת למעלה) מבצעת את הטרנספורמציה הבאה בקלט $x$, תוך יצירת ערך פלט בין 0 ל-1:

\[F(x)=\frac{1} {1+e^{-x}}\]

הנה תרשים של הפונקציה:

איור 4.  תרשים של פונקציית הסיגמואיד: עקומה בצורת s
      מתקרב לציר ה-X באופן אסיפטמטי כאשר x מתקרב לתוצאה שלילית
      אינסוף ו-1 כש-x מתקרב לאינסוף.
איור 4. תרשים של פונקציית sigmoid.

הפונקציה tanh (קיצור של 'טנגנס היפרבולי') ממירה את הקלט $x$ ל- מפיקה ערך פלט בין -1 ל-1:

\[F(x)=tanh(x)\]

הנה תרשים של הפונקציה:

איור 5.  תרשים של הפונקציה tanh:
      תלולה יותר בצורת s מהפונקציה סיגמואיד,
      מתקרב ל-1 כש-x מתקרב לאינסוף שלילי ו-1 מתקרב ל-x
      אינסוף.
איור 5. תרשים של הפונקציה tanh.

פונקציית ההפעלה של יחידה לינארית מיושרת (או ReLU, במקרה קצר) משנה את הפלט באמצעות האלגוריתם הבא:

  • אם ערך הקלט $x$ קטן מ-0, מוחזר 0.
  • אם ערך הקלט $x$ גדול מ-0 או שווה לו, מוחזר ערך הקלט.

אפשר לייצג ReLU באופן מתמטי באמצעות הפונקציה max() :

$$F(x)=max(0,x)$$

הנה תרשים של הפונקציה:

איור 6. תרשים של פונקציית ReLU: קו אופקי
      לאורך ציר ה-X מאינסוף שלילי ל-0, שהופך לקו אלכסוני
      עולה וימינה עם שיפוע 1 (y=x) מ-0 עד אינסוף.
איור 6. חלקה של פונקציית ReLU.

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

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

בפועל, כל פונקציה מתמטית יכולה לשמש כפונקציית הפעלה. נניח שהשדה \(\sigma\) מייצג את פונקציית ההפעלה שלנו. הערך של צומת ברשת נקבע לפי נוסחה:

$$\sigma(\boldsymbol w \cdot \boldsymbol x+b)$$

Keras מספקת תמיכה מובנית ללקוחות רבים פונקציות הפעלה. עם זאת, עדיין מומלץ להתחיל ב-ReLU.

סיכום

הסרטון הבא מספק סיכום של כל מה שלמדתם עד עכשיו על המבנה של רשתות נוירונים:

המודל שלנו כולל את כל הרכיבים הרגילים של הפעולות שאנשים בדרך כלל הם מתכוונים כשהם מתייחסים לרשת נוירונים:

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

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