Sentence Transformer评估器使用及微调相关技术问题咨询
背景
我找到了Sentence Transformers的STS基准继续训练示例脚本以及官方说明文档,目前正在使用all-mpnet-base-v2模型结合自定义数据做微调,但对以下代码的使用存在困惑:
evaluator = EmbeddingSimilarityEvaluator.from_input_examples( dev_samples, name='sts-dev')
官方文档说明:
evaluator – 评估器(sentence_transformers.evaluation)用于在训练期间评估模型在预留验证数据上的性能,以确定保存到磁盘的最优模型。
核心问题
Q1. train_samples与dev_samples的区别是什么?
train_samples是训练数据集,用于模型学习任务特征、更新权重,是模型训练的核心数据;dev_samples是验证数据集,完全不参与模型权重更新,仅用于监控模型的泛化能力、检测过拟合,同时作为筛选最优模型的依据。两者必须严格拆分,不能存在数据重叠。
Q2a:模型针对dev_samples输出性能指标,如何以此确定“保存到磁盘的最优模型”?
Sentence Transformers训练框架会自动在每次评估后,将当前模型的验证指标与历史最优指标对比(比如余弦相似度的皮尔逊相关系数),如果当前模型指标达到训练以来的最优值,就会自动将该模型保存到指定路径,覆盖之前的非最优模型,无需手动操作。
Q2b:是否需要用磁盘中保存的模型对dev_samples重新计算并对比分数?
不需要。训练过程中框架已自动完成最优模型的筛选与保存,直接使用最终保存的模型即可。若后续需要验证模型性能,可加载模型后重新计算,但这不是必要步骤。
Q3. 若仅需对单个模型进行微调,是否可以省略evaluator和evaluation_steps参数?
可以省略,但不推荐。省略后模型只会保存训练结束时的最后一轮模型,而最后一轮模型大概率不是泛化能力最优的(容易出现过拟合)。如果不在意模型泛化效果,仅需一个微调后的模型,可选择省略。
Q4. 如何确定模型的总步数?是否需要设置evaluation_steps?
- 总步数计算方式:
总步数 = 单轮步数 × 训练轮数,其中单轮步数 = 训练数据总数 ÷ 批次大小(向上取整,最后一批不足批次大小也需算一步);也可直接指定固定总步数。 evaluation_steps建议设置,它控制每训练多少步就用验证集评估一次(比如设为100,即每训100步跑一次验证),能更及时监控模型状态、保存最优模型。不设置的话,默认通常是每轮训练结束后评估一次。
补充问题
我按照建议使用了evaluator,fit方法输出数据已写入文件,现补充以下问题:
Q5. 选择最优轮次(epoch)使用的指标是cosine_pearson吗?
是的。对于EmbeddingSimilarityEvaluator,默认会计算余弦相似度的皮尔逊相关系数(cosine_pearson)和斯皮尔曼相关系数(cosine_spearman),框架默认以cosine_pearson作为最优模型的判定指标(也可在代码中指定其他指标)。
Q6:输出中的steps为何显示为-1?
这是因为你设置了固定的总训练步数(比如1000步),而非按训练轮数(num_epochs)训练。当使用固定步数训练时,框架无法提前计算每轮对应的具体步数,因此会显示-1。若改为通过num_epochs设置训练轮数,steps就会显示当前轮的具体步数。
Q7a:如何根据数据规模、批次大小等计算步数?
- 单轮步数:训练数据总数 ÷ 批次大小,结果向上取整(最后一批数据量不足批次大小,仍需算作一步);
- 总步数:单轮步数 × 训练轮数。
Q7b:我的单轮步数是否为2509/64?若是,1000步是否过高?
你的单轮步数应为2509÷64≈39.2,向上取整为40步;10轮训练的总步数为40×10=400步。你设置的1000步确实过高,相当于训练了约25轮,很容易导致模型过拟合,建议调整为400步左右,或者直接设置num_epochs=10让框架自动计算步数。
内容的提问来源于stack exchange,提问作者user2543622

