-
Notifications
You must be signed in to change notification settings - Fork 10
2. 向量模型
向量模型把人类世界中的语言,变为计算机世界中的数字。输入一句话,输出一维向量。由于transformer中的一句话一般会输出一个二维向量,其形状为(sequence_length, embedding_dim),因此模型后面通常加一层pooling,把sequence_length这一维坍塌。
语言模型可以很容易得到一个文本向量模型,但语言模型并不是为向量训练的,因此预训练的语言模型直接pooling不一定能取得满意的效果。那么,根据向量任务先微调一下再用。
微调的目的,把相似句子向量聚拢更近一些,把不相关的句子向量拉的更远一些。如何从一个语言模型训练出一个向量模型呢?无论是encoder模型还是decoder LLM模型,训练范式都可以总结如下:
- plain text预训练
- 大量弱监督文本对(weak supervision pair) in-batch negative对比学习
- 高质量文本对hard negative对比学习
- 加上任务提示的多任务学习
- 使用普通的文本语料进行RetroMAE预训练
- 使用大量文本对进行batch内负样本对比学习
- 使用高质量文本进行困难负样本加batch内负样本根据任务对比学习微调
- 大量文本对进行batch内负样本对比学习
- 高质量文本进行困难负样本学习
- 合成大量的不同任务不同语言的检索数据,困难负样本与batch内负样本对比学习
- 高质量检索数据进行困难负样本加batch内负样本对比学习
- 继续根据非检索数据,如一些分类等其他任务数据进行微调
- 训练方式,尤其是合理设计的多阶段pipeline仍然能够提升性能
- 数据,数据大小、质量、多样性很重要,甚至更长的文本在向量模型中也更受重视。更重要的,合成数据开始展露头脚
- 模型,Decoder-only LLM微调的向量模型效果越来越好。大模型也逐步统治向量模型榜单,带来的收益和增加的开销相比如何,咱也不知道,但是这些参数中蕴含的知识确实让人印象深刻
- 对比学习和难负样本挖掘仍然扮演关键角色。
- 多任务,用不同任务不同来源的数据进行训练,一个batch内如何组织数据也有优化空间。instruction-based fine-tuning可以在训练时帮助模型拿到任务上的线索
首先回顾下2.1.1章节的训练范式中的多个环节:(1)预训练,其实大多数文本向量模型都没有额外做继续预训练,且资源消耗大,可忽略。(4)多任务,语言模型加上任务的instrument,更像是为了在MTEB多任务的考场里,带一个小抄。用于信息检索、RAG时,我们一般也不关注文本向量在分类、聚类上的性能。那么,在RAG检索中的优化,针对特定任务调优向量模型就集中在了(2)文本对对比学习和(3)困难负样本对比学习上,尤其是针对困难负样本的优化。
我相信你比我更懂推荐系统(哪里不对,欢迎指正),但我们还是从推荐系统出发。2016年谷歌在论文Deep Neural Networks for YouTube Recommendations中介绍了深度学习双塔模型在视频推荐召回中的使用。召回需要从大量候选中快速的返回用户可能感兴趣的物品,双塔低延迟的关键在于离线计算大规模的物品向量并使用近似最近邻ANN快速返回结果。双塔模型一个塔表征用户,一个表征物品;训练时,看作一个超多分类问题,可使用word2vec中的negative sampling解决;推理时提前计算好物品的embedding,实时计算用户embedding,采用近似最近邻召回离用户向量最近的Top-k个物品。
同时,在learning to rank排序里一直有point-wise,pairwise, listwise多种排序训练方法。pointwise就是一对用户和物品作为一个样本,点击为正样本、未点击为负样本,训练目标为预测是否点击;pairwise则是一个用户 + 一个正样本(点击物品) + 一个负样本(未点击物品),训练目标是点击概率正样本要大于负样本+margin;listwise则是一个用户 + 多个物品的list,其中第一个物品为点击正样本,list其余物品为未点击负样本,训练目标为点击概率正样本大于每一个负样本+margin。
文本向量的微调优化“借鉴”了推荐系统的以上几点。文本向量中的双塔,一个是query,一个是document,可以通过pointwise、pairwise、listwise进行优化。所不同的是,推荐系统的双塔一般是独立的MLP,而文本向量虽然是双塔一般是共享权重的语言模型。
其中pointwise数据组织格式:
pairwise数据组织格式:
listwise数据组织格式:
当然,有条件也可以使用更细粒度的评分数据格式:
数据
- 数据筛选
- 数据合成
- 负样本策略:in-batch, prebatch
模型
训练
- point-wise, pairwise, listwise
- in-batch-negative训练,一般batch size越大效果越好
- 对比损失函数
- 温度系数
- 动态margin
融合 可以理解成多路召回
- 向量融合:采用padding或俄罗斯套娃的方式把向量维度对齐,然后向量层面融合。
- 召回结果融合:针对多个召回模型的结果进入结果融合。
kaggle、KDD Cup、WSDM、天池等都举办过信息检索和RAG相关比赛,可查阅hongyingyue/Competition-solutions
细节优化
- nv-embed模型在大模型训练中去掉了causal attention mask
大模型时代,Alpaca通过self-instruct合成数据大显神威,演示了小成本如何复刻一个类ChatGPT模型。
Cosmopedia: how to create large-scale synthetic data for pre-training
在e5-mistral-7b-instruct模型中介绍了如何使用合成数据+大模型训练一个文本向量模型。
更多合成数据,可参考A Survey on Data Synthesis and Augmentation for Large Language Models
对比学习是优化向量模型的重要手段。