微调模型不仅仅是输入数据;它关乎精确地引导其学习过程。您选择的超参数是指导优化的控制项,它们直接影响模型权重 $\theta$ 在每一步中的更新方式。选对数值通常决定了模型是成为表现优秀的专业模型,还是无法收敛或泛化能力差的模型。这些设置决定了训练运行的速度、稳定性和最终成功。在Hugging Face的transformers库中,这些设置被方便地整合到TrainingArguments类中。让我们来看看进行全参数微调时,您需要配置的那些最有影响力的参数。学习率学习率,在梯度下降方程中表示为 $\eta$,可能是影响最大的超参数。它决定了模型为最小化损失函数而采取的步长。较高的学习率 可能导致训练不稳定,损失值会不规律地大幅波动甚至发散。模型可能跳过最优权重配置。较低的学习率 可能使训练速度过慢,需要更多训练轮次才能达到良好解。它也有陷入局部最小值的风险。对于大型语言模型,较小的学习率几乎总是正确的选择。由于预训练模型已经过高度优化,激进的更新可能会破坏其权重中存储的有益知识。全参数微调的常见起始学习率在 $1e-5$ 到 $5e-5$ 之间。digraph G { rankdir=TB; splines=curved; node [shape=none, margin=0]; "start" [label="开始"]; "low_lr" [label="局部最小值"]; "high_lr" [label="跳过最小值"]; "optimum" [label="全局最小值"]; edge [arrowhead=vee, penwidth=1.5]; "start" -> "low_lr" [label=" 低学习率 ", color="#339af0", fontcolor="#339af0"]; "start" -> "optimum" [label=" 最优学习率 ", color="#40c057", fontcolor="#40c057", penwidth=2]; "start" -> "high_lr" [label=" 高学习率 ", color="#fa5252", fontcolor="#fa5252", style=dashed]; "high_lr" -> "optimum" [style=invis]; }示例说明不同学习率如何影响损失函数达到最小值。最优学习率可有效收敛,而低学习率则收敛缓慢,高学习率则可能不稳定。学习率调度器相较于使用固定的学习率,采用学习率调度器是常规做法,它在训练期间调整 $\eta$ 的值。一种普遍采用的策略是线性预热后衰减。预热(Warmup): 在最初的几百或几千步 (warmup_steps) 中,学习率从0逐渐增加到其目标值。这可以避免模型在刚开始适应新数据时出现大的、破坏性的更新,有助于稳定训练过程。衰减(Decay): 预热阶段结束后,学习率会逐渐降低,通常是线性或遵循余弦曲线。这使得模型在接近最优解时能进行更精细、更准确的调整。{"layout":{"xaxis":{"title":"训练步数"},"yaxis":{"title":"学习率"},"title":{"text":"学习率调度:预热与衰减"},"shapes":[{"type":"line","x0":1000,"y0":0,"x1":1000,"y1":0.00003,"line":{"color":"#adb5bd","width":2,"dash":"dash"},"layer":"below"},{"type":"rect","x0":0,"x1":1000,"y0":0,"y1":0.00003,"fillcolor":"#a5d8ff","opacity":0.2,"line":{"width":0},"layer":"below"}],"annotations":[{"x":500,"y":0.000015,"text":"预热","showarrow":false},{"x":5500,"y":0.000015,"text":"衰减","showarrow":false}],"showlegend":false,"margin":{"l":60,"r":20,"t":40,"b":50}},"data":[{"x":[0,1000,10000],"y":[0,0.00003,0],"type":"scatter","mode":"lines","name":"学习率","line":{"color":"#4263eb","width":3}}]}一个典型的学习率调度方案,在最初的1000步进行线性预热,随后在剩余训练中线性衰减。批处理大小批处理大小(per_device_train_batch_size)决定了在模型权重更新前处理多少数据样本。该参数直接影响内存使用和训练动态。较大的批处理大小: 需要更多GPU内存,但能提供更准确的梯度估计,这可能带来更稳定、更快的收敛。较小的批处理大小: 内存占用较少,但从少量样本计算出的梯度“噪声”较大,可能导致训练稳定性下降。全参数微调对内存要求高,常迫使您使用较小的批处理大小(例如1、2或4)。如果您的GPU内存无法支持期望的批处理大小,可以使用梯度累积。通过将gradient_accumulation_steps设置为4或8等值,您可以指示训练器计算多个小批次的梯度,并在累积梯度后才执行权重更新。这实际上模拟了更大的批处理大小,而没有相应的内存开销。有效批处理大小变为 per_device_train_batch_size * gradient_accumulation_steps。训练轮次一个训练轮次(num_train_epochs)表示对整个训练数据集的一次完整遍历。训练轮次数量控制模型接受的总训练量。训练轮次过少 会导致模型训练不足,未能从数据中学到足够信息(欠拟合)。训练轮次过多 可能导致模型记忆训练数据,损害其对新的、未见过样本的泛化能力(过拟合)。对于高质量数据集上的指令微调,通常只训练几个轮次,通常在1到3之间。目标是让模型适应,而非从头开始教导。您将在下一节中通过监测验证损失来学习诊断过拟合。权重衰减权重衰减(weight_decay)是一种正则化技术,有助于防止过拟合。它对损失函数中的大权重值施加少量惩罚。这鼓励模型使用更小、分布更均匀的权重,这有助于提升其泛化能力。权重衰减的常见值为0.01。TrainingArguments示例配置以下是如何在Python脚本中使用transformers库中的TrainingArguments类配置这些超参数。该对象作为Trainer的中央配置中心。from transformers import TrainingArguments # 全参数微调运行的配置 training_args = TrainingArguments( # 模型检查点保存的输出目录 output_dir="./results", # --- 核心训练超参数 --- # 遍历训练数据的完整轮次数量 num_train_epochs=3, # 每个GPU的训练批处理大小 per_device_train_batch_size=2, # 在8步内累积梯度,以模拟更大的批处理大小 gradient_accumulation_steps=8, # --- 优化器和调度器超参数 --- # AdamW优化器的初始学习率 learning_rate=2e-5, # 防止过拟合的正则化 weight_decay=0.01, # 线性预热阶段的步数 warmup_steps=500, # --- 日志记录和保存 --- # 保存模型检查点的频率 save_strategy="epoch", # 记录训练指标的频率 logging_steps=50 ) # 这个 `training_args` 对象随后会被传递给 Trainer # 以及模型、数据集和分词器。找到最优的超参数集合是一个迭代过程。良好的做法是,从针对您所选模型架构和任务已被证明表现良好的值开始。在此基础上,您可以一次尝试一个参数,使用验证集来衡量您的更改效果。这种系统的方法对于成功地使预训练模型适应您的特定需求至关重要。