JOVANA
Library Glossary Getting Started Three Levels Fields How it works Mission
Join the mission
All guides

多變量:偏導數與梯度

直到現在,你的函數只接收一個輸入,你也只量一個斜率。但真實世界同時有許多旋鈕——溫度同時取決於緯度和經度,利潤同時取決於價格和數量。[[derivative-calculus|導數]]依然管用;你只是一次量一個方向,再把這些斜率打包成一支單一的箭頭,叫做[[gradient|梯度]],它筆直指向上坡的方向。

從一條曲線到一片地貌

一個單變量函數 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)
在碗形 f = x^2 + y^2 上,(3,4) 處的梯度指向外側——朝上坡、遠離最低點——而它的長度 10 量出了那裡碗壁升得有多陡。

為什麼機器鍾愛梯度

大多數時候我們想往下走,而不是往上:去找一個成本、一個誤差、一個損失的最低點。既然梯度指向最陡的上坡,它的反方向就指向最陡的下坡。於是一個蒙著眼的登山者,可以靠一條蠢得不能再蠢的規則找到谷底——感覺哪個方向下坡最陡(即負梯度),朝那個方向邁一小步,然後重複。這就是梯度下降,它是訓練幾乎每一個現代機器學習模型背後的主力。

  1. 在地貌上隨便從哪裡出發——給輸入隨便猜一個起點(在機器學習裡,就是模型的初始權重)。
  2. 在那裡算出梯度——損失關於每個輸入的那些偏導數。這就是上坡方向。
  3. 朝它的反方向邁步:新位置 = 舊位置 - (步長)* 梯度。那個小小的步長(即「學習率」)讓你不至於衝過頭。
  4. 重複,直到梯度縮向零——地面變平,意味著你已經落進了一個谷底(一個極小值,至少是局部的)。