趋近智
大师班
谈及大型语言模型时,“大”不仅仅是一个定性描述;它定量指代着庞大的参数数量、海量的训练数据集以及所需的大量计算资源。这种规模并非偶然特性,而是其能力的基本推动力。与早期模型性能提升可能相对较快达到平台期不同,现代大型语言模型展现出与规模增长直接相关的不同现象。
大型语言模型研究中一个重要的发现是缩放定律的存在。这些是经验观察结果,表明模型性能(通常通过在独立数据集上的交叉熵损失来衡量)会随着模型大小(参数数量)、数据集大小和训练所用计算量的增加而可预测地提升。
大型语言模型中的性能与规模之间的关系通常被建模为幂律,尤其在对数-对数坐标图上查看时。例如,损失L可以近似地与非嵌入参数的数量N、数据集大小D和计算预算C(以FLOPs计)关联如下:
L(N)≈(NNc)αN L(D)≈(DDc)αD这里,Nc 和 Dc 代表特征尺度,而 αN 和 αD 是缩放指数(通常是小于1的正值,对于N和D通常在0.05-0.1左右)。类似的关联也适用于计算量 C。这些定律表明,投入更多资源(参数、数据、计算)会在主要训练目标上带来边际递减但持续的改进。
验证损失倾向于随着模型大小、数据集大小或计算预算的增加而呈幂律下降。
这些缩放定律对于规划训练过程非常有帮助。它们使研究人员和工程师能够估算在给定预算下可达到的性能提升,反之,也能估算达到目标性能水平所需的资源,从而避免投入昂贵且耗时长的实验。
规模最吸引人的方面之一,或许是涌现能力的出现。这些能力在较小的模型中不存在或无法衡量,但一旦模型大小、数据量或计算量超过特定阈值,它们就会相对突然地显现。它们不仅仅是现有指标的渐进式改进,而是性质上全新的行为。
实例包括:
这些能力出现的阈值是经验性的且依赖于具体任务,但它们的存在有力地推动了对更大模型的追求。这表明,仅仅扩大现有架构的规模就能产生根本性的新功能。
说明了规模的增加如何带来更复杂的能力,包括涌现的能力。
规模化不仅仅是使某一个方面变大;它涉及平衡三个主要组成部分:模型大小(N)、数据集大小(D)和训练计算量(C)。研究,特别是DeepMind的“Chinchilla”论文(Hoffmann et al.,2022),指出在固定的计算预算下,仅通过最大化模型大小并不能获得最佳性能。相反,存在一个最佳分配方案,即模型大小和数据集大小应大致按比例进行缩放。
以前的模型通常使用相对较小的数据集进行训练,与它们的参数数量相比(计算受限状态)。Chinchilla的研究结果表明,许多大型模型存在显著的训练不足;对于已使用的计算量,通过在更多数据上训练一个较小的模型,本可以提升性能。这表明,数据规模与模型规模同样重要,对于在给定计算范围内达到最佳结果而言。
计算参数数量提供了衡量模型规模的具体方法。对于一个典型的Transformer块,参数主要来自自注意力投影(Query、Key、Value、Output)和前馈网络层。
import torch
import torch.nn as nn
from math import prod
def count_parameters(model: nn.Module) -> int:
"""计算PyTorch模型中可训练参数的总数。"""
return sum(p.numel() for p in model.parameters() if p.requires_grad)
# 示例:简化的Transformer层组件
hidden_dim = 768
ffn_dim = hidden_dim * 4 # 常见做法
num_heads = 12
head_dim = hidden_dim // num_heads # 通常 d_model / num_heads
# 单个注意力机制 + FFN的粗略估算
# Q、K、V 投影(每个 hidden_dim x hidden_dim)
qkv_params = 3 * hidden_dim * hidden_dim
# 输出投影(hidden_dim x hidden_dim)
attn_output_params = hidden_dim * hidden_dim
# FFN 第一层(hidden_dim x ffn_dim)
ffn1_params = hidden_dim * ffn_dim
# FFN 第二层(ffn_dim x hidden_dim)
ffn2_params = ffn_dim * hidden_dim
# 注意:为简化起见,此处忽略了偏置和归一化层
approx_params_per_layer = (qkv_params + attn_output_params +\
ffn1_params + ffn2_params)
print(f"每个Transformer层的近似参数数量:{approx_params_per_layer:,}")
# 一个包含12个此类层的模型(如BERT-base)
num_layers = 12
# 添加嵌入参数(vocab_size * hidden_dim)——假设词汇表大小为3万
vocab_size = 30522
embedding_params = vocab_size * hidden_dim
total_params_estimate = ((num_layers * approx_params_per_layer) +\
embedding_params)
print(f"一个12层模型的总估算参数数量:{total_params_estimate:,}")
# 与一个更大的模型进行比较(例如,扩展 hidden_dim)
large_hidden_dim = 1280
large_ffn_dim = large_hidden_dim * 4
large_num_heads = 16
large_qkv = 3 * large_hidden_dim * large_hidden_dim
large_attn_out = large_hidden_dim * large_hidden_dim
large_ffn1 = large_hidden_dim * large_ffn_dim
large_ffn2 = large_ffn_dim * large_hidden_dim
large_layer_params = (large_qkv + large_attn_out +\
large_ffn1 + large_ffn2)
print(f"每个层的大致参数数量 "\
f"(大型模型):{large_layer_params:,}")
# 一个包含24个此类层的模型
large_num_layers = 24
large_embedding_params = vocab_size * large_hidden_dim
large_total_params = ((large_num_layers * large_layer_params) +\
large_embedding_params)
print(f"一个24层大型模型的总估算参数数量:{large_total_params:,}")
此代码片段展示了架构选择(如 hidden_dim、ffn_dim、num_layers)如何直接影响参数数量,而参数数量是衡量规模的主要指标。本课程中讨论的模型通常范围从数亿到数千亿甚至数万亿参数,需要相应增加数据和计算量。
总而言之,规模并非仅仅为了大而大。它根据缩放定律可预测地推动性能提升,使定性上新的涌现能力成为可能,并且需要在模型参数、数据集大小和计算预算之间取得仔细的平衡。理解规模的重要性对于应对构建和训练高效大型语言模型所涉及的工程难题非常重要。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造