הדגמה של הפצת רקע
$$ \definecolor{input}{RGB}{66, 133, 244} \definecolor{output}{RGB}{219, 68, 55} \definecolor{dinput}{RGB}{244, 180, 0} \definecolor{doutput}{RGB}{15, 157, 88} \definecolor{dweight}{RGB}{102, 0, 255} $$

אלגוריתם לחזרה

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

יש לגלול למטה...

רשת נוירונים פשוטה

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

הצמתים בשכבות הסמוכות מחוברים למשקלים \(w_{ij}\), שהם הפרמטרים של הרשת.

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

לכל צומת יש סה"כ קלט \(\color{input}x\), פונקציית הפעלה \(f(\color{input}x\color{black})\) ופלט \(\color{output}y\color{black}=f(\color{input}x\color{black})\). \(f(\color{input}x\color{black})\) הפונקציה צריכה להיות לא לינארית, אחרת הרשת המוחשית תוכל ללמוד מודלים לינאריים בלבד.

פונקציית הפעלה נפוצה היא פונקציית Sigmoid: \(f(\color{input}x\color{black}) = \frac{1}{1+e^{-\color{input}x}}\).

פונקציית שגיאה

המטרה היא לקבל מידע על המשקלים של הרשת באופן אוטומטי על סמך נתונים כך שהפלט החזוי \(\color{output}y_{output}\) יהיה קרוב ליעד \(\color{output}y_{target}\) בכל הקלט \(\color{input}x_{input}\).

כדי לבדוק את המרחק שלנו מהיעד, אנחנו משתמשים בפונקציית שגיאה \(E\). פונקציית שגיאה נפוצה היא \(E(\color{output}y_{output}\color{black},\color{output}y_{target}\color{black}) = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2 \).

ריבוי קדימה

אנחנו מתחילים בדוגמת קלט \((\color{input}x_{input}\color{black},\color{output}y_{target}\color{black})\) ומעדכנים את שכבת הקלט של הרשת.

כדי לשמור על עקביות, אנחנו מחשיבים את הקלט כמו כל צומת אחר, אך ללא פונקציית הפעלה, כך שהפלט שלו שווה לקלט שלו. כלומר, \( \color{output}y_1 \color{black} = \color{input} x_{input} \).

ריבוי קדימה

עכשיו אנחנו מעדכנים את השכבה המוסתרת הראשונה. אנחנו מביאים את הפלט \(\color{output}y\) של הצמתים בשכבה הקודמת ומשתמשים בשקלול כדי לחשב את הקלט \(\color{input}x\) של הצמתים בשכבה הבאה.
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i\color{black} +b_j$$

ריבוי קדימה

לאחר מכן, אנחנו מעדכנים את הפלט של הצמתים בשכבה המוסתרת הראשונה. לשם כך אנחנו משתמשים בפונקציית ההפעלה, \( f(x) \).
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$

ריבוי קדימה

באמצעות שתי הנוסחאות האלה, אנחנו מפיצים את שאר הרשת ומפיקים את הפלט הסופי של הרשת.
$$ \color{output} y \color{black} = f(\color{input} x \color{black})$$
$$ \color{input} x_j \color{black} = $$$$ \sum_{i\in in(j)} w_{ij}\color{output} y_i \color{black} + b_j$$

נגזרת של שגיאה

אלגוריתם ההפצה החוזר קובע כמה לעדכן כל משקל של הרשת אחרי השוואה בין הפלט הצפוי לבין הפלט הרצוי בדוגמה ספציפית. לשם כך, עלינו לחשב כיצד השגיאה משתנה ביחס לכל משקל \(\color{dweight}\frac{dE}{dw_{ij}}\).
אחרי שנקבל שגיאות נגזרות, נוכל לעדכן את המשקלים באמצעות כלל עדכון פשוט:
$$w_{ij} = w_{ij} - \alpha \color{dweight}\frac{dE}{dw_{ij}}$$
שבו \(\alpha\) הוא קבוע, נקרא 'שיעור למידה', וצריך להתאים אותו בצורה אמפירית.

[הערה] כלל העדכון הוא פשוט מאוד: אם השגיאה יורדת כאשר המשקל עולה (\(\color{dweight}\frac{dE}{dw_{ij}}\color{black} < 0\)), אז מעלים את המשקל, אחרת אם העלייה במשקל גדולה יותר (\(\color{dweight}\frac{dE}{dw_{ij}} \color{black} > 0\)) ואז יורדת המשקל.

נגזרות נוספות

כדי לעזור לחשב \(\color{dweight}\frac{dE}{dw_{ij}}\), אנחנו מאחסנים גם לכל צומת שתי נגזרות נוספות: איך השגיאה משתנה עם:
  • הקלט הכולל של הצומת \(\color{dinput}\frac{dE}{dx}\)
  • הפלט של הצומת \(\color{doutput}\frac{dE}{dy}\).

ריבוי גב

שנתחיל להפיץ את הנגזרים של השגיאות? מכיוון שיש לנו את הפלט הצפוי של דוגמת הקלט הספציפית הזו, אנחנו יכולים לחשב איך השגיאה משתנה בפלט הזה. בהתאם לפונקציית השגיאות שלנו \(E = \frac{1}{2}(\color{output}y_{output}\color{black} - \color{output}y_{target}\color{black})^2\) יש לנו:
$$ \color{doutput} \frac{\partial E}{\partial y_{output}} \color{black} = \color{output} y_{output} \color{black} - \color{output} y_{target}$$

ריבוי גב

עכשיו \(\color{doutput} \frac{dE}{dy}\) אנחנו יכולים לקבל \(\color{dinput}\frac{dE}{dx}\) באמצעות כלל הרשת.
$$\color{dinput} \frac{\partial E}{\partial x} \color{black} = \frac{dy}{dx}\color{doutput}\frac{\partial E}{\partial y} \color{black} = \frac{d}{dx}f(\color{input}x\color{black})\color{doutput}\frac{\partial E}{\partial y}$$
כאשר \(\frac{d}{dx}f(\color{input}x\color{black}) = f(\color{input}x\color{black})(1 - f(\color{input}x\color{black}))\) \(f(\color{input}x\color{black})\) היא פונקציית ההפעלה של Sigmoid.

ריבוי גב

ברגע שנקבל את השגיאה נגזרת ביחס לקלט הכולל של הצומת, נוכל לקבל את השגיאה שנגזרת מהמשקלים שמגיעים לצומת.
$$\color{dweight} \frac{\partial E}{\partial w_{ij}} \color{black} = \frac{\partial x_j}{\partial w_{ij}} \color{dinput}\frac{\partial E}{\partial x_j} \color{black} = \color{output}y_i \color{dinput} \frac{\partial E}{\partial x_j}$$

ריבוי גב

באמצעות כלל השרשרת, אנחנו יכולים גם לקבל \(\frac{dE}{dy}\) מהשכבה הקודמת. יצרנו מעגל שלם.
$$ \color{doutput} \frac{\partial E}{\partial y_i} \color{black} = \sum_{j\in out(i)} \frac{\partial x_j}{\partial y_i} \color{dinput} \frac{\partial E}{\partial x_j} \color{black} = \sum_{j\in out(i)} w_{ij} \color{dinput} \frac{\partial E}{\partial x_j}$$

ריבוי גב

כל מה שנשאר לעשות הוא לחזור על שלוש הנוסחאות הקודמות עד שהמערכת תחשב את כל נגזרות השגיאה.

הסוף.

החישוב מתבצע...