为了优化 Sentence Transformers 的微调,重点关注学习率调度、层冻结以及平衡批量大小与优化器选择。这些调整有助于平衡训练速度和模型性能,同时防止过拟合。首先系统地实验这些参数,并使用验证指标来指导决策。
首先,学习率调度至关重要。从较高的初始学习率(例如 2e-5)开始,使模型能够快速调整,然后逐渐降低。例如,在前 10% 的训练步骤中使用线性预热,以在早期稳定梯度,然后使用余弦衰减平滑地降低学习率。这种方法可以防止早期过度调整最优权重,同时在后期对其进行细化。如果训练停滞,可以尝试周期性学习率,使其在高低值之间振荡,以逃离局部最小值。例如,在 10,000 步的训练运行中,在前 1,000 步进行预热,然后应用余弦衰减。始终通过比较损失曲线来验证这些选择——如果训练损失过早趋于平稳,则初始学习率可能过低。
其次,选择性地冻结层可以加快收敛速度。像 BERT 或 RoBERTa 这样的预训练模型,其较低层捕获通用语言特征,对于类似任务可能不需要重新训练。例如,在适应语义相似性任务时,冻结 BERT-base 中 12 个 Transformer 层的第一个 6 层。这将可训练参数减少约 50%,从而缩短计算时间。但是,如果您的任务与模型的预训练数据显着不同(例如医学文本),则解冻更多层以允许适应。通过比较冻结 0%、33% 或 50% 的层时的性能来测试这一点。使用 PyTorch 的 requires_grad_(False)
等工具可以有效地冻结层。如果验证准确率下降,则逐步解冻额外的层。
最后,优化批量大小和优化器设置。较大的批量(例如 32-64)可以稳定梯度估计,但需要更多内存。如果 GPU 内存有限,请使用梯度累积(例如,通过 4 个大小为 8 的步骤实现有效批量大小 32)。将其与 AdamW(权重衰减 0.01)结合使用,以防止过拟合。对于小型数据集的任务,较小的批量(16)和较高的学习率(3e-5)通常效果更好。每 500 步监控余弦相似度或检索准确率等验证指标——如果性能趋于平稳,则将学习率降低 2-5 倍。早期停止(例如,如果在 3 次评估中没有改进则停止)可以防止不必要的计算。Weights & Biases 或 TensorBoard 等工具可以跟踪这些实验,从而更容易比较超参数组合。