本文目录
先写下一个看起来很顺手的答案:有两层隐藏层、每层 10 个神经元,输出层也有 10 个神经元,所以 110 + 110 + 110 = 330。
这个算式没问题,但它回答的是另一个网络。今天的网络结构其实是:
输入层 10 个数 → 隐藏层 10 个神经元 → 隐藏层 10 个神经元 → 输出层 1 个神经元最后不是 10 个输出,而是 1 个。修正输出层规模后,总参数就不再是 330。
参数量搭建器
修改层规模,查看参数量变化
每个连接层的参数 = 上一层节点数 × 当前层节点数,再加上当前层每个神经元各自的偏置。
默认结构 10 → 10 → 10 → 1 的总参数量是 231。
先数 10 × 10 条连接上的权重,再给 隐藏层 1 的每个神经元加 1 个偏置,得到小计 110。
当前:第 1 笔 · 输入层 → 隐藏层 1 播放时会逐层点亮连接:先数权重,再数偏置。
第一层连接:输入层到第一个隐藏层
第一个隐藏层有 10 个神经元。每一个神经元都接收上一层的 10 个输入,因此各自有 10 个权重(weight)。
10 个输入 × 10 个隐藏神经元 = 100 个权重偏置也要单独计算:偏置(bias)不是一整层共用一个,而是当前层每个神经元一个。这层有 10 个神经元,因此再加 10 个偏置。
100 个权重 + 10 个偏置 = 110 个参数这里常见的误会是把输入层的 10 个数字也算成参数。它们不是。输入层只摆放本次样本的数值;输入层没有这类可训练连接参数。真正被训练、会被更新的,是从输入层连到当前计算层的权重,以及当前层神经元各自的偏置。
第二层连接:两个隐藏层之间
下一层仍然有 10 个神经元,上一层也仍然输出 10 个数,所以连接数没有变:
10 × 10 = 100 个权重
10 个神经元 = 10 个偏置
小计 = 110 个参数到这里,我们已经有 110 + 110 = 220 个参数。数字看起来与第一笔重复,但不是同一批数字:每一层之间都保存着自己独立的一张权重表。
输出层连接:10 个隐藏输出如何变成 1 个答案
这就是刚才 330 失效的地方。最后的输出层(output layer)只有 1 个神经元;它接收最后一个隐藏层传来的 10 个输出。
10 × 1 = 10 个权重
1 个输出神经元 = 1 个偏置
小计 = 11 个参数于是总参数量是:
默认搭建器显示的 231 不是约数,也不是“神经元的数量”。它表示这个网络里有 231 个可以在训练中调整的数字。
可复用的参数量公式
只要是普通全连接层(dense layer),从规模为 m 的上一层走到规模为 n 的当前层:
前半段 m × n 数的是权重:每条连接一个。后半段 +n 数的是偏置:当前层的每个神经元一个。
输出层的神经元数并不固定。二分类常见 1 个输出;识别 10 类手写数字常见 10 个输出;预测房价也可能只要 1 个连续值。任务改变,输出层规模和对应参数量也会改变。
试着把搭建器里的输出层改为 10:这时最后一笔会变回 110,全网总数才会是 330。先确认网络到底有几个输出,再算参数,通常比背一个大数更可靠。
用矩阵形状快速复核
若上一层有 m 个输出,当前层有 n 个神经元,权重可以排成 n × m 的矩阵,偏置排成长度为 n 的向量。因此当前层参数量也可以写成:
这个视角能及时发现三类错误:忘记偏置会少算 n 个参数;把输入层当计算层会多算一组;没有先确认输出类别数会让最后一层整体算错。大型模型也是同样的方法,只是把 Embedding、Attention、FFN 等模块里的每个可训练矩阵逐一数完再相加。
参数量在工程上意味着什么
231 不只是考试答案。每个可训练参数在推理时至少要占一份存储;训练时还要为优化器额外留出动量、梯度等状态,内存往往是“参数体积”的数倍。层宽翻倍时,全连接层的权重按 m × n 近似平方级上涨,所以“再加几个神经元”并不便宜。
因此读模型卡上的“70 亿参数”时,先问:这些数字落在哪些矩阵上?本章的小网络把问题压到三层,正是为了练同一套数法。后面进入 Transformer 时,你会再次用 词表大小 × 维度、隐藏维 × 隐藏维 去拆 Embedding 与注意力投影。