Joseph Chen
碩士做 TTS 研究時,每天都在跟 Tensor 打交道。一開始完全搞不懂 grad_fn 是什麼,直到有一天突然理解:PyTorch 會自動幫你記錄每一步計算,然後反推梯度。那一刻,深度學習變得不再神秘。
PyTorch vs NumPy
許多人學 PyTorch 的起點是:「我已經會 NumPy,PyTorch 有什麼不同?」答案很直接——語法幾乎一樣,但 PyTorch Tensor 多了兩個關鍵能力:跑在 GPU 上和自動微分。
| 特性 | NumPy | PyTorch Tensor |
|---|---|---|
| 語法相似度 | 基準 | 非常接近 NumPy |
| 執行裝置 | CPU only | CPU / GPU(CUDA) |
| 自動微分 | 不支援 | 支援(requires_grad) |
| 主要用途 | 數值計算、資料處理 | 深度學習訓練與推論 |
| 與深度學習框架整合 | 需要手動轉換 | 原生整合 nn.Module |
Tensor 基礎操作
Tensor 是 PyTorch 的核心資料結構,等同於多維陣列。以下是最常用的建立、形狀操作與數學運算方法:
注意:view() vs reshape()
view() 要求 Tensor 在記憶體中是連續的,速度更快。若 Tensor 經過轉置等操作後不連續,呼叫 view() 會報錯,這時改用 reshape() 即可,它會自動處理不連續情況。
Autograd(自動微分)
Autograd 是 PyTorch 最核心的機制——它讓你不用手算偏微分,框架會自動幫你做。理解它,你就理解了深度學習訓練的本質。
requires_grad=True 的作用
告訴 PyTorch:「我要追蹤這個 Tensor 的計算過程」。之後每一步運算,PyTorch 都會建立一個計算圖(Computational Graph),記錄「這個值是從哪裡計算出來的」。
計算圖(Computational Graph)
想像一個有向圖,每個節點是一個運算(加法、乘法、ReLU...),每條邊是資料流向。forward pass 建立這張圖;backward pass 沿著這張圖反推每個參數的梯度。
loss.backward() 如何工作
呼叫 backward() 後,PyTorch 從 loss 出發,沿著計算圖反向傳播,用鏈式法則(Chain Rule)計算每個 requires_grad=True 的 Tensor 對應的梯度,存入 .grad 屬性。
完整訓練迴圈
PyTorch 的訓練迴圈固定五步驟,背下來就不會忘:清梯度 → 前向傳播 → 計算損失 → 反向傳播 → 更新參數。
常用 nn 模組速查
| 模組 | 用途 | 關鍵參數 |
|---|---|---|
| nn.Linear | 全連接層 | in_features, out_features |
| nn.Conv2d | 2D 卷積層(影像) | in_channels, out_channels, kernel_size |
| nn.ReLU | ReLU 激活函數 | —(無需參數) |
| nn.Dropout | 隨機丟棄(防過擬合) | p(丟棄機率,預設 0.5) |
| nn.BatchNorm1d | 批次正規化(1D) | num_features |
| nn.LSTM | 長短期記憶網路(序列) | input_size, hidden_size, num_layers |
| nn.Embedding | 詞向量嵌入(NLP) | num_embeddings, embedding_dim |
| nn.Softmax | 機率輸出(多分類) | dim(沿哪個軸計算) |
GPU 加速
在有 NVIDIA GPU 的環境下,訓練速度可以提升 10–100 倍。關鍵是:model 和資料都必須在同一個裝置上,不然會報錯。
面試常考題
Q1. Tensor 和 NumPy array 的差異?
語法幾乎相同,但 PyTorch Tensor 可以放在 GPU 上加速運算,並支援自動微分(requires_grad)。NumPy array 只在 CPU,不支援梯度計算。
Q2. optimizer.zero_grad() 為什麼必要?
PyTorch 的梯度是「累加」而非「覆寫」。若不清除,每次 backward() 的梯度都會疊加到 .grad 上,導致梯度錯誤膨脹,參數更新方向完全錯誤。
Q3. requires_grad=True 做了什麼?
告訴 PyTorch 要追蹤這個 Tensor 的所有後續計算,建立計算圖。呼叫 .backward() 時,PyTorch 沿計算圖反推梯度,存入 .grad 屬性。
Q4. batch_size 對訓練有什麼影響?
大 batch_size → 梯度估計更準確,但需要更多記憶體,訓練較快;小 batch_size → 梯度有更多雜訊(有正則化效果),可能找到更平坦的最小值,但訓練震盪較大。
Q5. overfitting 如何解決?
三大方法:(1) Dropout:訓練時隨機丟棄神經元,強迫網路學習冗餘表示;(2) L2 正規化(weight decay):在 optimizer 裡設定,懲罰過大的權重;(3) Early stopping:監控 validation loss,停止在 val loss 開始上升前。