Gradient descent

Gradient descent (בתרגום מילולי: מורד הגרדיאנט) היא שיטת אופטימיזציה איטרטיבית מסדר ראשון למציאת מינימום מקומי של פונקציה. בשיטה זו, נעשה צעד נגדי לגרדיאנט ביחס לנקודה הנוכחית. לעומת זאת, אם נעשה צעדים בכיוון של הגרדיאנט נמצא את המקסימום המקומי של הפונקציה (אלגוריתם זה נקרא Gradient ascent, בתרגום מילולי: מעלה הגרדיאנט). השיטה עובדת על שדה סקלרי של נתונים. שדה סקלרי הוא פונקציה המתאימה לכל נקודה במרחב ערך מספרי. המרחב יכול להיות בעל מספר רב של ממדים. דוגמה לשדה סקלרי בשני ממדים הוא מפה טופוגרפית, בה לכל נקודה על המפה הדו-ממדית משויך הגובה מעל פני הים. לפי השיטה משתמשים בגרדיאנט, שהוא כלי מתמטי וקטורי, כלומר בעל כיוון, המאפשר למצוא את הכיוון אליו הנגזרת מקסימלית דהיינו הכיוון בו נמצא השינוי הדרסטי ביותר בין הנתונים סביב נקודה מסוימת. במפה הטופוגרפית יהווה הגרדיאנט הכיוון בו השיפוע מקסימלי, והאלגוריתם אמור להתכנס למינימום מקומי של השדה הסקלרי . השיטה עובדת כך שבכל שלב של ההפעלה היא מתקדמת לכיוון הפוך לגרדיאנט (כיוון שהגרדיאנט מראה את השיפוע כלפי מעלה) כך שבכל שלב יש התקדמות נגד השיפוע המקסימלי עד שמגיעים לנקודה מספיק נמוכה המוגדרת בתנאי העצירה. דבר זה דומה לאדם העומד בנקודה על המפה הטופוגרפית אך ישנו ערפל סמיך אשר עוצר בעדו. לכן באפשרותו לבדוק רק את סביבתו הקרובה. הכיוון שבו הוא יורד יהיה הכיוון בו המדרון תלול ביותר. Gradient descent מבוססת על ההבחנה שאם פונקציה מרובת משתנים F ( x ) {\displaystyle F(\mathbf {x} )} מוגדרת ודיפרנציאבילית בסמוך לנקודה a {\displaystyle \mathbf {a} } , אז F ( x ) {\displaystyle F(\mathbf {x} )} יורדת בצורה התלולה ביותר כשהולכים מ a {\displaystyle \mathbf {a} } בכיוון נגדי לגרדיאנט של F {\displaystyle F} ב- a {\displaystyle \mathbf {a} } , − ∇ F ( a ) {\displaystyle -\nabla F(\mathbf {a} )} . מכאן שאם a n + 1 = a n − γ ∇ F ( a n ) {\displaystyle \mathbf {a} _{n+1}=\mathbf {a} _{n}-\gamma \nabla F(\mathbf {a} _{n})} עבור γ {\displaystyle \gamma } קטן דיו, אז F ( a n ) ≥ F ( a n + 1 ) {\displaystyle F(\mathbf {a_{n}} )\geq F(\mathbf {a_{n+1}} )} . במילים אחרות, הביטוי γ ∇ F ( a ) {\displaystyle \gamma \nabla F(\mathbf {a} )} מוחסר מ- a {\displaystyle \mathbf {a} } כיוון שרוצים לזוז נגד כיוון הגרדיאנט, מטה לכיוון המינימום. בהתבסס על הבחנה זו, ניתן לנחש נקודה ראשונית x 0 {\displaystyle \mathbf {x} _{0}} כנקודת מינימום של F {\displaystyle F} , ולקבל את הסדרה x 0 , x 1 , x 2 , … {\displaystyle \mathbf {x} _{0},\mathbf {x} _{1},\mathbf {x} _{2},\dots } כך ש: x n + 1 = x n − γ n ∇ F ( x n ) ,   n ≥ 0. {\displaystyle \mathbf {x} _{n+1}=\mathbf {x} _{n}-\gamma _{n}\nabla F(\mathbf {x} _{n}),\ n\geq 0.} שבהתבסס על ההבחנה: F ( x 0 ) ≥ F ( x 1 ) ≥ F ( x 2 ) ≥ ⋯ , {\displaystyle F(\mathbf {x} _{0})\geq F(\mathbf {x} _{1})\geq F(\mathbf {x} _{2})\geq \cdots ,} הסדרה ( x n ) {\displaystyle (\mathbf {x} _{n})} יכולה להתכנס לנקודת המינימום המבוקשת. גודל הצעד γ {\displaystyle \gamma } יכול להשתנות בכל איטרציה. יחד עם הנחות מסוימות על הפונקציה F {\displaystyle F} (לדוגמה, F {\displaystyle F} קמורה ו ∇ F {\displaystyle \nabla F} ליפשיצית) ובחירות מתאימות של γ {\displaystyle \gamma } (למשל באמצעות line search שמקיים את תנאי וולף או שיטת ברזילאי-בורווין להלן), γ n = ( x n − x n − 1 ) T [ ∇ F ( x n ) − ∇ F ( x n − 1 ) ] | | ∇ F ( x n ) − ∇ F ( x n − 1 ) | | 2 {\displaystyle \gamma _{n}={\frac {(\mathbf {x} _{n}-\mathbf {x} _{n-1})^{T}[\nabla F(\mathbf {x} _{n})-\nabla F(\mathbf {x} _{n-1})]}{||\nabla F(\mathbf {x} _{n})-\nabla F(\mathbf {x} _{n-1})||^{2}}}} מתכנסת הסדרה למינימום מקומי. כאשר הפונקציה F {\displaystyle F} היא קמורה, ניתן להשתמש ב-gradient descent למציאת פתרון גלובלי. ב-1964 הציג בוריס תאודורוביץ' פוליאק הרחבה לשיטה שנקראת שיטת המומנטום אשר משפרת את קצב ההתכנסות. ב-1983 הציג יורי נסטרוב את שיטת הגרדיאנט המואץ (Nesterov’s Accelerated Gradient ולעיתים בקיצור NAG), שיכולה להשיג קצב התכנסות טוב יותר. גרסה נוספת של Gradient descent מבוססת על הערכה סטוכסטית של הגרדיאנט וידועה כ-Stochastic gradient descent. להלן קוד פייתון של האלגוריתם gradient descent: # x0 - initial guess # df - gradient of function def gradient_descent(x0, df): cur_x = x0 # The algorithm starts at x0 gamma = 0.01 # step size multiplier precision = 0.00001 previous_step_size = cur_x while previous_step_size > precision: prev_x = cur_x cur_x += -gamma * df(prev_x) previous_step_size = abs(cur_x - prev_x) return cur_x מדיה וקבצים בנושא Gradient descent בוויקישיתוף B. T. Polyak, “Some methods of speeding up the convergence of iteration methods”, Zh. Vychisl. Mat. Mat. Fiz., 4:5 (1964), 791–803; U.S.S.R. Comput. Math. Math. Phys., 4:5 (1964), 1–17, www.mathnet.ru YU. E. NESTEROV, A method of solving a convex programming problem with convergence rate O(1/k^2), Soviet Mathematics Doklady, 27, 1983