参考:

https://mp.weixin.qq.com/s?__biz=MzA4NzA4NjAxOA==&mid=2452974084&idx=1&sn=1b699acbbebde646ccd21033d732f182&chksm=86e3754c67c589e40ef4d898e1683bada143bd2ae498d74a800a4a6b3f389324a86d4ec36d4b&mpshare=1&scene=1&srcid=0615uGlXYDbc2R4UEZQq0XYj&sharer_shareinfo=7a17720cc0d9cd3be35ab9fc1ae970c3&sharer_shareinfo_first=7a17720cc0d9cd3be35ab9fc1ae970c3&poc_token=HOtPEGmjg2p-hX1ptFUEGwtorR6Lo_HIxZgH5Lj2

https://mp.weixin.qq.com/s/5IPz4T8hdp7qUV3D9BVaFg

https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md

1、为什么需要embedding微调

在一些专业领域,比如医疗、法律或金融,通用嵌入模型往往难以捕捉专业术语的细微差别,检索表现就会大打折扣。此时,嵌入微调(Embedding Fine-tuning)成为提升系统准确率的关键一步。

2、什么是embedding

嵌入(Embedding)可以看作是将文本转化为向量的“翻译器”,它把语义关系编码成多维空间中的位置。相似的句子在空间中相距更近,不相似的则更远。这种机制支撑着文本分类、语义搜索、问答系统等核心任务,也为RAG提供了“检索基础设施”。

3、embedding微调目的

嵌入微调的目的,就是用领域内的专业语料重新训练模型,让它“入行”,从而精准建模你关心的知识边界。

4、数据集构建的几种格式

  • 正向配对:如问答对、定义与术语,适用于对比损失或余弦相似度损失;
  • 三元组(anchor, positive, negative):适用于triplet loss,引导模型拉近正例、远离负例;
  • 相似度评分:为每对句子打分,引导模型学习相似度的连续分布;
  • 类别标签:适合用作分类任务的辅助监督信号。

建议从问答对数据集入手,简单且直观,适合大多数垂直领域。

5、损失函数

在训练过程中,损失函数(Loss Function)决定了模型如何“学会相似性”。

三元组损失(Triplet Loss)适合构建相对关系;对比损失(Contrastive Loss)适合引导模型对正负样本分界清晰;而余弦相似度损失(Cosine Similarity Loss)则更适合数值回归场景。

6、数据集生成

作者的场景是query-passage,即匹配出与query最相关的段落。正例的构造是使用baichuan2-13b-chat生成的,让LLM根据给定的段落生成问答对,query是生成的问题,passage是给定的段落,query-passage构成一个正例对,当然,LLM生成的数据也是需要过滤的,最后生成不到一万条,负例的构造是使用以上两种方法生成。作者的prompt(仅供参考)。


       prompt = f"""
'''
{paragraph}
'''

请你从以上文献段落中抽取问答对, 务必严格遵守以下要求:抽取出来的问题和答案必须包含主语谓语宾语, 不得出现 本研究、本实验 等指代不明的词语, 请确保抽取出的问题必须能在原文中找到答案, 返回结果的格式请严格按照'''中的格式
'''
[
    {{
        "问题": "问题1内容",
        "回答": "问题1的答案"
    }},
    {{
        "问题": "问题2内容",
        "回答": "问题2的答案"
    }},
    {{
        "问题": "问题3内容",
        "回答": "问题3的答案"
    }}
]
'''
"""

7、训练

重点: batch_size一定要大,显存不够就结合gradient_accumulation_steps 一起使用,小batch_size训练过程中loss非常抖,而且效果很差:

Logo

助力合肥开发者学习交流的技术社区,不定期举办线上线下活动,欢迎大家的加入

更多推荐