如果在 Sentence Transformer 训练期间损失中遇到 NaN 或无限值,首先检查您的输入数据和预处理。 无效的输入(例如空字符串、格式错误的文本或意外字符)可能导致不稳定的嵌入。 例如,如果文本条目为空,则模型可能会在嵌入计算期间生成零向量或未定义的值。 通过添加对空字符串、特殊字符或不一致编码的检查来验证您的数据管道。 使用自定义整理函数来过滤或处理有问题的批次。 此外,确保一致地应用文本规范化(例如小写或删除非 ASCII 字符)。 如果您的数据集包含文本旁边的数值特征,请确认它们已适当缩放——具有极端量级的值可能会使模型不稳定。 带有错误日志记录的 torch.utils.data.DataLoader
等工具可以帮助隔离坏批次。
接下来,检查模型架构和损失函数。 梯度爆炸或损失计算中的不稳定操作通常会导致 NaN 值。 例如,对比损失或三重损失涉及成对距离计算——如果嵌入崩溃(例如,所有向量都变得相同),则可能会出现除以接近零的值或无效相似度的情况。 添加梯度裁剪(例如,torch.nn.utils.clip_grad_norm_
) 以限制极端的权重更新。 检查自定义损失实现是否存在数值边缘情况:如果输入为负数或零,则对数、除法或指数运算可能会失败。 例如,余弦相似度得分为 -1
可能会在某些损失公式中引起问题。 使用合成数据(例如,随机嵌入)测试损失函数以重现错误。 另外,检查嵌入初始化:缩放不良的初始权重(太大或太小)会放大早期训练步骤中的不稳定性。
最后,调整训练超参数和环境设置。 高学习率会导致突然的权重更新,从而导致数值溢出。 降低学习率(例如,从 1e-3
降至 1e-5
)并使用学习率调度器。 如果使用混合精度训练 (fp16
),则暂时切换到 fp32
——降低的精度可能导致梯度下溢/溢出。 对于像 Adam 这样的优化器,确认 eps
(一个稳定性项)没有设置得太低(默认 1e-8
通常有效)。 使用 TensorBoard 等工具监控批次统计信息(例如,梯度范数、嵌入量级)。 如果使用池化层(例如,均值/最大池化),请确保它们正确处理可变长度序列; 由于截断导致的序列长度为 0
可能会导致被零除的错误。 对于特定领域的数据,请考虑在较小的、更干净的子集上进行预训练,以在全面训练之前识别稳定性问题。