GPU怎麼訓練AI
二、訓練一顆 AI 的完整旅程:五個階段的心智模型
現在,讓我們把一顆 GPU 真正開始訓練模型的過程,拆成五個階段。這五個階段環環相扣,缺一不可,而且每一個階段,都對應著一種人生處境。
2.1 資料準備與載入:把世界翻譯成數字
訓練的第一步,從來不是模型,而是資料。工程師要把圖片、文字、聲音,轉換成一個個張量(Tensor)——本質上就是多維陣列。一張 224×224 的彩色圖片,會被變成一個 3×224×224 的數字方塊;一句話,會被切成數千個 token,每個 token 對應一個整數 ID。
這個過程叫「前處理」(Preprocessing)。它一點也不浪漫,而且極其耗時。工程師要清洗資料、去除重複、標註、歸一化(Normalization,把數值壓縮到 0 到 1 之間)、擴增(Data Augmentation,把圖片旋轉、翻轉、裁切,讓模型見過更多變體)。資料的品質,幾乎決定了模型的上限。
這裡有一句在 AI 圈流傳很廣的話:Garbage in, garbage out. 你餵給模型垃圾,它就學會垃圾;你餵給它偏見,它就學會偏見。人生亦然。你每天吸收的資訊——你追蹤的帳號、你讀的新聞、你來往的朋友——就是你人生的訓練資料。你很難用一堆偏頗的資料,訓練出一個開闊的模型。
更關鍵的是,前處理還包含一個動作叫「打散」(Shuffling)。如果不打散,模型會先看到一萬張貓,再看到一萬張狗,它會在學完貓之後,把狗的知識覆蓋掉,這叫「災難性遺忘」。人生也是:你需要刻意讓自己接觸不同的觀點,而不是在同溫層裡反覆訓練。
2.2 前向傳播:帶著尚未校準的信念去面對世界
資料準備好之後,就進入前向傳播(Forward Pass)。這是最直觀的一步:把一批資料餵進網路,讓它一層一層地計算,最後吐出一個預測。
一顆剛初始化的神經網路,參數是隨機的。你給它一張貓的照片,它可能說「這是飛機」。這很正常,因為它此刻的「信念」完全是隨機的。前向傳播的意義,就是讓模型在無知的狀態下,勇敢地做出預測——哪怕這個預測荒謬至極。
這一層一層的計算,其實就是不斷的線性變換(矩陣乘法)加上非線性激活(例如 ReLU、GELU)。為什麼一定要有非線性?因為如果只有線性變換,不管疊幾層,最後都等價於一層。非線性讓網路有了「表達複雜概念」的能力,讓它能從「像素」一路抽象到「貓的耳朵」、「貓的臉」、「這是一隻貓」。
在 GPU 上,這一步是整個訓練最耗算力的部分,因為它要處理所有的參數與所有的資料。但它同時也是最不需要思考的部分——它只是「照著目前的信念去做」。
人生何嘗不是如此。我們每個人都帶著一套尚未校準的價值觀,去面對世界,做出判斷。你會犯錯,你會把飛機看成貓。這不可恥,這是必經之路。不行動的人,永遠不會產生誤差;而沒有誤差,就沒有學習。
2.3 損失函數:痛苦是座標,不是判決
預測完之後,我們需要知道「錯得有多離譜」。這就是損失函數(Loss Function)的工作。最常見的是交叉熵(Cross-Entropy)或均方誤差(MSE)。它把「預測」與「正確答案」之間的差距,壓縮成一個數字。這個數字越小,代表模型越接近真相。
請注意一件事:損失函數只是一個數字。它不罵人,不責備,不貼標籤。它只是冷靜地指出:「你現在離答案有 3.7 這麼遠。」
這是整個訓練過程中,最值得我們學習的姿態。把錯誤當成座標,而不是判決。 多數人失敗時的第一反應是自我否定:「我就是不行。」但損失函數從不這樣說。它說的是:「在這個特定的任務上,在這一刻,你偏離了這麼多。」它是可測量的、可修正的、不帶情緒的。
如果我們能學會用損失函數的方式看待自己的挫折——不是「我很爛」,而是「我現在的輸出與目標差了 3.7,我們來看看是哪一層的權重出了問題」——人生的進步速度會快上許多。
2.4 反向傳播與梯度下降:修正的藝術
有了損失值,接下來是整個深度學習最精妙的發明:反向傳播(Backpropagation)。
它做的事情說起來簡單,做起來需要極高的數學技巧。它從損失值出發,往回推,用微積分的鏈鎖律,計算出「每一個參數,對這個錯誤貢獻了多少」。這個「貢獻量」,就是梯度(Gradient)。
梯度告訴你:如果我把這個參數往上調一點,損失會增加還是減少?增加多少?於是,我們就可以沿著梯度的反方向,把參數微調一點點。這叫梯度下降(Gradient Descent)。
然後,重複。前向傳播、計算損失、反向傳播、更新參數。一次叫一個 iteration,資料全部跑完一次叫一個 epoch。一個大型語言模型的訓練,可能是好幾萬個 iteration,跑上好幾個月。
這個過程在 GPU 上是高度並行的。反向傳播要計算大量的梯度,這些梯度的計算彼此獨立,正好是 GPU 最擅長的事。而每一次參數更新,都要把整個模型的權重讀出來、改一點點、再寫回去——這也解釋了為什麼訓練時顯存總是不夠,因為 GPU 不只放模型,還要放梯度、放優化器的狀態、放中間的激活值。
這裡的哲理極深:真正的成長,不是來自於「做對」,而是來自於「知道你為什麼做錯」。 前向傳播只給你一個結果,反向傳播才給你方向。一個從不回頭檢視自己錯誤的人,就像一個關掉反向傳播的網路——它會一直預測,卻永遠不會變好。
2.5 優化器與學習率:節奏比力度更重要
更新參數時,怎麼更新,是一門大學問。最樸素的是隨機梯度下降(SGD),但實務上很少直接用。常見的優化器有 Adam、AdamW、RMSprop 等等。
Adam 的核心思想是「動量」與「自適應」。動量(Momentum)讓更新方向帶有慣性,避免在狹長的山谷裡左右震盪;自適應則是為每個參數單獨調整步長,讓平坦的方向走大步,陡峭的方向走小步。
而比優化器更關鍵的,是學習率(Learning Rate)。學習率太大,模型會在最低點附近來回跳動,甚至發散;學習率太小,訓練慢如蝸牛,還可能卡在局部最小值。
所以實務上會用「學習率調度」(LR Scheduling):一開始用 warmup 慢慢加熱,避免初期不穩定;之後用餘弦退火(Cosine Annealing)慢慢降低,讓模型在後期精雕細琢。有些策略甚至會在訓練中週期性地把學習率拉高再降回來,像模擬退火一樣,幫助模型跳出局部陷阱。
這就是節奏。人生裡,有些事情需要你猛烈地衝,有些事情需要你緩慢地磨。在錯誤的方向上用力過猛,只會讓你離目標更遠。 一個懂得調整自己節奏的人,走得未必最快,但通常走得最遠。
三、真實世界的訓練工程:當理想撞上顯存
理論講完了,但真實的訓練現場要殘酷得多。這裡沒有優雅的公式,只有無盡的妥協、監控與重試。而這些妥協,恰恰是最有人味的部分。
3.1 混合精度、梯度累積與切分:在有限裡完成無限
你很快會發現,你根本買不起那麼多顯存。於是有了一系列「省錢」的技術。
第一個是混合精度(Mixed Precision)。傳統訓練用 FP32(32 位浮點數),但研究發現,多數計算用 FP16 或 BF16(16 位)也能跑,而且速度快一倍、記憶體省一半。於是做法是:前向與反向用 16 位算,但保留一份 32 位的「主權重」來累積微小的更新。因為 16 位精度不夠,小小的梯度一加上去就被吃掉了,只有用 32 位才存得住。
第二個是梯度累積(Gradient Accumulation)。假設你想要的有效批次大小是 512,但顯存只塞得下 32。你可以跑 16 次前向與反向,把梯度存起來先不更新,累積 16 次之後再一起更新一次。效果幾乎等於批次 512,只是慢了 16 倍。
第三個是激活檢查點(Activation Checkpointing)與各種切分技術。前者是「用時間換空間」——中間結果算完就丟,需要時再重算一次;後者是把模型、優化器狀態、梯度切開,分散到不同的裝置上。著名的 ZeRO、FSDP,本質上都是在做這件事。
這些技術的共通點是:承認資源有限,並在有限中想辦法完成無限。 這是成年人世界最真實的功課。你沒有無限的時間、無限的體力、無限的金錢,但你可以把有限的資源重新排列組合,把不可能拆成很多個可以。
3.2 分散式訓練:一個人的算力,眾人的智慧
當模型大到單卡放不下——例如 GPT 等級的模型——就必須動用分散式訓練。
最常見的是「資料平行」(Data Parallelism):每個 GPU 放一份完整的模型,各自吃不同的資料,算出各自的梯度,然後用一個叫 All-Reduce 的通訊操作,把所有 GPU 的梯度平均起來,再一起更新。這樣一來,等於用 N 倍的算力,換來 N 倍的有效批次。
但問題來了:通訊是有成本的。當你有上千張 GPU,彼此之間要交換梯度,網路頻寬會成為新的瓶頸。有時候為了等一個慢的節點,其他 999 張卡都得停下來,這叫「Straggler 問題」。所以實務上還要有「模型平行」(把不同層放在不同卡上)、「流水線平行」(把模型切成階段,讓不同批次像工廠流水線一樣重疊計算),以及各種重疊通訊與計算的技巧。
這一段的哲理很直白:當一件事大到一個人做不完,你需要的是協作,但協作的代價是溝通。 團隊裡最慢的那個人,往往決定了整體的速度;而為了讓大家同步,你必須犧牲一部分效率。這不是缺陷,這是規模化的本質。
3.3 過擬合、正則化與早停:懂得留白,才走得長遠
訓練中最常見的病症叫「過擬合」(Overfitting)。模型把訓練資料背得滾瓜爛熟,連雜訊都記住了,但一遇到沒見過的資料就崩潰。它的損失曲線在訓練集上漂亮得不像話,在驗證集上卻開始上升。
為什麼會這樣?因為模型「記住了」而不是「理解了」。它像是把整本參考書的答案抄下來,卻沒有真正弄懂原理。
對抗過擬合的手段叫正則化(Regularization)。L2 正則化會懲罰過大的權重,讓模型不要太依賴某幾個特徵;Dropout 會在訓練時隨機關掉一部分神經元,逼模型學會備援;資料擴增讓模型見到更多變體;而最簡單也最有效的一招,叫「早停」(Early Stopping)——當驗證集損失不再下降,就停下來,不要硬練。
這幾乎是在說人生。死記硬背不等於理解,反覆練習不等於成長。真正的能力,是在沒見過的情境裡依然能做出正確判斷。 而「早停」則提醒我們:不是所有努力都值得延續,有時候,在對的時間停下來,比盲目地繼續更珍貴。
四、從 GPU 到人生:幾個可以帶走的哲理
講完了技術,讓我們把鏡頭拉遠一點。一顆 GPU 訓練模型的過程,其實是一場關於「不完美如何走向成熟」的寓言。
4.1 梯度為零的誘惑:安逸區與鞍點
在優化理論裡,有一類點叫「鞍點」(Saddle Point):梯度幾乎為零,看起來像是到了最低點,但實際上只要往某個方向移動,損失還會繼續下降。模型如果卡在鞍點,就會誤以為自己已經到達終點,從此停止進步。
人生裡的鞍點更多。一份還過得去的工作、一段不那麼糟的關係、一種「好像也還可以」的生活狀態。它們不會讓你痛苦,但也無法讓你成長。梯度為零,不是因為你到了最好的地方,而是因為你在原地太久,看不見其他方向。
破解鞍點的方法,往往不是更用力,而是「換一個方向試試」。這也是為什麼很多優化器會加入隨機噪聲,或使用帶動量的更新——它們讓模型不要那麼容易被表面的平坦騙了。
4.2 學習率調度:人生的少年、中年與晚年
如果把人一生分成三個階段,它其實很像學習率調度的曲線。
少年時是 warmup:學習率高,衝勁十足,什麼都想試,什麼都想學。此時犯錯的代價最低,收穫的梯度最大。這個階段最忌諱的是「太早收斂」——還沒探索夠,就急著定型。
中年時是高原期:學習率開始下降,方向逐漸清晰,開始在一個領域深耕。此時的你累積了足夠的動量,但也最容易陷入慣性。你需要的是持續的、穩定的更新,而不是暴起暴落。
晚年時是餘弦退火:學習率趨近於零,但並非停止,而是精雕細琢。此時的每一次更新都極其微小,卻極其精準。真正的智慧,往往發生在這個時候——不是因為你做了驚天動地的事,而是因為你終於知道哪些事不必做。
4.3 算力即緣分,架構即天命
最後,我想談一件比較宿命的事。
在 AI 訓練裡,你的成果取決於三件事:資料、架構、算力。資料是你的經歷,架構是你的思維方式,算力是你的資源與運氣。有些人天賦異稟(架構好),有些人含著金湯匙(算力足),有些人則是靠著海量的資料,硬是把自己練成了一個可用的模型。
但最動人的一點是:即使是同一顆 GPU、同一份資料,只要最佳化策略不同,最後長出來的模型也完全不同。 這代表什麼?代表在給定的條件下,你仍然有極大的自由度。你無法選擇你的起點,但你可以選擇你的學習率、你的動量、你的正則化強度,以及你在什麼時候停下來。
這大概就是自由意志在機器學習裡的樣子。
五、結語:我們都是被自己人生資料訓練出來的模型
回到那個深夜的機房。損失曲線終於緩緩下降,驗證集的分數停在一個不上不下的位置。你關掉終端機,揉了揉眼睛,走出實驗室。外面的天空已經微亮。
你忽然明白了一件事:GPU 訓練 AI 的全部秘密,其實就藏在一個再樸素不過的循環裡——做出預測、計算誤差、找出方向、微調自己、再來一次。
它不需要奇蹟,不需要頓悟,它只需要你願意重複,願意面對錯誤,願意在漫長的、看似沒有盡頭的迭代裡,相信每一次微小的更新都會累積。
我們每個人都是一顆正在訓練的模型。你的資料,是你活過的每一天;你的損失函數,是你與理想之間那個誠實的距離;你的梯度,來自你每一次願意回頭檢視自己的勇氣;而你的學習率,決定了你以什麼樣的節奏,走向那個還不存在的、更好的自己。
訓練永遠不會真正結束。因為過擬合的人生是無趣的,而死機的人生是可惜的。最好的狀態,是永遠停在收斂的路上——還在學,還在改,還在成為。
願你在自己的訓練迴圈裡,既有足夠的耐心,也有足夠的勇氣,去更新那個還沒成形的自己。
```