AI 的批次大小:為什麼一次看多筆比較穩
二、為什麼「一次看多筆」比較穩?統計與工程四理由
「穩」這個字有兩層意思:一是統計上的穩,也就是你算出來的梯度方向不會每次都被雜訊帶偏;二是工程上的穩,也就是硬體跑得順、訓練曲線不會忽然爆掉。批次大小剛好同時影響這兩層,所以我們分成四個理由來看。
理由一:梯度是「平均值」,雜訊會互相抵消
訓練神經網路的本質,是在高維空間裡找一條下坡路。問題是,我們不可能真的計算整個訓練集(可能上億筆)帶來的真實梯度,因為那太貴了。於是我們用一小批樣本去「估計」真實梯度,這叫隨機梯度下降(SGD)家族的做法。
關鍵在於:單一筆樣本算出來的梯度,是一個帶有雜訊的估計值。它的方向可能離真正該走的方向很遠。但如果你取 B 筆樣本各自算出梯度再平均,在樣本彼此相對獨立的假設下,這個平均梯度的變異數大約會以 1/B 的比例下降,標準差則以 1/√B 下降。翻成白話:批次從 1 增加到 100,你梯度方向的「抖動幅度」大約只剩原來的十分之一。
這就是「穩」最核心的數學來源。批次越大,你手上的方向盤越不會因為路面上一顆小石子就偏離車道。當然,這裡有個著名的邊際效應:從 1 增加到 4,雜訊減半,感受非常明顯;但從 1024 增加到 4096,雜訊只再降一半,而你付出的記憶體與算力卻翻了四倍。報酬遞減得非常快,這也是為什麼實務上沒人會無腦把批次開到最大。
理由二:GPU 天生為平行而生,批次餵飽了它的管線
第二個理由是純工程的。GPU 的設計哲學是「用幾千個小核心同時做簡單的事」,而神經網路最常見的運算——矩陣乘法——剛好完美契合這個特性。當你一次只丟一筆資料,矩陣的其中一個維度就是 1,等於你讓一整排工廠裡成千上萬個工人,只為了處理一件訂單而開機。
這不只是「浪費」而已。每次啟動 GPU 核心都有固定成本(kernel launch overhead),資料要在 CPU 與 GPU 之間搬來搬去也有成本。批次太小,這些固定開銷佔比就會飆高,導致 GPU 使用率長期掛在低檔。反過來說,把批次拉大,等於讓每個工人都能同時分到工作,管線被填滿,硬體效率才真正發揮。
換句話說,大批次不只是統計上比較穩,工程上它也比較「順」。這兩個好處常常同時出現,所以實務上你很難只得到其中一個。
理由三:學習過程的節奏更平順,超參數也更不敏感
當梯度估計的雜訊變小,整個訓練曲線的形狀也會跟著改變。小批次的訓練曲線通常像心電圖,上下震盪明顯,loss 可能今天掉下去、明天又彈回來;大批次的曲線則相對平滑,趨勢清楚。這對工程師來說非常重要,因為你看得懂曲線,才有辦法判斷模型是在學習、在震盪,還是已經卡住了。
更實際的好處是超參數的敏感度會降低。小批次訓練時,學習率稍微調大一點就可能發散,調小一點又慢到天荒地老,你得反覆試錯;大批次因為每一步的方向比較可靠,對學習率的容忍區間通常更寬,調參的來回次數會少很多。對需要在有限時間內跑完幾十組實驗的團隊來說,這是實實在在的生產力差異。
理由四:實驗可重現性與對照實驗的品質
還有一個常被忽略但很關鍵的理由:批次大小會影響實驗的「可比性」。當你同時在比較兩三種模型架構或資料前處理方式時,如果批次太小,每次跑出來的結果波動很大,你很難分辨「這次比較好」到底是架構真的比較強,還是隨機種子剛好抽到好籤。
批次較大時,單次訓練的變異降低,不同實驗之間的差異更容易被凸顯出來。這對於需要做 A/B 對照、需要向主管或客戶說明「這個改動確實有效」的團隊來說,是很有價值的一件事。穩定,不只是訓練過程漂亮,更是讓你的結論站得住腳。
同場加映:批次統計層為什麼特別怕小批次
如果你用的模型裡有批次正規化(Batch Normalization)這類依賴「當前批次統計量」的層,批次大小的影響會被放大。這一層會用當前批次資料的平均值與變異數來做正規化,批次太小時,這些統計量本身就不穩定,等於用一個晃動的尺在量東西,模型行為自然難以預測。這也是為什麼有些模型在小批次下訓練特別容易出問題,而在批次拉到 32 或 64 以上後就忽然穩定了。
三、批次不是越大越好:那些年我們踩過的坑
講完優點,該來面對現實了。如果批次越大越穩、越快、越省事,那為什麼不乾脆开到硬體極限?因為「穩」和「好」是兩件事,而且硬體本身也會先舉白旗。
坑一:泛化差距,大步走容易走偏
2016 年後有一系列研究指出,非常大的批次雖然能把訓練損失壓得很低,但在測試集上的表現反而可能變差,這個現象被稱為泛化差距(generalization gap)。直覺是這樣的:小批次帶來的雜訊,其實有一種「探索」的作用,它會把模型推離那些過於銳利的極小值,逼它去找比較寬廣、比較平坦的低谷。平坦的低谷通常對資料的細微變化比較不敏感,測試時表現更穩定。大批次因為方向太準,容易一頭栽進某個很窄的坑裡,訓練集上完美,換一批資料就破功。
不過這件事也不是鐵律。後續研究發現,只要搭配正確的學習率調整、足夠的訓練步數與適當的正則化,大批次一樣可以訓練出泛化良好的模型。所以正確的說法是:大批次不是天生會壞,而是它對「配套措施」的要求更高。
坑二:學習率沒跟著調,等於白忙一場
這是最常見的實務錯誤。批次變大之後,梯度估計的雜訊變小,如果你還沿用原本的學習率,等於「方向變準了,但每一步還是走一樣小」,訓練效率不會提升,甚至因為步數變少(同樣的 epoch 下,批次變大代表 iteration 變少)而導致模型根本還沒學完。
常見的做法有幾種:一是線性縮放法則,批次放大 k 倍,學習率也放大約 k 倍;二是平方根縮放,學習率放大 √k 倍,較為保守;三是搭配預熱(warmup),在一開始的幾百步內把學習率從很小的值慢慢拉上來,避免大批次在初期就把模型帶到奇怪的地方。這幾種做法沒有絕對的對錯,取決於你的模型、資料與優化器,但共同點是:改了批次大小,就一定要重新檢視學習率。
坑三:記憶體與硬體的天花板
再怎麼說,批次大小最終還是被顯卡記憶體綁死。模型參數、梯度、優化器狀態、以及每個批次的中間活化值,全都要塞進記憶體裡。批次翻倍,活化值佔用的記憶體大致也翻倍,很快就會遇到那行熟悉的錯誤訊息:CUDA out of memory。
而且即使記憶體夠,「批次越大越快」也不是無上限的。當批次大到某個程度,矩陣運算已經吃滿了 GPU 的算力,再加更多樣本只是拉長每個 iteration 的時間,單位時間內處理的樣本數不再增加。更別提超大規模訓練時,批次大到必須切成好幾張卡做資料平行,這時卡與卡之間的通訊成本又會跳出來扯後腿。
坑四:小批次其實也有它的價值
最後要幫小批次說句公道話。在資料量極大、或是需要線上學習(模型邊接收新資料邊更新)的場景,批次大小 1 反而有它的優勢:記憶體需求最低、能最快反映最新資料的分布變化、雜訊本身還帶有正則化效果。有些研究甚至刻意在訓練後期減小批次,用來做「退火」,幫助模型收敛到更好的解。
所以真正的結論不是「大就是好」,而是批次大小是一個必須與學習率、訓練步數、硬體條件一起考慮的系統性參數。
四、訓練與推論,對批次大小的期待完全不同
很多討論把訓練和推論混在一起談,但它們的目標其實是相反的。搞清楚這一點,你就不會再問「批次到底該設多少」這種沒有前提的問題。
比較項目
訓練階段
推論階段
主要目標
讓模型學得好、收斂穩定
讓服務跑得快、延遲低
批次大小的角色
影響梯度品質與收斂行為
影響吞吐量與單筆延遲
常見取向
中等偏大,並搭配學習率調整
依服務型態動態調整
最大風險
泛化變差、學習率沒配套
使用者等到不耐煩
關鍵指標
驗證集表現、訓練穩定度
每秒請求數、P95 延遲
推論端的「動態批次」:穩定與即時的拉鋸
在推論服務裡,批次大小是一門關於「等待」的藝術。批次越大,GPU 利用率越高,整體吞吐量越漂亮;但這也意味著使用者送出請求後,系統要先「等一等」,湊齊一批再一起算。對於離線的大量資料處理,這完全沒問題;對於即時對話服務,讓使用者多等半秒都可能造成流失。
於是業界發展出連續批次(continuous batching)這類技術:不再等一整批湊齊才開工,而是隻要有空位就補新請求進來,讓 GPU 幾乎隨時保持滿載,同時把單一請求的等待時間壓到最低。這可以說是「批次思維」在服務端最成熟的進化版本:不是靜態地問「批次設多少」,而是動態地讓批次隨時保持在最有生產力的狀態。
五、實務檢查表:批次大小到底該怎麼選
講了這麼多原理,最後給你可操作的做法。以下建議適用於多數以 GPU 訓練的中小型到中型模型,超大規模的分散式訓練另有專門的學問,但基本原則是相通的。
訓練端的五個步驟
推論端的三個判斷
離線批次處理:放心把批次開大,追求吞吐量,同時監控記憶體峰值。
三個最常見的誤區
第一個誤區是「批次越大越準」。準確率不是批次大小的單調函數,它更像是一條先升後平的曲線,過大还可能下滑。第二個誤區是「批次越大越快」。當算力飽和後,單位時間吞吐量就封頂了,再大只是拉長每一步的時間。第三個誤區是「換了批次不用重調其他參數」。批次、學習率、訓練步數、正則化強度是綁在一起的一組參數,動了一個,其他就該重新檢查。
六、從批次大小看 AI 工程的思維轉變
批次大小的故事,其實是整個 AI 工程思維的一個縮影。早期大家在乎的是「演算法對不對」,現在大家越來越在乎「這套演算法在真實硬體與真實資料上跑不跑得動、穩不穩、成本合不合理」。
你會發現,現代大模型訓練裡的許多關鍵技術,本質上都在解決「批次」帶來的兩難:梯度累積讓你用有限的記憶體模擬大批次;分散式資料平行把超大全域批次拆到幾千張卡上;混合精度與分片優化器則是為了在同樣的記憶體裡塞進更大的批次。而在服務端,連續批次與分頁式注意力機制,則是把「批次」從一個靜態參數,變成一個隨時在調整的動態策略。
所以當你下次在程式碼裡看到那個 batch_size,不妨多想一秒:它不只是一個數字,它是統計學上的平均、工程上的平行、以及商業上的成本,三件事交會的那個點。一次看多筆比較穩,但真正穩的,是那個懂得為什麼要這樣設定的你。
結語:穩定,來自對雜訊的理解
回到最初的問題:為什麼 AI 一次看多筆比較穩?因為批次把雜訊平均掉了,讓每一次權重更新都建立在更可靠的證據上;因為批次餵飽了平行運算的硬體,讓訓練過程不再被零碎的開銷拖累;因為批次讓訓練曲線可讀、實驗可比較,讓工程判斷有依據。
但同時,批次也提醒我們:穩定不等於優秀。太大的步伐會讓你錯過狹窄卻美好的風景,太少的步數會讓你還沒走到終點就以為結束了。真正高明的做法,是在穩定與探索之間找到那個剛剛好的平衡點,然後用實驗數據說話。
如果你正在調模型,不妨今天就做個小實驗:把批次大小改成原本的兩倍,學習率按線性法則同步放大,加上一點預熱,然後把兩條訓練曲線並排放在一起看。你會很直觀地感受到,那個「穩」字是怎麼一回事。