動手學深度學習pytorch
參考地址:https://zh.d2l.ai/
文章目錄
- 動手學深度學習pytorch
- 1-第03章-線性神經網絡
- 1. 線性回歸
- 1.1 什么是線性回歸?
- 1.2 如何表示線性回歸的預測公式?
- 2. 損失函數
- 2.1 什么是損失函數?
- 2.2 如何表示整個訓練集的平均損失?
- 3. 解析解
- 3.1 什么是解析解?
- 3.2 解析解的局限性是什么?
- 4. 小批量隨機梯度下降(SGD)
- 4.1 SGD一次更新步驟的偽代碼?
- 4.2 超參數有哪些?
- 5. 從線性回歸到單層神經網絡
- 5.1 如何把線性回歸視為神經網絡?
- 5.2 全連接層的定義?
- 6. Softmax 回歸(多類分類)
- 6.1 什么是 Softmax 函數?
- 6.2 交叉熵損失如何定義?
- 7. 從零實現 vs 簡潔實現(PyTorch)
- 7.1 從零實現的關鍵步驟?
- 7.2 簡潔實現用到的 PyTorch 高級 API?
- 8. 矢量化加速
- 8.1 為什么矢量化重要?
- 8.2 示例:向量相加
- 9. 信息論視角的交叉熵
- 9.1 熵 H(P) 的公式?
- 9.2 交叉熵 H(P,Q) 的公式?
- 10. Fashion-MNIST 數據集
- 10.1 數據集規模?
- 10.2 如何用 PyTorch 加載?
1-第03章-線性神經網絡
1. 線性回歸
1.1 什么是線性回歸?
線性回歸(linear regression)是一種經典的統計學習方法,用于建立自變量 x 和因變量 y 之間的線性關系模型,即假設 y 可以表示為 x 中元素的加權和,再加上一個偏置項 b。
1.2 如何表示線性回歸的預測公式?
對于單樣本特征向量 x∈??,預測值 ? 的向量化公式為
y^=w?x+b\hat y = w^\top x + by^?=w?x+b
其中 w 為權重向量,b 為偏置標量。
2. 損失函數
2.1 什么是損失函數?
損失函數(loss function)用來量化模型預測值與真實值之間的差距。在線性回歸中,最常用的損失函數是平方誤差(均方誤差):
l(i)(w,b)=12(y^(i)?y(i))2l^{(i)}(w,b)=\frac12\bigl(\hat y^{(i)}-y^{(i)}\bigr)^2l(i)(w,b)=21?(y^?(i)?y(i))2
2.2 如何表示整個訓練集的平均損失?
L(w,b)=1n∑i=1nl(i)(w,b)=12n∑i=1n(w?x(i)+b?y(i))2L(w,b)=\frac1n\sum_{i=1}^n l^{(i)}(w,b)=\frac1{2n}\sum_{i=1}^n\bigl(w^\top x^{(i)}+b-y^{(i)}\bigr)^2L(w,b)=n1?i=1∑n?l(i)(w,b)=2n1?i=1∑n?(w?x(i)+b?y(i))2
3. 解析解
3.1 什么是解析解?
解析解(analytical solution)指通過數學公式一次性求得的參數最優值,無需迭代優化。
線性回歸的解析解為
w?=(X?X)?1X?yw^*=(X^\top X)^{-1}X^\top yw?=(X?X)?1X?y
其中 X 為 n×d 的設計矩陣,y 為 n×1 的標簽向量。
3.2 解析解的局限性是什么?
僅適用于能寫成閉合形式的問題;對大規模數據或復雜模型(如深度網絡)難以直接應用。
4. 小批量隨機梯度下降(SGD)
4.1 SGD一次更新步驟的偽代碼?
- 隨機采樣小批量 B(大小 |B|)。
- 計算平均梯度:
g←1∣B∣∑i∈B?w,bl(i)(w,b)g \leftarrow \frac1{|B|}\sum_{i\in B}\nabla_{w,b}\,l^{(i)}(w,b)g←∣B∣1?i∈B∑??w,b?l(i)(w,b) - 更新參數:
w←w?ηgw,b←b?ηgbw \leftarrow w - \eta\,g_w,\quad b \leftarrow b - \eta\,g_bw←w?ηgw?,b←b?ηgb?
4.2 超參數有哪些?
- 學習率 η
- 批量大小 |B|(batch size)
5. 從線性回歸到單層神經網絡
5.1 如何把線性回歸視為神經網絡?
把輸入視為輸入層(d 個神經元),計算層為單個全連接(Dense)層,權重矩陣 W∈?^{1×d},偏置 b∈?,因此網絡層數為 1。
5.2 全連接層的定義?
每個輸入特征都與每個輸出單元相連,計算為
oj=∑ixiwij+bjo_j = \sum_i x_i w_{ij} + b_joj?=i∑?xi?wij?+bj?
6. Softmax 回歸(多類分類)
6.1 什么是 Softmax 函數?
把未規范化的 logit 向量 o∈?^q 映射為概率分布:
y^j=eoj∑k=1qeok\hat y_j = \frac{e^{o_j}}{\sum_{k=1}^q e^{o_k}}y^?j?=∑k=1q?eok?eoj??
保證 0 ≤ ?_j ≤ 1 且 Σ_j ?_j = 1。
6.2 交叉熵損失如何定義?
對于獨熱標簽 y 和預測概率 ?:
l(y,y^)=?∑j=1qyjlog?y^jl(y,\hat y)=-\sum_{j=1}^q y_j\log\hat y_jl(y,y^?)=?j=1∑q?yj?logy^?j?
7. 從零實現 vs 簡潔實現(PyTorch)
7.1 從零實現的關鍵步驟?
- 生成/加載數據
- 初始化參數
- 定義模型
linreg(X,w,b)
或net(X)
- 定義損失
squared_loss
/cross_entropy
- 定義優化器
sgd
- 循環
for epoch / for batch
訓練
7.2 簡潔實現用到的 PyTorch 高級 API?
nn.Sequential(nn.Linear(...))
定義模型nn.MSELoss()
/nn.CrossEntropyLoss()
定義損失torch.optim.SGD
定義優化器data.DataLoader
構建高效數據迭代器
8. 矢量化加速
8.1 為什么矢量化重要?
利用 GPU/CPU 的并行矩陣運算,避免 Python for-loop,可帶來數量級加速。
8.2 示例:向量相加
# 慢
c = torch.zeros(n)
for i in range(n):c[i] = a[i] + b[i]# 快
d = a + b
9. 信息論視角的交叉熵
9.1 熵 H§ 的公式?
H(P)=?∑jP(j)log?P(j)H(P)=-\sum_j P(j)\log P(j)H(P)=?j∑?P(j)logP(j)
表示真實分布 P 的不確定性。
9.2 交叉熵 H(P,Q) 的公式?
H(P,Q)=?∑jP(j)log?Q(j)H(P,Q)=-\sum_j P(j)\log Q(j)H(P,Q)=?j∑?P(j)logQ(j)
衡量用模型分布 Q 編碼真實分布 P 所需的平均比特數。模型越準,H(P,Q) 越接近 H§。
10. Fashion-MNIST 數據集
10.1 數據集規模?
- 訓練集:60 000 張 28×28 灰度圖
- 測試集:10 000 張
- 10 個類別:T-shirt、Trouser、Pullover、Dress、Coat、Sandal、Shirt、Sneaker、Bag、Ankle boot
10.2 如何用 PyTorch 加載?
trans = transforms.ToTensor()
train_ds = torchvision.datasets.FashionMNIST(root='../data', train=True, transform=trans, download=True)
train_iter = torch.utils.data.DataLoader(train_ds, batch_size=256, shuffle=True)