歡迎來到本系列的第七篇文章。在上一章,我們用張量武裝了我們的線性代數知識,學會了如何描述和操作神經網絡中的高維數據流。我們知道,一個神經網絡的“前向傳播”過程,就是輸入張量經過一系列復雜的張量運算(矩陣乘法、卷積、激活函數等),最終計算出預測值,并與真實值比較得到一個標量損失(Loss)。
我們的目標,是調整網絡中海量的參數(權重和偏置,它們本身也是張量),來讓這個損失值最小。微積分告訴我們,實現這個目標的最佳路徑是梯度下降——計算損失對每個參數的梯度,然后讓參數沿著梯度的反方向更新一小步。
問題來了:如何計算這個梯度? 對于一個深達百層、參數過億的龐然大物,損失函數 L L L 與某個深層參數 w w w 之間的函數關系鏈條極其漫長和復雜。手動求導已然是天方夜譚。那么,計算機是如何高效且精確地完成這項艱巨任務的呢?
答案并非某種神秘的黑魔法,而是我們早已熟知的鏈式法則的一種極其聰明的、工程化的實現。這個實現就是反向傳播算法,其核心是一種名為自動微分的計算技術。今天,我們將一起揭開這個引擎蓋,探究深度學習的心臟是如何跳動的。
第一部分:計算的藍圖 —— 計算圖
要理解自動微分,我們首先需要引入一個至關重要的抽象工具——計算圖 (Computational Graph)。
任何用計算機執行的數學表達式,無論多么復雜,都可以被分解為一系列基本運算的組合。計算圖就是這種分解過程的可視化表示。它是一個有向無環圖 (Directed Acyclic Graph, DAG),其中:
- 節點 (Nodes) 代表運算(如加、乘、指數、卷積等)或變量(輸入數據、參數、常量)。
- 邊 (Edges) 代表數據流(通常是張量),表示一個節點的輸出是另一個節點的輸入。
讓我們從一個極其簡單的例子開始。假設我們有這樣一個函數: L = ( a ? w + b ? y t r u e ) 2 L = (a \cdot w + b - y_{true})^2 L=(a?w+b?ytrue?)2。這可以看作一個最簡單的線性回歸模型在一個樣本上的平方誤差損失。
我們可以將它的計算過程分解并繪制成一個計算圖:
在這個圖中,w
, a
, b
, y_true
是輸入變量(葉子節點),而×
, +
, -
, 2
是運算節點,L
是最終的輸出節點。數據從左到右流動,這個過程就是前向傳播 (Forward Pass)。
一個完整的神經網絡,無論其結構多復雜(CNN, RNN, Transformer),其前向傳播過程都可以被表示成一個巨大無比的計算圖。這個圖,就是我們進行梯度計算的“藍圖”。
第二部分:梯度計算的“三體”問題 —— 符號、數值與自動微分
在擁有計算圖這個藍圖后,我們如何求解梯度,例如 ? L ? w \frac{\partial L}{\partial w} ?w?L??學術界主要有三種方法:
-
手動/符號微分 (Symbolic Differentiation)
這是我們高中和大學時學習的方法。使用一系列代數規則(如乘法法則、鏈式法則)來推導出一個梯度的數學表達式。例如,對于上面的例子,我們可以推導出 ? L ? w = 2 ( a w + b ? y t r u e ) ? a \frac{\partial L}{\partial w} = 2(aw+b-y_{true}) \cdot a ?w?L?=2(aw+b?ytrue?)?a。- 優點:得到的是精確的解析解。
- 缺點:表達式膨脹 (Expression Swell)。對于深度神經網絡,最終的梯度表達式會變得異常龐大和復雜,生成和計算這個表達式本身的成本就高得無法接受。
-
數值微分 (Numerical Differentiation)
這種方法利用導數的定義: f ′ ( x ) = lim ? h → 0 f ( x + h ) ? f ( x ) h f'(x) = \lim_{h \to 0} \frac{f(x+h) - f(x)}{h} f′(x)=limh→0?hf(x+h)?f(x)?。我們可以用一個很小的 h h h (例如 1 0 ? 5 10^{-5} 10?5) 來近似計算梯度。要計算 ? L ? w \frac{\partial L}{\partial w} ?w?L?,我們只需計算 L ( w + h ) L(w+h) L(w+h) 和 L ( w ) L(w) L(w),然后用差值除以 h h h。- 優點:實現簡單,可以用來檢驗其他方法的正確性。
- 缺點:近似而非精確,存在截斷誤差和舍入誤差;計算量巨大,為了計算梯度,對于網絡中的每一個參數,我們都需要重新進行一次完整的前向傳播,如果網絡有N個參數,就需要N+1次前向傳播,這對于動輒上億參數的模型是毀滅性的。
-
自動微分 (Automatic Differentiation, AD)
這是一種介于符號微分和數值微分之間的“黃金方法”。它不像符號微分那樣在計算前生成一個巨大的表達式,也不像數值微分那樣進行近似計算。AD的核心思想是:在執行前向傳播計算數值的同時,利用鏈式法則,精確地計算并記錄下每一步的局部梯度信息。
自動微分有兩種主要模式:前向模式 (Forward Mode) 和反向模式 (Reverse Mode)。
- 前向模式AD:它從輸入到輸出,計算一個輸出相對于所有輸入的導數。它在每次前向傳播中,計算出某個節點的值的同時,也計算出這個節點的值相對于某個特定輸入變量的導數。要得到損失L對所有N個參數的梯度,需要進行N次這樣的前向傳播。
- 反向模式AD:它從輸出到輸入,計算所有輸入相對于一個輸出的導數。這正是深度學習所需要的!我們的目標是計算一個標量輸出(損失L)相對于所有N個參數的梯度。反向模式AD只需要一次前向傳播(計算所有節點的值)和一次反向傳播(計算所有梯度),就能得到所有參數的梯度。
由于其無與倫比的效率,反向模式自動微分成為了驅動深度學習訓練的唯一選擇。而反向傳播算法,正是反向模式自動微分在神經網絡領域的具體應用和命名。
反向模式自動微分:一場優雅的梯度之旅
讓我們回到之前的計算圖,用反向模式AD來手動計算 ? L ? w \frac{\partial L}{\partial w} ?w?L?。這個過程分為兩步:
Step 1: 前向傳播 (Forward Pass)
假設輸入值為 a = 2 , w = 3 , b = 4 , y t r u e = 11 a=2, w=3, b=4, y_{true}=11 a=2,w=3,b=4,ytrue?=11。我們計算并記錄每個節點的值。
mul
= a × w = 2 × 3 = 6 a \times w = 2 \times 3 = 6 a×w=2×3=6add
=mul
+ b = 6 + 4 = 10 b = 6 + 4 = 10 b=6+4=10sub
=add
- y t r u e = 10 ? 11 = ? 1 y_{true} = 10 - 11 = -1 ytrue?=10?11=?1L
=sub
2 = ( ? 1 ) 2 = 1 ^2 = (-1)^2 = 1 2=(?1)2=1
Step 2: 反向傳播 (Backward Pass)
現在,我們從最終的輸出 L L L 開始,沿著計算圖反向傳播梯度。梯度在這里的含義是“損失L對某個節點的偏導數”。
-
起點:損失對自身的梯度永遠是1。即 ? L ? L = 1 \frac{\partial L}{\partial L} = 1 ?L?L?=1。這是我們反向傳播的初始梯度值。
-
從 L 到 pow:我們現在站在
pow
節點,收到了來自下游(這里是L)的梯度 ? L ? L = 1 \frac{\partial L}{\partial L}=1 ?L?L?=1。我們需要計算損失L對pow
節點的輸入sub
的梯度,即 ? L ? s u b \frac{\partial L}{\partial sub} ?sub?L?。
根據鏈式法則: ? L ? s u b = ? L ? p o w ? ? p o w ? s u b \frac{\partial L}{\partial sub} = \frac{\partial L}{\partial pow} \cdot \frac{\partial pow}{\partial sub} ?sub?L?=?pow?L???sub?pow?。- ? L ? p o w \frac{\partial L}{\partial pow} ?pow?L? 就是從下游傳來的梯度,這里就是 ? L ? L = 1 \frac{\partial L}{\partial L}=1 ?L?L?=1。
- ? p o w ? s u b \frac{\partial pow}{\partial sub} ?sub?pow? 是
pow
節點的局部梯度。pow
的運算是 x 2 x^2 x2,其導數是 2 x 2x 2x。在前向傳播時,sub
的值是-1,所以這里的局部梯度是 2 × ( ? 1 ) = ? 2 2 \times (-1) = -2 2×(?1)=?2。 - 因此, ? L ? s u b = 1 × ( ? 2 ) = ? 2 \frac{\partial L}{\partial sub} = 1 \times (-2) = -2 ?sub?L?=1×(?2)=?2。我們將這個梯度值-2傳遞給
sub
節點。
-
從 pow 到 sub:
sub
節點收到了來自下游的梯度 ? L ? s u b = ? 2 \frac{\partial L}{\partial sub}=-2 ?sub?L?=?2。sub
的運算是add
-y_true
。我們需要計算損失L對sub
的兩個輸入add
和y_true
的梯度。- ? L ? a d d = ? L ? s u b ? ? s u b ? a d d = ( ? 2 ) ? 1 = ? 2 \frac{\partial L}{\partial add} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial add} = (-2) \cdot 1 = -2 ?add?L?=?sub?L???add?sub?=(?2)?1=?2。(因為
sub
對add
的局部梯度是1) - ? L ? y t r u e = ? L ? s u b ? ? s u b ? y t r u e = ( ? 2 ) ? ( ? 1 ) = 2 \frac{\partial L}{\partial y_{true}} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial y_{true}} = (-2) \cdot (-1) = 2 ?ytrue??L?=?sub?L???ytrue??sub?=(?2)?(?1)=2。(因為
sub
對y_true
的局部梯度是-1)
我們將梯度-2傳遞給add
節點,梯度2傳遞給y_true
節點。
- ? L ? a d d = ? L ? s u b ? ? s u b ? a d d = ( ? 2 ) ? 1 = ? 2 \frac{\partial L}{\partial add} = \frac{\partial L}{\partial sub} \cdot \frac{\partial sub}{\partial add} = (-2) \cdot 1 = -2 ?add?L?=?sub?L???add?sub?=(?2)?1=?2。(因為
-
從 sub 到 add:
add
節點收到了梯度 ? L ? a d d = ? 2 \frac{\partial L}{\partial add}=-2 ?add?L?=?2。add
的運算是mul
+b
。- ? L ? m u l = ? L ? a d d ? ? a d d ? m u l = ( ? 2 ) ? 1 = ? 2 \frac{\partial L}{\partial mul} = \frac{\partial L}{\partial add} \cdot \frac{\partial add}{\partial mul} = (-2) \cdot 1 = -2 ?mul?L?=?add?L???mul?add?=(?2)?1=?2。
- ? L ? b = ? L ? a d d ? ? a d d ? b = ( ? 2 ) ? 1 = ? 2 \frac{\partial L}{\partial b} = \frac{\partial L}{\partial add} \cdot \frac{\partial add}{\partial b} = (-2) \cdot 1 = -2 ?b?L?=?add?L???b?add?=(?2)?1=?2。
我們將梯度-2傳遞給mul
節點,梯度-2傳遞給b
節點。
-
從 add 到 mul:
mul
節點收到了梯度 ? L ? m u l = ? 2 \frac{\partial L}{\partial mul}=-2 ?mul?L?=?2。mul
的運算是 a × w a \times w a×w。- ? L ? a = ? L ? m u l ? ? m u l ? a = ( ? 2 ) ? w = ( ? 2 ) ? 3 = ? 6 \frac{\partial L}{\partial a} = \frac{\partial L}{\partial mul} \cdot \frac{\partial mul}{\partial a} = (-2) \cdot w = (-2) \cdot 3 = -6 ?a?L?=?mul?L???a?mul?=(?2)?w=(?2)?3=?6。(局部梯度是另一個輸入 w w w)
- ? L ? w = ? L ? m u l ? ? m u l ? w = ( ? 2 ) ? a = ( ? 2 ) ? 2 = ? 4 \frac{\partial L}{\partial w} = \frac{\partial L}{\partial mul} \cdot \frac{\partial mul}{\partial w} = (-2) \cdot a = (-2) \cdot 2 = -4 ?w?L?=?mul?L???w?mul?=(?2)?a=(?2)?2=?4。(局部梯度是另一個輸入 a a a)
至此,我們已經完成了整個反向傳播。我們得到了損失L對所有葉子節點的梯度: ? L ? a = ? 6 \frac{\partial L}{\partial a}=-6 ?a?L?=?6, ? L ? w = ? 4 \frac{\partial L}{\partial w}=-4 ?w?L?=?4, ? L ? b = ? 2 \frac{\partial L}{\partial b}=-2 ?b?L?=?2, ? L ? y t r u e = 2 \frac{\partial L}{\partial y_{true}}=2 ?ytrue??L?=2。
我們來驗證一下手動求導的結果: ? L ? w = 2 ( a w + b ? y t r u e ) ? a = 2 ( 2 ? 3 + 4 ? 11 ) ? 2 = 2 ( ? 1 ) ? 2 = ? 4 \frac{\partial L}{\partial w} = 2(aw+b-y_{true}) \cdot a = 2(2 \cdot 3 + 4 - 11) \cdot 2 = 2(-1) \cdot 2 = -4 ?w?L?=2(aw+b?ytrue?)?a=2(2?3+4?11)?2=2(?1)?2=?4。完全一致!
這個過程揭示了反向模式AD的精髓:
- 一次前向傳播:計算并緩存所有中間變量的值。
- 一次反向傳播:從后向前,利用鏈式法則和緩存的中間值,逐節點計算梯度。
- 局部性:每個節點在計算梯度時,只需要關心自己的運算類型(局部梯度)和從下游傳來的梯度值,無需知道整個網絡的結構。這使得該算法高度模塊化和可擴展。
第三部分:反向傳播 —— 神經網絡的梯度交響樂
現在,我們可以正式給出結論:反向傳播 (Backpropagation, BP) 算法,就是反向模式自動微分在神經網絡上的應用。它不是一個與AD并列的概念,而是AD在特定領域(神經網絡)的“藝名”。
在神經網絡的語境下,計算圖的節點不再是簡單的+
或×
,而是整個層 (Layer),如全連接層、卷積層、激活函數層等。
層的視角:局部梯度與全局梯度
反向傳播的美妙之處在于其優雅的“責任分工”。每一層都像一個獨立的模塊,它只需要做好兩件事:
- 實現自己的前向傳播邏輯:接收輸入張量,根據自己的參數和運算規則,計算并輸出張量。
- 實現自己的反向傳播邏輯:接收來自下游(更靠近損失函數的那一側)的、關于其輸出的梯度(我們稱之為全局梯度 ? L ? out \frac{\partial L}{\partial \text{out}} ?out?L?),然后計算:
- 損失L關于其輸入的梯度( ? L ? in = ? L ? out ? ? out ? in \frac{\partial L}{\partial \text{in}} = \frac{\partial L}{\partial \text{out}} \cdot \frac{\partial \text{out}}{\partial \text{in}} ?in?L?=?out?L???in?out?),并將其傳遞給上游。
- 損失L關于其內部參數(如權重W、偏置b)的梯度( ? L ? W = ? L ? out ? ? out ? W \frac{\partial L}{\partial W} = \frac{\partial L}{\partial \text{out}} \cdot \frac{\partial \text{out}}{\partial W} ?W?L?=?out?L???W?out?),并將其存儲起來,用于后續的參數更新。
這里的 ? out ? in \frac{\partial \text{out}}{\partial \text{in}} ?in?out? 和 ? out ? W \frac{\partial \text{out}}{\partial W} ?W?out? 就是該層的局部梯度。
以一個全連接層為例,其前向傳播為 out = in ? W + b \text{out} = \text{in} \cdot W + b out=in?W+b。
其局部梯度(雅可比矩陣)為:
- ? out ? in = W T \frac{\partial \text{out}}{\partial \text{in}} = W^T ?in?out?=WT
- ? out ? W = in T \frac{\partial \text{out}}{\partial W} = \text{in}^T ?W?out?=inT
- ? out ? b = 1 \frac{\partial \text{out}}{\partial b} = 1 ?b?out?=1
當反向傳播發生時,該層接收到梯度 ? L ? out \frac{\partial L}{\partial \text{out}} ?out?L?,它就會執行以下計算:
- 傳遞給上一層的梯度: ? L ? in = ? L ? out ? W T \frac{\partial L}{\partial \text{in}} = \frac{\partial L}{\partial \text{out}} \cdot W^T ?in?L?=?out?L??WT
- 需要更新的權重梯度: ? L ? W = in T ? ? L ? out \frac{\partial L}{\partial W} = \text{in}^T \cdot \frac{\partial L}{\partial \text{out}} ?W?L?=inT??out?L?
- 需要更新的偏置梯度: ? L ? b = ∑ ? L ? out \frac{\partial L}{\partial b} = \sum \frac{\partial L}{\partial \text{out}} ?b?L?=∑?out?L? (對batch維度求和)
這個時序圖生動地描繪了神經網絡中梯度流動的“交響樂”。前向傳播構建了計算圖并計算了所有值,而反向傳播(由loss.backward()
觸發)則像一個指揮家,從樂曲的末尾(Loss)開始,將梯度的“指令”逐層向后傳遞。每一層在收到指令后,演奏好自己的部分(計算參數梯度),并將指令傳遞給前一層,直到整個樂團(網絡)的所有成員(參數)都得到了自己的梯度。
深度學習框架的角色
PyTorch、TensorFlow等現代深度學習框架,將這個過程自動化到了極致。作為開發者,我們只需要:
- 用框架提供的層和操作來定義網絡結構(即動態或靜態地定義計算圖)。
- 執行前向傳播,得到損失。
- 調用一個簡單的命令,如
loss.backward()
。
框架在背后會自動完成:
- 在前向傳播時,構建出完整的計算圖,并緩存所有中間變量的值。
- 在調用
backward()
時,從損失節點開始,完美地執行反向模式自動微分,計算出損失對每一個參數(定義時被標記為requires_grad=True
的張量)的梯度。 - 將計算出的梯度值,存儲在每個參數張量的
.grad
屬性中。
之后,我們就可以將這些梯度交給優化器(如SGD, Adam),由優化器來執行參數更新的步驟:parameter = parameter - learning_rate * parameter.grad
。
融會貫通:微積分的深度進化
今天,我們完成了對微積分的深度學習“升級”。我們看到,驅動整個AI訓練過程的,并非某種全新的數學理論,而是我們早已熟知的鏈式法則,被以一種極其高效和工程化的方式重新組織和實現。
- 計算圖:將復雜的計算過程分解為模塊化的“藍圖”,是自動微分得以實施的基礎。
- 自動微分 (AD):特別是反向模式AD,提供了一種在計算效率和精度上都遠超符號微分和數值微分的方法,是計算海量參數梯度的不二之選。
- 反向傳播 (Backpropagation):就是反向模式AD在神經網絡上的應用。它通過“局部計算,全局傳播”的模式,優雅地解決了深層網絡中的梯度計算難題。
反向傳播算法的出現,才真正讓“深度”學習成為可能。沒有它,我們可能還停留在只有幾層參數的淺層模型時代。它與梯度下降的關系是:反向傳播負責高效地“算”出梯度,梯度下降負責使用這個梯度去“更新”參數。一個主內(計算),一個主外(優化)。
掌握了張量和自動微分,我們就掌握了深度學習模型的“表示”與“學習”兩大核心。接下來,我們將繼續深入,探討在實際訓練中會遇到的各種問題,比如梯度消失/爆炸,以及如何通過更先進的優化算法(如Adam)來應對這些挑戰。這將是我們對“優化理論”的深度學習升級。
習題
第1題:手動反向傳播
考慮一個簡單的函數 y = ReLU ( w x + b ) y = \text{ReLU}(wx+b) y=ReLU(wx+b),其中ReLU函數定義為 ReLU ( z ) = max ? ( 0 , z ) \text{ReLU}(z) = \max(0, z) ReLU(z)=max(0,z)。假設輸入 x = 2 x=2 x=2, 參數 w = 3 , b = ? 7 w=3, b=-7 w=3,b=?7。
A. 請執行前向傳播,計算出 y y y 的值。
B. 假設下游傳來的梯度 ? L ? y = 5 \frac{\partial L}{\partial y} = 5 ?y?L?=5。請執行反向傳播,計算出損失L對參數 w w w 和 b b b 的梯度,即 ? L ? w \frac{\partial L}{\partial w} ?w?L? 和 ? L ? b \frac{\partial L}{\partial b} ?b?L?。
第2題:概念辨析
請用自己的話解釋反向傳播 (Backpropagation) 和梯度下降 (Gradient Descent) 的區別與聯系。為什么說“反向傳播是為梯度下降服務的”?
第3題:計算圖與梯度
在一個深度神經網絡中,如果某個參數 w w w 通過多條路徑影響了最終的損失 L L L(例如,一個參數在循環神經網絡中被多次使用),那么在使用反向傳播計算 ? L ? w \frac{\partial L}{\partial w} ?w?L? 時,會發生什么?
A. 只會計算其中一條路徑的梯度。
B. 會分別計算每條路徑的梯度,并取最大值。
C. 會分別計算每條路徑的梯度,并將它們相加。
D. 會報錯,因為梯度路徑不唯一。
答案
第1. 答案:
A. 前向傳播:
- 計算線性部分: z = w x + b = 3 × 2 + ( ? 7 ) = 6 ? 7 = ? 1 z = wx + b = 3 \times 2 + (-7) = 6 - 7 = -1 z=wx+b=3×2+(?7)=6?7=?1。
- 應用ReLU激活函數: y = ReLU ( z ) = ReLU ( ? 1 ) = max ? ( 0 , ? 1 ) = 0 y = \text{ReLU}(z) = \text{ReLU}(-1) = \max(0, -1) = 0 y=ReLU(z)=ReLU(?1)=max(0,?1)=0。
所以, y = 0 y=0 y=0。
B. 反向傳播:
-
計算 ? L ? z \frac{\partial L}{\partial z} ?z?L?:
? L ? z = ? L ? y ? ? y ? z \frac{\partial L}{\partial z} = \frac{\partial L}{\partial y} \cdot \frac{\partial y}{\partial z} ?z?L?=?y?L???z?y?。
我們已知 ? L ? y = 5 \frac{\partial L}{\partial y} = 5 ?y?L?=5。
ReLU函數的局部梯度 ? y ? z \frac{\partial y}{\partial z} ?z?y? 是:如果 z > 0 z>0 z>0,導數為1;如果 z < 0 z<0 z<0,導數為0。
在前向傳播中,我們計算出 z = ? 1 z=-1 z=?1,所以 ? y ? z = 0 \frac{\partial y}{\partial z} = 0 ?z?y?=0。
因此, ? L ? z = 5 × 0 = 0 \frac{\partial L}{\partial z} = 5 \times 0 = 0 ?z?L?=5×0=0。 -
計算 ? L ? w \frac{\partial L}{\partial w} ?w?L? 和 ? L ? b \frac{\partial L}{\partial b} ?b?L?:
? L ? w = ? L ? z ? ? z ? w = 0 ? x = 0 ? 2 = 0 \frac{\partial L}{\partial w} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial w} = 0 \cdot x = 0 \cdot 2 = 0 ?w?L?=?z?L???w?z?=0?x=0?2=0。
? L ? b = ? L ? z ? ? z ? b = 0 ? 1 = 0 \frac{\partial L}{\partial b} = \frac{\partial L}{\partial z} \cdot \frac{\partial z}{\partial b} = 0 \cdot 1 = 0 ?b?L?=?z?L???b?z?=0?1=0。
所以, ? L ? w = 0 \frac{\partial L}{\partial w} = 0 ?w?L?=0 且 ? L ? b = 0 \frac{\partial L}{\partial b} = 0 ?b?L?=0。這個結果是符合邏輯的,因為輸入的 z = ? 1 z=-1 z=?1 導致ReLU函數輸出為0,使得 w w w 和 b b b 的微小變化無法影響到輸出 y y y(在 z z z 保持小于0的情況下),因此它們對最終損失的梯度貢獻也為0。這種情況被稱為“神經元死亡”。
第2. 答案:
-
區別:
- 梯度下降 (Gradient Descent) 是一種優化算法。它的作用是如何使用梯度來更新模型的參數,以最小化損失函數。其核心思想是
參數 = 參數 - 學習率 * 梯度
。它只關心“拿到梯度后該怎么走”,不關心“梯度是怎么來的”。 - 反向傳播 (Backpropagation) 是一種梯度計算算法。它的作用是如何高效地計算損失函數對網絡中所有參數的梯度。它是一個應用了鏈式法則的、系統性的過程。它只負責“算出梯度”,不關心“梯度算出來以后要干嘛”。
- 梯度下降 (Gradient Descent) 是一種優化算法。它的作用是如何使用梯度來更新模型的參數,以最小化損失函數。其核心思想是
-
聯系:
它們是模型訓練中緊密協作的兩個環節。反向傳播是梯度下降的“供應商”。在每次訓練迭代中,模型首先通過反向傳播計算出所有參數的梯度,然后將這些梯度交給梯度下降(或其變種如Adam)算法,由優化算法來完成參數的更新。因此,“反向傳播是為梯度下降服務的”這句話是完全正確的,它為優化算法提供了最關鍵的輸入——方向(梯度)。
第3. 答案:C
會分別計算每條路徑的梯度,并將它們相加。
這是多元鏈式法則的直接體現,也是自動微分和反向傳播算法正確處理計算圖的內在要求。在計算圖中,如果一個節點(參數 w w w)的輸出流向了多個后續節點,那么在反向傳播時,它會從所有這些后續節點分別接收到梯度。該節點(參數 w w w)的總梯度,是所有從不同路徑傳回來的梯度的總和。這確保了該參數對最終損失的全部影響都被正確地計算在內。