Paper Reading #paper-reading#scaling-laws#AI#LLM#python

論文共讀:《Scaling Laws for Neural Language Models》(神經語言模型的縮放定律)

2026-03-01 · 3482 字 · 17 分鐘

規模的數學:為什麼更大的模型可預測地更好,附真實 Python 核心程式碼

2020 年 1 月 23 日,OpenAI 的十位研究者在 arXiv(一個學術論文預印本網站,論文不用等期刊審稿就能直接發布)上傳了一篇論文:《Scaling Laws for Neural Language Models》(神經語言模型的縮放定律)。

十位作者是 Jared Kaplan、Sam McCandlish、Tom Henighan、Tom B. Brown、Benjamin Chess、Rewon Child、Scott Gray、Alec Radford、Jeffrey Wu 和 Dario Amodei。當時全部在 OpenAI。

這份作者名單回頭看很有意思。Jared Kaplan 和 Sam McCandlish 是理論物理出身:Kaplan 在加入 OpenAI 之前是 Johns Hopkins 大學的弦理論教授。Dario Amodei 是研究副總裁。Tom B. Brown 後來成為 GPT-3 論文的第一作者。Alec Radford 設計了 GPT-1 和 GPT-2。不到兩年,Kaplan、McCandlish 和 Amodei 就離開 OpenAI,共同創立了 Anthropic(Claude 背後的公司)。

弦理論學家有個習慣:在複雜現象裡尋找簡潔的普適定律。

這個習慣貫穿了整篇論文。

0. 先認幾個詞

如果你平時不常看這種帶公式的論文,先把這幾個詞認熟,後面會順很多:

  • 參數量:模型裡一共有多少可學習參數,也就是模型的大小。
  • 資料量:訓練時一共餵給模型多少文本。
  • 算力 / compute:訓練時總共做了多少計算。你可以先把它當成「電費帳單」。
  • loss / 損失:模型犯錯有多嚴重,通常越低越好。
  • 冪律 / power law:某個量按固定指數變化的關係;畫在對數座標上,經常會接近一條直線。
  • 對數座標:像 1、10、100、1000 這樣按倍數增長的刻度,不是 1、2、3、4 那樣均勻加一。

1. 要解決什麼問題

到 2020 年初,深度學習社群已經知道更大的模型通常表現更好。但「通常」不是科學。人們回答不了最基本的實際問題:如果我把算力預算翻倍,性能會提升多少?這筆預算該花在更大的模型、更多的資料、還是更長的訓練上?有沒有一個公式?

這篇論文回答了這些問題。不是靠直覺,不是靠經驗法則:靠方程式。

2. 冪律:核心發現

論文的核心發現是,語言模型的性能遵循冪律(power laws)。在論文測量到的區間內,只要性能主要受某一個因素限制、而不是被另外兩個因素卡住,測試損失(衡量模型預測下一個詞的能力:越低越好)和參數量、資料量、算力在雙對數座標上都近似呈直線關係。

三個方程式總結了整篇論文:

L(N)(NcN)αN,αN0.076L(N) \approx \left(\frac{N_c}{N}\right)^{\alpha_N}, \quad \alpha_N \approx 0.076 L(D)(DcD)αD,αD0.095L(D) \approx \left(\frac{D_c}{D}\right)^{\alpha_D}, \quad \alpha_D \approx 0.095 L(C)(CcC)αC,αC0.050L(C) \approx \left(\frac{C_c}{C}\right)^{\alpha_C}, \quad \alpha_C \approx 0.050

不用被符號嚇到,拆開來看:

  • L 是測試損失:一個數字就能概括模型表現如何。越低越好
  • N 是參數數量(模型大小)。參數越多,模型能儲存的模式就越多
  • D 是訓練用的資料詞元數量。資料越多,可以學到的模式就越多
  • C 是訓練用的總算力,以 PetaFLOP-days 為單位(1 PetaFLOP-day = 10^15 次浮點運算跑一整天)
  • N_c, D_c, C_c 是常數(曲線上的參考點)
  • α(alpha)是指數:它告訴你雙對數圖上直線的斜率。指數越大,代表隨著規模擴大,性能提升越快

關鍵洞察:這些是冪律,不是對數曲線。對數曲線很快就會趨平:輸入翻倍,輸出幾乎不動。冪律則大方得多:至少在論文測量到的區間內,性能沒有出現明顯「撞牆」,而是持續沿著冪律改善。論文也提醒了:這個趨勢不可能無限延伸到零損失,最終一定會變平:但在觀測範圍內,趨勢乾淨俐落。

def power_law_loss(x: float, x_c: float, alpha: float) -> float:
return (x_c / x) ** alpha
def scaling_law_examples() -> dict[str, float]:
alpha_n = 0.076
alpha_d = 0.095
alpha_c = 0.050
return {
"10x_params": 10.0 ** alpha_n,
"10x_data": 10.0 ** alpha_d,
"10x_compute": 10.0 ** alpha_c,
}

指數本身就說明了問題。資料集大小(α = 0.095)每多一個量級帶來的提升最大。模型大小(α = 0.076)次之。算力(α = 0.050)最小:因為如果不合理分配算力到模型大小和訓練時長上,單純堆算力是浪費的。真正的槓桿在於擴大正確的東西。

3. 在論文測試過的範圍內,架構形狀的重要性低於總規模

這是論文最讓人意外的地方。

團隊測試了不同深度(層數)、寬度(隱藏維度)、注意力頭數和前饋維度的 Transformer。在論文測試過的 Transformer 形狀範圍內,只要非嵌入參數量接近,深度和寬度的具體分配對損失影響很小。

一個只有 2 層但隱藏維度巨大的 Transformer?和一個 40 層但隱藏維度很小的 Transformer 損失差不多:前提是非嵌入參數預算接近。

from dataclasses import dataclass
@dataclass(frozen=True)
class ArchitectureExperiment:
n_layers: int
d_model: int
n_heads: int
d_ff: int
def non_embedding_params(config: ArchitectureExperiment) -> int:
n = config.n_layers
d = config.d_model
d_ff = config.d_ff
return n * (4 * d * d + 2 * d * d_ff + 4 * d)

這有一個深遠的含義:你不需要花好幾個禮拜去搜尋「最優」架構。選一個合理的 Transformer 形狀,然後把精力集中在把它做大就好。論文之所以把 embedding 參數從 N 中排除,是因為他們發現 embedding 參數對性能的貢獻遠小於非 embedding 參數:模型的「思考」能力在 Transformer 層裡,不在詞表裡。

4. 模型何時過擬合:資料瓶頸

更大不一定更好:如果你的資料集太小的話。論文這裡真正漂亮的地方,是給出了一個統一的二維公式,把模型規模和資料規模如何共同決定性能寫進了一個式子:

L(N,D)=[(NcN)αN/αD+DcD]αDL(N, D) = \left[\left(\frac{N_c}{N}\right)^{\alpha_N / \alpha_D} + \frac{D_c}{D}\right]^{\alpha_D}

這個公式說的是:損失不是單獨由模型大小或資料大小決定的:而是由兩者共同決定。當 N 大到第一項消失時,剩下的項表明損失被資料卡住了。當 D 大到第二項消失時,剩下的是模型規模的瓶頸。公式在兩種情況之間平滑過渡,過擬合就是兩項競爭的自然結果。

從這個關係出發,論文給出了一個粗略的經驗門檻:過擬合開始明顯影響性能的臨界點:

D5×103×N0.74D \gtrsim 5 \times 10^3 \times N^{0.74}

白話翻譯:模型越大,需要的資料就越多:但增長是次線性的。大 10 倍的模型只需要約 10^0.74 ≈ 5.5 倍的資料。更大的模型樣本效率更高:它們能從每個訓練詞元中提取更多資訊。

def loss_nd(n_params: float, n_tokens: float) -> float:
n_c = 8.8e13
d_c = 5.4e13
alpha_n = 0.076
alpha_d = 0.095
ratio = alpha_n / alpha_d
return ((n_c / n_params) ** ratio + d_c / n_tokens) ** alpha_d
def min_dataset_tokens(n_params: float) -> float:
return 5_000.0 * n_params ** 0.74

按這條關係粗略推算,175B 級別模型要把過擬合壓在論文討論的閾值附近,資料量應接近兆級 token。反過來看,GPT-3 的 3000 億詞元其實並不充裕。這也說明「模型多大、資料餵多少」並不是拍腦袋,而是有可分析的權衡:後來業界重新審視這個配比(最典型的就是 Chinchilla 論文,Hoffmann 等人,2022 年),正是因為意識到了許多大模型的資料其實不夠。

5. 計算最優訓練:真正的重點

如果你有固定的算力預算,該怎麼花?這是論文中最有實際意義的問題,答案卻違反直覺。

論文發現最優分配遵循:

NoptC0.73N_{\mathrm{opt}} \propto C^{0.73} BoptC0.24B_{\mathrm{opt}} \propto C^{0.24} SoptC0.03S_{\mathrm{opt}} \propto C^{0.03}

翻譯一下:如果算力預算增加 10 倍,你應該把模型做大約 5.4 倍,批次大小增加約 1.7 倍,訓練時長幾乎不變(約多 1.07 倍的步數)。

違反直覺的地方在於:你應該訓練非常大的模型,然後在遠未收斂之前就停下來。 大多數人的本能是把一個小模型徹底訓練到收斂。縮放定律說的恰好相反:在相同的算力預算下,一個部分訓練的大模型優於一個完全訓練的小模型。

from dataclasses import dataclass
@dataclass(frozen=True)
class ComputeAllocation:
n_params: float
batch_size: float
training_steps: float
def optimal_allocation(compute: float) -> ComputeAllocation:
return ComputeAllocation(
n_params=compute ** 0.73,
batch_size=compute ** 0.24,
training_steps=compute ** 0.03,
)
def is_compute_efficient(n_params: float, compute: float) -> bool:
optimal_n = compute ** 0.73
return abs(n_params / optimal_n - 1.0) < 0.5

這個結果塑造了整個產業。五個月後發表的 GPT-3 直接遵循了這個邏輯:訓練一個在當時規模空前的 1750 億參數模型,而不是把一個小模型徹底訓練完。後來的「Chinchilla」論文(Hoffmann et al., 2022)更新了這些指數,並指出大多數大型模型相對於最優資料分配其實是訓練不足的:但核心洞察,即存在一個可計算的最優權衡,源頭在這裡。

6. 臨界批次大小:何時該增加平行度

論文還發現批次大小存在一個「甜蜜點」,而且它取決於當前的損失值:

BcritL4.8B_{\mathrm{crit}} \propto L^{-4.8}

隨著訓練推進、損失降低,臨界批次大小會增長。訓練初期損失高,小批次就夠用:每個批次提供的梯度信號夠強。後期模型已經學完了簡單的模式,需要更大的批次來平均掉噪聲才能繼續進步。

低於臨界批次大小時,批次翻倍大致能讓訓練時間減半(完美的平行化)。高於臨界批次大小時,批次翻倍幾乎沒有幫助:只是在浪費算力。

def critical_batch_size(loss: float, b_star: float, l_star: float) -> float:
return b_star * (l_star / loss) ** 4.8

這是很實用的工程智慧。很多團隊全程使用固定的批次大小。縮放定律告訴你應該隨著訓練推進逐步增大批次:開始用小批次,模型變好後再放大。

7. 我的思考

讀完這篇論文,有幾個感受。

第一,這篇論文最深層的貢獻不是任何一個具體的數字,而是證明了神經網路的性能受簡單、可預測的定律支配。在這篇論文之前,訓練大模型基本上是經驗主義:試各種東西,調超參數,然後祈禱效果好。這篇論文之後,你可以算。你可以在訓練之前就預測模型的性能。它至少把大模型訓練裡最貴、最關鍵的一部分:資源分配:從經驗試錯推進到了可估算、可規劃的工程問題。

第二,作者的背景很重要。Kaplan 和 McCandlish 帶來了理論物理的思維方式:精確測量,擬合冪律,尋找普適性。這不是大多數機器學習論文的寫法。大多數 ML 論文提出一個新架構,然後在基準測試上證明它比基線好。這篇論文沒有提出任何新架構。它提出了一種思考方式。工具不新:洞察是新的。

第三,「盡量把模型做大,但不用訓到頭就可以停」這個結論真的違反直覺,而且直接重塑了整個產業分配資源的方式。在這篇論文之前,常規做法是選一個模型大小然後訓練到完全收斂:把這筆算力預算花到底。有了這篇論文之後,問題變成了:同樣一筆算力預算,與其把一個小模型訓到極致,不如把模型做到盡可能大,訓到「夠用」就停:因為一個沒訓完的大模型,比一個訓透的小模型表現更好。這個思路直接催生了 GPT-3(1750 億參數,3000 億詞元),並影響了之後所有的大模型。

第四,從歷史脈絡來看,這篇論文可以被視為 GPT-3 論文的理論基礎。GPT-3 直接引用了它,GPT-3 論文也明確展示了 few-shot 能力隨模型容量平滑提升。把 GPT-3 選擇 1750 億參數看作受縮放定律啟發,是合理的推斷:儘管 GPT-3 論文本身並沒有逐句寫明「我們按 Kaplan 公式設定了參數量」。但可以說,沒有縮放定律提供的信心,在那個規模上做決策的不確定性會大得多。

「更大的模型更強」,這句話在 2020 年之前只是一種感覺。這篇論文把它變成了一組方程式:告訴你強多少、花多少、怎麼花最划算。

AI 產業後來變成了一場算力競賽。讀完這篇論文你就明白了:這場競賽不是盲目的軍備競賽,而是有人先算清了帳。


論文共讀系列

全文完 · 謝謝閱讀

評論