趋近智
在扩展Transformer模型时,可以调整的两个主要架构方面是其深度(层数)和宽度(隐藏表示与前馈网络的尺寸)。扩展法则表明,仅仅增加总参数量并不能说明全部。这些参数在深度和宽度之间的分配,很大程度上影响着模型的行为、训练动态和计算效率。没有一个普遍的最优比例;最佳选择通常取决于具体的任务、数据集、可用计算资源以及所需的推理特点。
下面我们来审视这项取舍中涉及的因素。
添加更多层(增加编码器或解码器块的数量 ),能使模型学习输入数据更复杂、分层级的表示。每层都在前一层执行的转换基础上进行构建,从而实现一个更深的处理管道。
潜在优势:
潜在缺点:
增加宽度通常涉及扩大核心嵌入维度(),并且通常会按比例增加位置前馈网络中的中间维度(,通常设置为 )。
潜在优势:
潜在缺点:
对扩展法则的实证研究,例如 Kaplan 等人 (2020) 的工作,表明在固定计算预算下,为了达到最佳性能,模型大小、数据集大小和训练计算应根据幂律同步扩展。在扩展模型大小时,研究显示,同时增加深度和宽度比仅仅大幅扩展一个维度能带来更好的结果。
例如,像 GPT-3 这样的架构使用较多层数(例如96)和 较大的隐藏维度尺寸(例如12288)。精确的比例通常会随着模型的增长而演变;比较 GPT-2 和 GPT-3 显示,深度和宽度都有增加,但并非一定成比例。
The decision often comes down to:
在使用PyTorch这样的框架时,深度和宽度通常在模型初始化期间由特定参数控制。考虑 nn.TransformerEncoder:
import torch
import torch.nn as nn
# 示例参数
vocab_size = 30000
d_model = 512 # 模型宽度(嵌入维度)
nhead = 8 # 注意力头数量(与宽度相关)
num_encoder_layers = 6 # 模型深度
dim_feedforward = 2048 # FFN中间层的宽度
dropout = 0.1
# 输入嵌入
embedding = nn.Embedding(vocab_size, d_model)
# Transformer 编码器层定义
encoder_layer = nn.TransformerEncoderLayer(
d_model=d_model,
nhead=nhead,
dim_feedforward=dim_feedforward,
dropout=dropout,
batch_first=True # 为了清晰,使用 batch_first=True
)
# 堆叠层以创建深度
transformer_encoder = nn.TransformerEncoder(
encoder_layer=encoder_layer,
num_layers=num_encoder_layers
)
# 示例用法(需要位置编码、遮罩等)
# src = torch.randint(0, vocab_size, (32, 100)) # 批次大小 x 序列长度
# embedded_src = embedding(src)
# # ... 添加位置编码 ...
# output = transformer_encoder(embedded_src) # 通过编码器堆栈
# print(output.shape) # torch.Size([32, 100, 512])
在此代码片段中:
num_encoder_layers 直接控制深度。d_model、nhead 和 dim_feedforward 控制宽度。对这些值进行实验对于扩展Transformer模型非常重要。您可以比较一个 num_encoder_layers=12, d_model=768 的模型与一个 num_encoder_layers=24, d_model=512 的模型,同时保持总参数量或计算成本大致相当,以便通过实验理解这些取舍。
考虑两个参数量大致相似但架构不同的模型:
此图表说明,与参数量相似但较浅、较宽的模型(B)相比,一个更深、更窄的模型(A)可能每层内存需求更低,但顺序计算路径更长,而模型 B 则表现出相反的趋势。
总而言之,在深度和宽度之间做出选择是一种权衡。虽然更深的模型提供了进行复杂分层学习的可能性,但它们可能增加顺序计算时间并带来优化难题。更宽的模型每层提供更大的容量,并且可能在内部更好地并行化,但每层会带来显著更高的内存和计算成本。现代大型模型通常会同时扩展这两个维度,这受到扩展法则研究的实证结果指导,并受限于可用的硬件和训练基础设施。通常需要仔细实验才能找到最适合您特定目标的配置。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造