2023年1月16日 星期一

PyTorch 深度學習攻略筆記 (一)

最近從母校借到 "PyTorch 深度學習攻略" 這本書, 此書翻譯自 Manning 出版的 "Deep Learning with PyTorch" (2020) 一書, 三位作者中有兩位是 PyTorch 開發團隊成員 (Luca & Thomas), 所以此書可說是學習 PyTorch 的第一手資料, 同時也是官方唯一推薦的教材, 值得一讀 : 


Source : 博客來


此書分成三大部分, Part 1 是 PyTorch 基礎, Part 2 介紹如何以 PyTorch 完成一個端對端專案; Part 3 說明模型的佈署方法. 書中程式範例可從 GitHub 下載 :


第三篇只有第 15 章, 因為篇幅限制改以電子書形式發布, 可從旗標網站下載 : 


範例程式都是 Colab 的筆記本 ipynb 檔案, 其第一個 cell 都固定是如下的匯入指令 : 

%matplotlib inline
from matplotlib import pyplot as plt
import numpy as np
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.set_printoptions(edgeitems=2)
torch.manual_seed(123)

如果在本機執行程式, 建議選用 nVidia GTX 1070 以上的影像卡 (8GB RAM).  

以下是看完第一章的筆記 :
  1. PyTorch 源自深度學習框架 Torch, 但 Torch 使用較為小眾的程式語言 Lua, 後來臉書 AI 團隊在 Torch 基礎上用 Python 改寫, 於 2017 年 1 月發布 PyTorch 0.1 版, 主要特色如下 :
    (1). 後端結合賈揚清等開發的 Caffe2.
    (2). 重新改寫了來自 Torch 框架中的低階程式碼.
    (3). 支援 ONNX (開放神經網路, Open Neural Network eXchange) 格式.
    (4). 取代了 CNTK 與 Chainer.
    (5). 添加了 TorchScript 延時執行圖表模式. 
  2. 出於性能考量, PyTorch 大部分的程式碼是用 C++ 與 CUDA 編寫. CUDA 是一種類似 C++ 的語言, 係繪圖卡大廠 NVIDIA (輝達) 所提出, 用 CUDA 編寫的程式碼編譯後可在 NVIDIA 的 GPU 上進行大量平行運算. 基本上 PyTorch 是由名為 torch 的模組提供多維陣列運算的函式庫. 
  3. 機器學習並非透過工程師撰寫的固定程式碼來解決複雜的問題, 而是由電腦自學出來的, 但若要因此而認為電腦在學習人類思考的方式則言過其實, 充其量只能說機器學習找到了能有效解決缺乏明確規則問題通用演算法
  4. 不要把我們主觀上認為的 "智慧" (intelligence) 與 "自我意識 (self-awareness)" 混為一談, 事實上, 自我意識並非解決問題的必要條件 (即具備 intelligence 的機器同樣可以解決本來需要人類處理的問題). 無須糾結於電腦是否會思考, 圖靈 (Alan Turing) 曾說 : "糾結電腦是否會思考, 就跟糾結潛艇是否會游泳一樣". 
  5. 2000 年代的機器學習大量仰賴特徵工程, 其目的是從資料中萃取出適合演算法 (例如分類器) 使用的特徵, 然後將其輸入到演算法中以得到正確的輸出結果. 深度學習透過反覆比對輸出與標籤, 可以自動從原始資料中找出特徵, 但這並不代表傳統機器學習的特徵工程在深度學習裡面沒有用處, 因為深度學習還是經常需要在演算法中輸入能讓演算法更容易識別某些已知特徵的先驗知識 (prior knowledge).
  6. 深度學習的強大之處在於神經網路能自行從資料中萃取有用的特徵 (此即監督式學習中不斷比對預測與標籤之差異, 透過優化器調整模型參數來使差異最小化), 不需要人工想辦法去找出特徵. 這些自動生成的特徵通常比那些人工找出來的特徵還要好, 這也是深度學習能突飛猛進的原因. 
  7. PyTorch 是深度學習的最佳入門工具, 不僅適合初學者了解深度學習, 也是應用於解決實際問題的專業工具. PyTorch 開發的初衷是, 在不增加函式庫複雜度前提下, 讓使用者能建構更複雜的網路結構. 在 ICLR 國際研討會中發表的論文中, PyTorch 被引用的次數與另一個深度學習框架 TensorFlow 不相上下. 
  8. PyTorch 在深度學習上有兩大特色 :
    (1). 支持以圖形處理器的 GPU 進行加速運算 (比 CPU 提升 50 倍). 
    (2). 可對一般數學進行數值最佳化計算.
    可將 PyTorch 定位為 : 支持最佳化功能的高效科學計算 Python 函式庫.
  9. PyTorch 所使用的資料結構稱為張量 (tensor), 它是一種多維陣列, 功能與 Numpy 的 ndarray 類似, 主要差別是 PyTorch 張量除了可在 CPU 上運算外, 還可在 GPU 上進行高速的平行分散計算, 且不需要額外呼叫函式來使用 GPU, 而是在建立張量時指定. 張量也會記錄自己是如何被計算出來的, 使得我們可以利用反向傳遞法很方便地計算出梯度. 
  10. 論文資料庫網站 ArXiV (https://arxiv.org) 上可找到許多深度學習論文, 很多論文在發表前會先上傳到 ArXiV, 先佔先贏概念 :).
  11. Google 除了開發出 TensorFlow 框架外, 另外還開發了 JAX 框架, 此函式庫相當於式添加了 GPU 加速運算, autograd 自動梯度運算, 以及 JIT 功能的 Numpy, 也受到非常多關注. 
  12. PyTorch 用於建構神經網路的核心模組 torch.nn, 提供常見的神經網路元件 :
    (1). 完全連接層 (fully connected layers)
    (2). 卷積層 (convolutional layers)
    (3). 激活函數 (activation functions)
    (4). 損失函數 (activation functions)
  13. 訓練神經網路模型需準備 :
    (1). 一組訓練資料集
    (2). 一組優化器 (optimizer, 用來根據訓練集來調整模型參數)
    (3). 一個整合模型, 資料, 與硬體的方法
  14. 在 PyTorch 中要載入與處理資料時, torch.util.data 是非常好用的工具, 其中會常用到的主要類別有兩個 :
    (1). Dataset : 連接使用者資料與 PyTorch 張量的橋樑.
    (2). DataLoader : 於後台生成子行程並從資料集載入資料.
  15. 一般使用本地 CPU 或 GPU 執行模型之訓練, 但若要用多台機器或多個 GPU 同時訓練模型, 可以用 torch.nn.parallel.DistributedDataParallel 與 torch.distributed 來使用額外資源. 當模型輸出結果後, 可用 torch.optim 經由不斷訓練來優化模型.
  16. PyTorch 預設為即時執行模式 (即 eager mode), 當 Python 直譯器執行 PyTorch 指令時, 實際上會呼叫相對應的底層 C++ 或 CUDA 執行, 雖然 C++ 執行速度很快, 但透過 Python 呼叫 C++ 會產生一些效能損耗. 為了避開 Python 直譯器效能問題, PyTorch 提供一個名為 TorchScript 的延遲執行模式, PyTorch 會透過 TorchScript 序列化出一組獨立於 Python 之外的指令, 可以把 TorchScript 看成一台擁有有限指令集, 專門用於張量運算的虛擬機器. 這也是 PyTorch 在業界被廣為應用的重要基礎. 

2 則留言 :

Augusta 提到...

請問你知道這本書檔案路徑下的檔案要怎麼下載嗎?
我買了這本書回家
照上面的程式碼打的路徑叫檔案
但是系統都顯示查無此檔案

小狐狸事務所 提到...

嗨, 其實不用花時間自己打, 點上文中的 GitGub 連結進去就有各章的 ipynb 範例檔案, 你可以下載至本機用 Jupyter Notebook 跑, 也可以上傳到 Colab 去跑, 我檢查並未有查無檔案問題.