模型参数是存储在已拟合模型内部的数值,它们决定模型如何将输入转换为输出。在神经网络中,模型参数通常包括权重和偏置;这些数值在训练期间确定,并在模型进行预测时重复使用。
一种有用的思维模型
可以把模型的架构想象成一组带有空白编号插槽的方程。架构决定插槽位于何处以及它们如何连接。参数就是填入这些插槽中的数字。
这种区分很重要。两个模型可以拥有相同的架构,却因参数值不同而表现不同。在训练之前,插槽中存放的是初始化值。训练会利用数据调整其中一部分或全部参数。在推理期间,模型通常保持这些值不变,并将由此形成的计算应用于新的输入。
参数不是用户每次发出请求时都要调节的旋钮,而是模型本身的一部分。
参数如何工作
神经网络层通常会执行如下形式的计算:
[
\text{输出} = f(\text{输入} \times \text{权重矩阵} + \text{偏置向量})
]
权重矩阵和偏置向量包含参数。函数 (f) 属于架构本身,可能不包含任何参数。
架构确定参数张量的形状。如果一层将 2 个输入值连接到 3 个输出值,其权重矩阵就需要 6 个标量条目:
2 inputs ──> [2 × 3 weight matrix] ──> 3 outputs
+
[3-value bias vector]每个独立存储的标量条目都算作一个参数。模型会对处理的每个样本使用相同的条目。将一个参数应用一百万次,并不会使它变成一百万个参数。
在训练期间,优化器会获得相关信息,了解每个可训练参数发生微小变化时将如何影响模型的误差。然后,优化器会更新这些值。重复这一过程,可以得到一组能够将新输入映射为有用输出的参数。
“可训练”一词需要谨慎理解。参数可以被冻结,使其在某次特定的训练过程中不被更新。它仍然是模型拟合状态的一部分。框架还会存储其他会影响计算、但不被视为参数的状态。PyTorch 将这种状态称为缓冲区(buffer),而 Keras 使用范围更广的“权重”(weights)集合,并将其划分为可训练权重和不可训练权重。
一个参数数量计算示例
考虑一个小型网络:包含两个输入值、一个具有三个输出的隐藏层,以及一个最终输出。
第一层包含:
- (2 \times 3 = 6) 个权重
- 3 个偏置
- 总计 9 个参数
最终层包含:
- (3 \times 1 = 3) 个权重
- 1 个偏置
- 总计 4 个参数
整个网络共有 (9 + 4 = 13) 个参数。
输入值不算作参数,因为它们会随着样本而变化。中间输出也不算参数;它们是临时结果。本例中的激活函数不增加任何参数。只有权重矩阵和偏置向量中独立存储的值才计入参数数量。
这种基于形状的方法可以扩展到更大的模型:统计每个参数张量中的标量条目并将它们相加。如果参数是共享的,应将存储的值计数一次,而不是计算模型使用这些值的每个位置。
为什么参数数量很重要
参数数量描述了模型所学习数值状态的规模。它会影响若干实际属性。
首先,存储参数需要占用内存。所需内存取决于参数数量以及每个值的表示方式。16 位表示在不考虑非参数状态和文件开销的情况下,每个存储标量使用两个字节。
其次,参数会参与计算。参数越多通常意味着需要进行更多算术运算,但架构、参数共享以及模型中哪些部分处于活动状态,都可能改变这种关系。
第三,参数数量有助于描述模型拟合模式的能力。但它不能衡量这种能力得到了多么有效的利用。训练数据、目标、架构、优化过程和评估都很重要。参数更多的模型并不自动意味着更准确、更有知识或更有用。
参数数量还需要标注统计口径。工具或论文可能报告总参数数量、当前标记为可训练的参数数量,或者排除嵌入层后的数量。这些数字回答的是不同问题,不应被当作完全相同的数值进行比较。
常见误解
参数不是超参数
参数是作为模型一部分拟合得到的值。超参数则用于配置模型或训练过程。学习率和批量大小是常见的超参数:它们会影响训练如何进行,但不是在最终模型内部学习得到的值。
参数和权重并非完全同义
权重是参数的一种主要类型,因此人们经常交替使用这两个词。但偏置也是参数,某些归一化层中学习得到的缩放值和偏移值同样是参数。“权重”也可能具有更宽泛的、特定于框架的含义。解读参数数量时,最稳妥的做法是采用生成该数量的工具或模型发布者所定义的口径。
一个参数不等于一个事实
训练后模型的行为源于许多参数值的共同作用。单个值通常没有“巴黎是法国首都”这样的自然语言含义。信息可以分布在许多值中,而一个值也可能影响许多输出。
参数更多并不保证模型更好
参数数量衡量的是数量,而不是质量。当架构、数据和训练能够有效利用新增容量时,提高容量可能有所帮助;但它也可能浪费内存和计算资源,或拟合不希望出现的模式。必须在真正重要的任务上衡量性能。
并非所有存储的值都是参数
模型可能会在参数之外保存运行统计量、缓存或其他状态。不同框架对这些状态的分类方式不同。若要获得准确的参数数量,应使用框架提供的参数枚举结果,而不是统计检查点中每个张量的大小。
参数在模型中的位置
由神经网络架构决定计算操作以及参数张量的形状。初始化会为这些张量提供初始值。训练会改变可训练值。检查点会保存最终值,通常还会保存其他状态。推理时,模型会加载这些值并用它们计算输出。
因此,参数既不是整个模型,也不只是模型规范。一个可用的训练模型,是架构与特定参数值的结合。
接下来阅读
阅读什么是模型权重?,了解构成大多数神经网络参数的乘数所发挥的作用。然后参阅模型参数与模型权重的区别,了解这两个术语之间的确切边界。