從一條曲線到一片地貌
一個單變量函數 y = f(x) 畫出一條曲線:一個輸入,一個輸出。現在放進兩個輸入——比如 z = f(x, y)——圖像就從紙面升起,變成一個曲面,像一片懸在平坦 (x, y) 地面之上的起伏丘陵。高度 z 就是地面在點 (x, y) 之上立得有多高。山峰、谷地、山脊、鞍部:一個雙變量函數實實在在就是一片地貌。
在曲線上只有一個變化率:那個斜率。但站在山坡上,「斜率」就含糊了——往哪個方向的斜率?往東走,地面也許陡升;轉身往北走,它也許完全是平的,甚至往下塌。從前那一個數,分裂成了一整把扇形的斜率,你每能邁出的一個方向都對應一個。為了抓住它,我們先只量其中兩個。
偏導數:凍住其他所有旋鈕,只動一個
竅門美妙地簡單:要量沿 x 方向的斜率,就把 y 完全按住不動,只讓 x 變化。當 y 被凍結成一個常數,f(x, y) 就變成了一個關於 x 的普通單變量函數——而你已經會對它求導了。結果就是 f 關於 x 的偏導數,寫作帶彎鉤的 df/dx,或者更常用下面那個特殊符號。它回答的是:當我朝東邁出一小步、同時停留在同一條南北線上時,高度變化得有多快?
f(x, y) = x^2 + 3*x*y + y^2
partial f / partial x : treat y as a constant
-> 2x + 3y (the y^2 term has no x, so it vanishes)
partial f / partial y : treat x as a constant
-> 3x + 2y (the x^2 term has no y, so it vanishes)從幾何上看,partial f / partial x 是沿著平行於 x 軸切出的一片切面所量到的曲面斜率——你用一個豎直平面把山坡切開,讀出切口上露出的那條曲線的斜率。求導本身沒有任何新東西要學:你練過的每一條導數法則(冪法則、乘積法則、鏈式法則)都原封不動地適用。唯一要守的紀律,是記清楚哪些字母是「活的」、哪些是暫時凍住的。
梯度:把這些斜率打包成一支箭頭
現在你在每一點上都有兩個數:東西方向的斜率,和南北方向的斜率。梯度就只是把它們收進一支向量裡,寫作 grad f,或用那個倒三角:grad f = ( partial f / partial x , partial f / partial y )。這不只是記帳。那支小小的箭頭,攜帶著關於這片地貌的一條了不起的信息。
重點來了:在任意一點,梯度這支箭頭指向最陡上升的方向——曲面爬升最快的那唯一一個羅盤方位——而它的長度告訴你這個最陡的攀登有多陡。正好沿著梯度邁步,你升高得最快;正好朝它的反方向邁步,你下降得最快;與它成直角邁步,你保持水平——這正是為什麼梯度永遠垂直於前面那些等高線。一支箭頭同時編碼了最佳方向和變化速率。
f(x, y) = x^2 + y^2 (a bowl, lowest at the origin)
grad f = ( 2x , 2y ) (the two partials, bundled)
at (3, 4): grad f = (6, 8)
direction = straight away from the center (steepest uphill)
length = sqrt(6^2 + 8^2) = sqrt(100) = 10 (the steepness there)為什麼機器鍾愛梯度
大多數時候我們想往下走,而不是往上:去找一個成本、一個誤差、一個損失的最低點。既然梯度指向最陡的上坡,它的反方向就指向最陡的下坡。於是一個蒙著眼的登山者,可以靠一條蠢得不能再蠢的規則找到谷底——感覺哪個方向下坡最陡(即負梯度),朝那個方向邁一小步,然後重複。這就是梯度下降,它是訓練幾乎每一個現代機器學習模型背後的主力。
- 在地貌上隨便從哪裡出發——給輸入隨便猜一個起點(在機器學習裡,就是模型的初始權重)。
- 在那裡算出梯度——損失關於每個輸入的那些偏導數。這就是上坡方向。
- 朝它的反方向邁步:新位置 = 舊位置 - (步長)* 梯度。那個小小的步長(即「學習率」)讓你不至於衝過頭。
- 重複,直到梯度縮向零——地面變平,意味著你已經落進了一個谷底(一個極小值,至少是局部的)。