nn.ReLU,
nn.Linear(128, 10)
)
def forward(self, x):
x = self.flatten(x)
logits = self.linear_relu_stack(x)
return logits
這種面向物件的方式,讓模型的每一層、每一個操作都清晰可見。
最讓林晨感到舒心的是 PyTorch 的自動微分(autograd)系統和除錯的便捷性。他可以在訓練迴圈的任何地方,插入列印語句檢視張量的值、形狀,甚至計算梯度。
動態圖意味著計算圖是在程式碼執行時動態構建的,這帶來了無與倫比的靈活性——你可以用 Python 原生的控制流(if、for、while)來構建模型結構,這在研究新模型結構時簡直是神器。
“這才是程式設計的感覺”。林晨忍不住感嘆。
他嘗試修改網路結構,增加一個跳躍連線(Skip Connection),在 TensorFlow 中可能需要調整 tf.keras 的 API 用法,而在 PyTorch 裡,他幾乎像寫普通 Python 類一樣自然地在 forward 方法裡實現了。
為了更直觀地對比,林晨決定用兩個框架分別實現同一個稍複雜的模型——一個簡單的卷積神經網路(CNN),再次在 IST 上測試。
結果,在模型效能上兩者相差無幾(PyTorch 版本 98.2%,TensorFlow 版本 98.1%),但在開發體驗上,林晨明顯感覺 PyTorch 更符合他的思維習慣。
那種對模型細節的掌控感,對訓練過程每一步的透明可見,讓他覺得安心。尤其是想到未來他要開發的智慧投資系統,必然需要頻繁地嘗試各種網路結構、損失函式,甚至自定義訓練邏輯,PyTorch 的動態和靈活顯得至關重要。
“TensorFlow 像是為大規模部署而生的重型戰艦,穩定、強大,但轉向稍慢;PyTorch 則像是靈巧的突擊艦,適合快速迭代和前沿探索”。林晨在對比總結中寫下這句話,“對於目前的我,處於技術探索和原型快速開發階段,PyTorch 顯然是更合適的武器”。
做出了選擇,林晨感覺目標清晰了許多。
他不再滿足於僅僅實現教程裡的基礎模型。接下來的幾天,他給自己定下了新的挑戰:不依賴高階 API 的過度封裝,儘量從相對底層的角度,用 PyTorch 重新實現幾個深度學習的經典模型,深入理解其機理。
他選擇了三個有代表性的模型:LeNet-5(CNN 開山鼻祖之一)、簡單迴圈神經網路(RNN)用於體驗時序處理,以及 Transforr 中最核心的多頭自注意力(lti-Head Attention)機制。
這不再是跟著教程敲程式碼,而是需要他仔細閱讀原始論文(或權威解讀),理解每一層的數學含義,然後用 PyTorch 的張量操作和自動微分將其“翻譯”成程式碼。
實現 LeNet-5 相對順利,雖然比用現成的 nn.Conv2d 和 nn.xPool2d 組合要繁瑣,但親手寫出卷積和池化的操作過程,讓他對影像特徵提取的理解深刻了許多。
RNN 的實現則讓他對處理序列資料、隱藏狀態傳遞有了直觀感受。
而 Transforr 的自注意力機制,則是最大的挑戰。矩陣運算、縮放點積、多頭拆分與合併……林晨對著公式,一遍遍推導,一步步用程式碼實現。
當最後那個小小的自注意力模組能正確計算出一組示例序列的注意力權重時,窗外已是凌晨三點,但他毫無倦意,只有一種攻克難關後純粹的智力愉悅。
這些重新造輪子的過程,速度很慢,也沒有直接帶來任何實用價值,但林晨知道,這些深入底層的理解,正在構築他技術大廈最堅實的地基。
他不再只是一個呼叫 API 的“調參俠”,而是開始真正理解這些強大工具背後的原理。
夜深人靜,林晨儲存好所有程式碼和筆記。他活動了一下僵硬的脖頸,目光落在螢幕上那些自己親手實現的模型結構圖上。
從靜態圖到動態圖的選擇,從使用 API 到理解原理的深入,他感覺自己正一步步褪去過去十年跨境電商開發中形成的某種“應用層思維”,向著技術更本質的層面靠近。
?”聯關和式模的雜復更、次層深更種一是也是不是,聯的間之產資同不及以,期週、波、勢趨的中料資列序間時融金,麼那……聯關是賴依文下上的中列序言語,式模是狀形、緣邊的中片圖字數“,思所有若,上背椅在靠他。”聯關和式模的中料資習學在是都上質本,noitnettA、NNR、NNC 些這“
。速加微微跳心他讓頭念個這
。定確不的場市融金化量並解理——標目個那向通了為是都終最,握掌深和擇選的工技
。亮的更了出而,晰清的徑路技為因乎似也,標目的糊模個那而,手趁得變在正”武“的中手,覺他








