原贴链接

去年我的团队致力于一个微调的开源模型,该模型基于美国军事学说和出版物进行训练(工作流程后续帖子)。底线是,微调后的7b模型运行得非常好,特别是在概念性问题上(例如机动和任务指挥如何相互作用):根据军事人员的人工评级,它比GPT - 3.5要好,并且与GPT - 4相当。 一直想尝试微调嵌入,我的团队终于有了机会。我们进行了一系列实验,但总的来说,我们的第一种方法使嵌入空间坍缩并使检索准确性骤降,但使用训练+评估的第二种方法效果很好并大大提高了检索准确性。 我们从我们的模型训练数据开始:一个上下文+问题列和答案列。我们取上下文块(来自军事出版物的500个标记)和由此生成的问题,颠倒它们的顺序并将它们用作嵌入微调的训练数据。所以基本上是“当你看到‘城市地区防空的原则是什么?’时,检索<关于城市防御且有一些防空原则句子的某个块>。 我们使用了Sentence Transformers和FSDP,因为我们必须在多个GPU上对嵌入模型和数据进行分片。然而,令我们苦恼的是,每个训练轮次都会使模型的表现越来越差,直到5个轮次时它只是随机检索。我们的直觉是模型过度拟合并使嵌入空间坍缩,直到所有文档都挤在一起。我们使用WizMap来可视化嵌入文档,果然,基础模型显示出清晰的文档簇,2个轮次时它们看起来更挤在一起了,到5个轮次时是一个有两个驼峰的大团块。 然后我们从FSDP切换到DDP,这允许你在微调期间使用评估器参数,这样我们就可以在训练期间使用评估数据,而不仅仅是事后使用,类似这样:

  1. num_train_epochs = 2,
  2. per_device_train_batch_size = 32,
  3. per_device_eval_batch_size = 32,
  4. 在训练期间,将在来自“TRAIN”数据集的批次上进行训练,然后在来自“EVAL”数据集的批次上进行评估
  5. 使用该训练/评估比较来告知损失函数
  6. 训练2或5个轮次
  7. 训练后,运行我们的评估管道。 成功了!使用384维的BGE Small,我们从以下情况改进:
  8. 基础模型前20的准确率为54.4%。
  9. 2个轮次微调后的模型:前20检索准确率为70.8%。
  10. 5个轮次微调后的模型:前20检索准确率为73%。 然后我们尝试了1024维的Stella - 400M:
  11. 基础模型前20的准确率为62.9%。
  12. 2个轮次微调后的模型(训练批次大小为4,梯度累积步骤为20):前20检索准确率为73.3%。
  13. 3个轮次微调后的模型(训练批次大小为3,梯度累积步骤为40):前20检索准确率为72.4%。
  14. 在8个GPU集群上进行2个轮次微调时增加批次大小(训练批次大小为8,梯度累积步骤为25):前20检索准确率为74.4%。 我一直的直觉是,即使微调一个好的通用嵌入模型也会导致更多与领域相关的检索,并且在实际的现实问题空间中通过经验证明这一点非常酷。

讨论总结

原帖作者分享了在微调嵌入方面的实验,包括遇到的问题及解决办法。评论者们从不同方面进行了提问或分享自己的经验,如对eval在微调中的作用、浮点格式是否影响检索准确性、合成问题的使用、特定技术细节的疑惑以及实验中的GPU相关信息等,整体氛围积极,大家以交流和探索为主。

主要观点

  1. 👍 对原帖中eval在微调嵌入时的作用提出疑问
    • 支持理由:[在保持其他条件不变的情况下,不理解为何加入eval会改变模型,对eval影响训练性能感到疑惑]
    • 反对声音:[无]
  2. 🔥 对原帖中的检索准确性相关实验提出关于浮点格式的疑问
    • 正方观点:[自己在应用中对于FP32和FP16的选择犹豫,好奇原帖作者是否做过相关实验]
    • 反方观点:[无]
  3. 💡 评论者在做类似事情时使用了合成问题并取得好结果
    • [同时认为调整合成问题表述可能提升效果,基线合成问题不代表现实问题]
  4. 💡 对原帖中的特定技术细节感兴趣并认为可能是实验成功的关键
    • [希望原帖作者详细解释该技术点]
  5. 💡 对原帖分享表示兴趣并感谢,认为提供笔记(Notebook)会更好
    • [还对原帖中GPU相关内容、数据集大小和微调时长存在疑问]

金句与有趣评论

  1. “🤔 如果我理解正确的话,eval只是用于比较不同轮次之间的性能,对吗?不太确定它如何影响训练性能。”
    • 亮点:[提出对eval作用的疑惑,引出后续关于eval如何影响训练性能的解释]
  2. “👀 Thanks for sharing OP. Very insightful.”
    • 亮点:[对原帖分享表达感谢,体现对原帖内容价值的认可]
  3. “😂 aaronr_90:Are you using synthetic questions? I am active doing something identical with synthetic questions and we’ve gotten good results.”
    • 亮点:[开启关于合成问题在实验中的使用的讨论]
  4. “🤔 Curious to learn more about this.”
    • 亮点:[表达对原帖中特定技术细节的好奇]
  5. “🙂 最有趣了!感谢与我们分享这个。当然,一个笔记(Notebook)会很棒的。”
    • 亮点:[表达对原帖的兴趣,同时希望有更多资料如笔记(Notebook)]

情感分析

[总体情感倾向积极正面,分歧点较少。主要以提问和交流为主,大家对原帖作者分享的实验表示出兴趣并希望得到更多的信息,可能是因为原帖涉及到的微调嵌入实验比较新颖且具有一定的技术深度,吸引了想要深入了解相关知识的人参与讨论]

趋势与预测

  • 新兴话题:[关于微调嵌入中的更多技术细节如“用训练/评估比较来告知损失函数”可能会引发更多讨论]
  • 潜在影响:[有助于推动相关领域在微调嵌入技术方面的发展,提高数据检索的准确性等]

详细内容:

标题:从微调嵌入模型中汲取的经验教训

在 Reddit 上,一篇关于微调嵌入模型的帖子引起了广泛关注。该帖子介绍了作者团队在这方面的工作经历,获得了众多点赞和大量评论。主要讨论了对开源模型的微调实验,特别是在处理美国军事相关内容时的成果。

讨论的焦点集中在不同的微调方法及其效果上。有人提出评估只是为了比较不同轮次之间的性能,不确定它如何影响训练性能。但也有人解释道,在每个批次的训练期间,模型会检查其在整个评估集中为每个问题找到正确上下文的能力,从而避免过度拟合或压缩嵌入空间。

还有用户好奇是否尝试了不同的浮点格式对检索精度的影响。另外,对于生成的问题是否为合成的,以及最终目标是仅改进 RAG 还是应用新流程生成数据以改进微调等问题,也引发了热烈讨论。

例如,有用户分享道:“是的,这些问题是合成的,由 GPT-4 从上下文中生成。我们这样做的原因之一(除了规模)是我们希望对检索相关性有高度的信心,即它能指向特定的上下文,而不是很多。”

有人好奇使用“训练/评估比较来告知损失函数”的具体含义,对此有人解释道:“添加训练中的评估集可以实现早期停止,如果训练损失继续下降而验证损失增加。这是防止嵌入过度拟合特定数据并仍然能够泛化到更大数据集的一种方式。”

总的来说,这次关于微调嵌入模型的讨论为相关领域的研究和实践提供了宝贵的经验和思考方向。