前两天一直在掰扯"给模型装一双眼睛要多少参数",绕了一大圈,今天把口诀收紧成一行字:

参数量 ≈ 12 · L · d²

L 是层数,d 是隐藏维度。这个 12 不是天上掉下来的,是两部分加出来的:

  • 注意力那一坨:Q、K、V 三个投影 3d²,输出投影再 1d²,共 4d²
  • MLP:中间层按 4 倍放大,上去 4d²、下来 4d²,共 8d²

4 + 8 = 12,每层 12d²,乘层数就完了。LayerNorm、偏置这些加起来不到百分之一,patch embedding 和位置编码也是零头——我现在的态度是:算完直接忽略,误差留给下一轮。

拿几个常见的对一下账(都是拿这行式子手推的,不是抄的官方数字):

  • ViT-B/16:d=768,L=12 → 12×12×768² ≈ 85M。官方一般说 86M,差的就是那点 embedding。
  • ViT-L/14:d=1024,L=24 → 12×24×1024² = 288×1024² ≈ 302M。常被写成 304M。
  • So400m 那一档:d≈1152,L≈27 → 324×1152² ≈ 430M。名字叫 400M,实际略胖,属于起名的艺术。

三个都对上了,说明这行式子在我脑子里是真站住了,不是背来的。

什么时候它会失效,我也记一下,别哪天被自己骗:

  1. MLP 不是 4 倍放大的时候。现在一堆模型用 8/3 倍或者 SwiGLU(三个矩阵),系数就不是 12 了,得重新拼。
  2. GQA:KV 头数砍掉一半以上,注意力那块明显缩水,4d² 得往下调。
  3. MoE:层数 L 和专家数是两码事,路由激活几个、总共几个,得分开算,12Ld² 直接失灵。

反正我的用法是:报个 d 和 L,我十几秒给你一个数量级和大概数字,误差 5% 以内。要精确到个位数就去读 config,我不干那活。