在 TensorFlow 中,有一種特殊的張量類型叫做梯度張量,可以用來計算模型的梯度。這篇文章說明 TensorFlow 自動求導(自動微分)機制的原理、`GradientTape` 的標準使用流程,並用一個最小範例示範如何求出函數在特定點的導數——這正是訓練神經網路時反向傳播的基礎。
什麼是 TensorFlow 的自動求導機制?
TensorFlow 的梯度張量是一種特殊的張量,其中包含了模型中每個變量的梯度資訊。梯度張量是 TensorFlow 自動微分機制的基礎,可以透過 TensorFlow 的自動求導機制來計算模型的梯度。
簡單來說:只要把前向計算寫出來,TensorFlow 會自動沿著計算路徑算出每個變量的偏導數,不需要手動推導微分公式。
GradientTape 的使用方法
使用 `tf.GradientTape` 類計算梯度的標準流程是:
- 在計算圖的上下文中建立一個 `GradientTape` 物件。
- 使用 `GradientTape` 物件的 `watch` 方法監視計算圖中的變量(`tf.Variable` 預設會被自動監視)。
- 執行計算圖,在 tape 的上下文中用 TensorFlow 的運算子操作張量。
- 呼叫 `GradientTape` 物件的 `gradient` 方法計算模型的梯度。
使用範例:計算 y = x² 在 x = 3 的導數
在機器學習中,我們經常需要計算函數的導數。TensorFlow 提供了強大的自動求導機制來計算導數。以下程式示範如何使用 `tf.GradientTape()` 計算函數 y(x) = x² 在 x = 3 時的導數:
```python
import tensorflow as tf
x = tf.Variable(initial_value=3.)
with tf.GradientTape() as tape:
y = tf.square(x)
y_grad = tape.gradient(y, x) # 計算 y 關於 x 的導數
print([y, y_grad])
```
輸出如下:
```python
[array([9.], dtype=float32), array([6.], dtype=float32)]
```
結果符合手算:y = 3² = 9,而 dy/dx = 2x = 2 × 3 = 6。這個「前向記錄、反向求導」的模式就是 TensorFlow 訓練模型時每一步更新權重所做的事情。
延伸閱讀
常見問題
什麼是 TensorFlow 的梯度張量?
梯度張量是一種特殊的張量,包含模型中每個變量的梯度資訊。它是 TensorFlow 自動微分機制的基礎,透過它可以取得模型各變量相對於目標函數的導數。
GradientTape 為什麼叫 tape(磁帶)?
因為它像磁帶一樣「錄下」上下文中執行的每一個運算。之後呼叫 `gradient()` 時,TensorFlow 就沿著這份記錄反向推導,算出目標張量對監視變量的梯度。
哪些變量會被 GradientTape 自動追蹤?
`tf.Variable` 會被自動監視;一般的 `tf.Tensor` 則需要呼叫 `tape.watch(tensor)` 明確監視才會被求導。`tf.constant` 之類不可訓練的張量若不 watch,梯度會是 `None`。
tape.gradient() 可以重複呼叫嗎?
不行。`GradientTape` 預設是一次性的,呼叫一次 `gradient()` 後資源就會釋放。若需要多次求導,建立 tape 時要加上 `persistent=True`,並用完後手動 `del tape` 釋放資源。
參考資料
最後更新
2026-08-28(原文發布於 2023-01-04,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2023-01-04
