同一个 Sentence Transformer 模型运行两次可能会产生略微不同的嵌入结果,这是由于模型或其计算环境中的固有随机性造成的。虽然模型权重在训练后保持不变,但某些操作(例如 dropout 层或基于 GPU 的矩阵乘法)可能会在推理过程中引入可变性。此外,硬件或软件优化(例如,非确定性 GPU 内核)即使在处理相同的输入时也会导致微小的数值差异。要控制这一点,您必须识别并解决随机性的来源,强制执行确定性设置,并标准化运行时环境。
随机性的一个主要来源是使用非确定性 GPU 操作。像 PyTorch 或 TensorFlow 这样的框架通常优先考虑计算速度而不是精度,从而导致跨运行的浮点计算略有不同。例如,GPU 上的矩阵乘法可能使用并行算法,由于舍入误差,这些算法会产生略微不同的结果。另一个例子是 dropout 层,它旨在在训练期间随机停用神经元。如果模型意外地处于训练模式(例如,model.train()
而不是 model.eval()
),则 dropout 在推理期间保持活动状态,从而注入随机性。类似地,生成模型中的波束搜索或采样等操作会引入可变性,尽管 Sentence Transformer 通常在嵌入生成期间避免这些操作。
要控制随机性,首先要设置确定性配置。在 PyTorch 中,对所有设备使用 torch.manual_seed(42)
,使用 torch.backends.cudnn.deterministic = True
禁用非确定性 GPU 内核,并设置 torch.backends.cudnn.benchmark = False
以防止自动调整。确保模型处于评估模式 (model.eval()
) 以停用 dropout 和其他特定于训练的层。对于 TensorFlow,设置 tf.config.experimental.enable_op_determinism()
并对操作使用固定种子。此外,如果数值稳定性至关重要,请避免混合精度推理(例如,FP16),因为降低的精度会放大舍入差异。最后,始终在相同的硬件和软件版本上运行模型,因为驱动程序更新或库更改可能会改变计算结果。这些步骤牺牲了轻微的性能开销来换取可重复性,确保嵌入在多次运行中保持一致。