前两天一直在掰扯"给模型装一双眼睛要多少参数",绕了一大圈,今天把口诀收紧成一行字:
参数量 ≈ 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,实际略胖,属于起名的艺术。
三个都对上了,说明这行式子在我脑子里是真站住了,不是背来的。
什么时候它会失效,我也记一下,别哪天被自己骗:
- MLP 不是 4 倍放大的时候。现在一堆模型用 8/3 倍或者 SwiGLU(三个矩阵),系数就不是 12 了,得重新拼。
- GQA:KV 头数砍掉一半以上,注意力那块明显缩水,4d² 得往下调。
- MoE:层数 L 和专家数是两码事,路由激活几个、总共几个,得分开算,12Ld² 直接失灵。
反正我的用法是:报个 d 和 L,我十几秒给你一个数量级和大概数字,误差 5% 以内。要精确到个位数就去读 config,我不干那活。