全参数微调虽然强大,但对其配置敏感。选择合适的超参数是获得良好性能的根本,同时避免浪费大量计算资源和时间。与预训练不同,预训练的超参数设定常通过大量试错确定,而微调需要根据具体任务、数据集大小和模型结构进行仔细调整。我们来看看最有影响力的超参数,以及有效调整它们的方法。学习率 ($\eta$)学习率可以说是最重要的超参数。它决定了梯度下降过程中更新模型权重$\theta$的步长:$$ \theta_{new} = \theta_{old} - \eta \nabla L(\theta_{old}) $$这里 $\nabla L(\theta_{old})$ 是损失函数 $L$ 相对于旧权重的梯度。过高: 学习率过大可能导致训练过程不稳定,损失剧烈波动甚至发散(无限增大)。优化器可能会越过最优权重配置。过低: 学习率过小会导致收敛非常慢。模型可能会陷入次优的局部最小值,或者需要过多的训练步数才能达到一个好的解。对于大型预训练模型的全参数微调,学习率通常设置远低于预训练时使用的学习率。这是因为我们希望温和地调整现有知识,保留预训练阶段学到的强大表示,同时让模型适应新任务。微调大型语言模型(LLMs)的常见起始值常常在 $1 \times 10^{-5}$ 到 $5 \times 10^{-5}$ 的范围内。全参数微调很少会超过 $1 \times 10^{-4}$。学习率调度器: 在整个训练过程中使用恒定的学习率通常是次优的。学习率调度器会在训练期间动态调整学习率,经常能提高收敛速度和最终性能。常见的方法包括:线性预热与衰减: 这是微调Transformer模型非常常用的调度方法。训练开始时学习率非常小,在设定的“预热”步数内逐渐线性增加。预热阶段结束后,学习率通常在剩余训练步数内线性(或有时多项式)衰减到零。预热阶段有助于早期训练的稳定,特别是当梯度可能很大或有噪声时,能防止模型发散。随后的衰减使得模型接近收敛时可以进行更精细的调整。{"layout": {"title": "线性预热与衰减学习率调度", "xaxis": {"title": "训练步数"}, "yaxis": {"title": "学习率"}, "showlegend": false, "template": "plotly_white"}, "data": [{"x": [0, 100, 1000], "y": [0.000001, 0.00003, 0.000001], "mode": "lines", "line": {"color": "#228be6"}}]}示例:线性预热(0到100步)后接线性衰减的学习率调度。余弦退火: 在这种方式中,学习率从最大值(预热后)开始,遵循余弦曲线衰减到最小值(通常为零)。与线性衰减相比,这提供了更平滑的衰减,有时能更好地优化损失面。恒定预热: 类似于线性预热,但学习率在预热阶段结束后立即跳到最大值,然后根据某种调度(例如线性、余弦)衰减。调度器的选择及其参数(预热步数、衰减函数)本身就是超参数,通常需要进行调整。批次大小批次大小指定了在单次前向和反向传播中用于计算梯度并更新模型权重的训练样本数量。更大的批次大小:优点: 能更准确地估计整个数据集的真实梯度,带来更稳定的训练更新。能更有效地发挥硬件并行性优势,通常每轮训练时间更快。缺点: 需要更多的GPU内存。有时会导致收敛到“尖锐”的局部最小值,其泛化效果可能不如小批次找到的“平坦”局部最小值。更小的批次大小:优点: 需要更少的内存。小批次梯度估计中的固有噪声可以作为一种正则化形式,有可能帮助模型避免糟糕的局部最小值,找到泛化效果更好的平坦局部最小值。缺点: 由于硬件利用率较低,每轮训练可能更慢。梯度更新噪声更大,可能需要更小的学习率来保持稳定。可行的最大批次大小通常受限于可用的GPU内存。梯度累积(将在第7章讨论)等方法允许通过在几次小批次上计算梯度后再进行权重更新来模拟更大的批次大小,缓解内存限制,代价是计算时间略有增加。全参数微调的典型批次大小范围从4到64,这很大程度上取决于模型大小和GPU内存。轮数与早期停止一轮(epoch)表示完整遍历整个训练数据集一次。轮数过少: 模型可能对数据没有足够的学习,无法有效完成任务(欠拟合)。轮数过多: 模型可能开始记忆训练数据,包括其噪声,导致在未见数据上表现不佳(过拟合)。确定最佳轮数通常是使用验证集凭经验完成的。在每轮(或部分轮)训练后,监控验证集上的性能(例如损失、任务特定指标)。当验证集上的性能停止提升或开始下降时,停止训练,这种技术称为早期停止。由于预训练模型提供了良好初始化,微调通常只需要几轮(例如1-5轮),特别是在数据集较大时。较小的数据集可能看起来需要更多轮次,但这会增加过拟合的风险,使得正则化更加重要。优化器选择尽管存在各种优化器,AdamW(带有解耦权重衰减的Adam)是微调Transformer模型的标准且普遍推荐的优化器。Adam: 结合了动量(使用过去的梯度)和自适应学习率(根据梯度大小对每个参数进行调整)。AdamW: 修改了Adam中应用L2正则化(权重衰减)的方式。标准Adam将权重衰减与自适应学习率计算混合,可能使其效果降低。AdamW将权重衰减计算与梯度更新解耦,在Transformer模型中通常带来更好的正则化和改进的泛化能力。在内存极度受限的场景下,可能会考虑Adafactor等其他优化器,但AdamW是常见的起点。AdamW中优化器特有的超参数,如beta值($\beta_1, \beta_2$)和epsilon($\epsilon$),通常保留其默认值(例如 $\beta_1=0.9, \beta_2=0.999, \epsilon=1e-8$),尽管调整它们偶尔能带来少量提升。权重衰减权重衰减是一种正则化技术(等同于L2正则化),它在损失函数中添加一个与模型权重平方大小成比例的惩罚项。这通过保持权重较小来抑制模型学习过于复杂的模式,从而减少过拟合。权重衰减系数是另一个需要调整的超参数。微调的典型值通常在0.01到0.1之间。将其设置为0会禁用权重衰减。如前所述,其有效性通常与使用AdamW等能正确处理它的优化器有关。系统化调优方法找到超参数的最佳组合可能很复杂。与手动试错不同,当计算预算允许时,经常采用更系统化的方法:网格搜索: 为每个要调优的超参数定义一组离散值。对这些值的每种可能组合训练模型。尽管这种方法很详尽,但随着超参数数量和每个超参数值的增加,它在计算上很快变得不可行(维度灾难)。随机搜索: 为每个超参数定义一个范围或分布。从这些范围或分布中随机抽取超参数组合,并为每个样本训练模型。令人意外的是,随机搜索通常比网格搜索更高效,因为它更广泛地在超参数空间中搜索,有可能更快地找到好的组合,特别是当只有少数超参数对性能有显著影响时。digraph G { rankdir=LR; node [shape=box, style=filled, fillcolor="#e9ecef"]; edge [color="#495057"]; subgraph cluster_0 { label = "网格搜索"; bgcolor="#f8f9fa"; node [fillcolor="#a5d8ff"]; g1 [label="LR=1e-5\nBS=8"]; g2 [label="LR=3e-5\nBS=8"]; g3 [label="LR=5e-5\nBS=8"]; g4 [label="LR=1e-5\nBS=16"]; g5 [label="LR=3e-5\nBS=16"]; g6 [label="LR=5e-5\nBS=16"]; g7 [label="LR=1e-5\nBS=32"]; g8 [label="LR=3e-5\nBS=32"]; g9 [label="LR=5e-5\nBS=32"]; g1 -> g2 -> g3; g4 -> g5 -> g6; g7 -> g8 -> g9; g1 -> g4 -> g7; g2 -> g5 -> g8; g3 -> g6 -> g9; } subgraph cluster_1 { label = "随机搜索"; bgcolor="#f8f9fa"; node [fillcolor="#ffec99"]; r1 [label="LR=1.2e-5\nBS=25"]; r2 [label="LR=4.8e-5\nBS=10"]; r3 [label="LR=3.5e-5\nBS=18"]; r4 [label="LR=2.1e-5\nBS=30"]; r5 [label="LR=4.1e-5\nBS=5"]; // More points can be added r1; r2; r3; r4; r5; // Nodes just exist, no strict path } Invisible [style=invis]; // Helper for spacing cluster_0 -> Invisible [style=invis]; Invisible -> cluster_1 [style=invis]; }网格搜索与随机搜索在两个超参数(学习率和批次大小)上的搜索模式比较。网格搜索系统地覆盖点,而随机搜索在空间中采样。贝叶斯优化: 一种更高级的方法,通过之前训练的结果指导下一次要尝试的超参数组合选择。它构建一个概率模型(通常使用高斯过程),将超参数映射到性能指标(例如验证损失)。它使用这个模型来平衡广域搜索(在不确定性高的区域尝试超参数)和局部优化(在目前表现最好的点附近尝试超参数)。Optuna、Hyperopt或Ray Tune等工具提供了贝叶斯优化和其他高级调优算法的实现。调优的实用建议从合理的默认值开始: 从文献中为类似模型和任务报告的超参数开始。除非有特殊原因,否则对优化器参数使用标准值。优先考虑超参数: 最初的调优工作应集中在学习率、批次大小以及可能的权重衰减上,因为这些通常影响最大。使用验证集: 始终根据单独验证集(而非测试集)上的性能评估超参数设置,并使用早期停止来确定每次尝试的训练时长。记录实验: 使用实验跟踪工具(如MLflow、Weights & Biases)系统地记录每次运行的超参数、代码版本、数据集和结果。这对于可重现性和分析是不可或缺的。迭代与优化: 在随机搜索或贝叶斯优化中,从更宽的范围开始,然后在有希望的值周围缩小范围,进行更精细的调优。考虑资源限制: 全参数微调成本较高。如果资源有限,优先调优学习率和轮数。考虑使用更小的模型变体或数据子集进行初步的、更快的超参数调整,但要注意,当扩展回原规模时,最佳设置可能会略有变化。掌握全参数微调的超参数调优,是融合了对基本原理的理解、系统化搜索方法的应用,以及结合基于具体任务和可用资源的实际考虑。它在一定程度上仍然是经验性的过程,但有序的方法显著增加了找到能带来最佳性能的配置的可能性。