为分类任务微调表示模型
深入讲解为分类任务微调表示模型的完整流程:分类头设计、全量微调 vs LoRA 的选择、小样本场景下的 SetFit 方案,以及过拟合防范与模型评估。
从 Sentence-BERT 到对比学习(SimCSE),再到 Matryoshka 嵌入和 MTEB 基准评估——系统讲解如何构建和优化高质量文本嵌入模型。
和 CLIP 的道理一样——只用正例会学到退化解(所有输入映射到同一点)。负例提供了“推力”,迫使模型学会区分不同语义的文本。比如学“猫和狗相似”不如学“猫和狗相似,但猫和汽车不相似”更有效,因为后者定义了相似性的边界。难负例(如“猫和狱狸不相似”)更能推动模型学到细粒度的语义差异。
简单负例:同一batch内的其他样本自然作为负例(in-batch negatives),简单高效但太容易区分。难负例构建:1)用BM25检索与正例相似但不匹配的文档;2)用当前模型检索高分但错误的结果(在线挖掘);3)人工标注易混淆的样本对。注意难负例不能太难(否则可能是标注错误的正例),需要控制难度范围。
双编码器:query和文档分别编码为向量,算余弦相似度。文档向量可以离线预计算,检索时就是一次向量搜索,极快。交叉编码器:query和文档拼在一起联合编码,精度高很多但每对都要重新计算,无法预计算。大规模搜索引擎必须选双编码器做召回(百万级文档不可能每次都跟 query 拼接),然后用交叉编码器做重排序。
MNR损失:用in-batch negatives做对比学习,batch越大效果越好,但需要大显存。余弦相似度损失:直接优化两个向量的余弦相似度接近目标值,适合有连续相似度标签的数据(如STS数据集),不需要负例。Softmax损失:把毄元选择当分类问题,稳定但灵活性低。余弦损失更适合的场景:有人工标注的相似度分数(而不是单纯的匹配/不匹配),或者数据量小不适合大batch的情况。
TSDAE是先编码再解码重建原句。用[CLS]特殊词元作为句子表征,它被迫把整个句子的信息压缩到一个向量里(因为解码器要从这一个向量重建整个句子)。平均池化会让信息分散在多个token中,每个token不需要承载全部信息,导致平均后的向量信息密度低。用单一词元的瓶颈设计能给予更强的训练信号,学到更紧凑的表征。
优点:1)不需要标注数据,只需要原始文本,领域适配成本极低;2)可以用目标领域的未标注文本做续训,快速适配新领域;3)学到的是通用的语义表征,泛化性好。缺点:1)没有任务监督信号,学到的表征可能不是任务最优的;2)在有充分标注数据时,效果通常不如有监督方法。实践中常用无监督做续训+少量标注数据微调的组合。
STSB只测一个维度(句子相似度),MTEB是多任务综合评测,更全面反映嵌入质量。包括的任务类别:1)语义文本相似度(STS);2)分类;3)聚类;4)重排序;5)检索;6)bitextmining(双语句对匹配);7)速度。改进在于:多任务、多数据集、多语言,避免了在单一任务上过拟合,更能反映模型的真实嵌入能力。
用用户点击/跳过行为作为隐式反馈,构建“查询-正例文档-负例文档”三元组训练数据。具体流程:1)记录用户点击的文档作为正例,展示但未点击的作为负例;2)用这些数据对重排序模型做对比学习微调;3)定期用新的反馈数据继续微调,实现持续优化。注意要处理位置偏差(用户倾向于点击靠前的结果)。
用agent的行为作为隐式反馈:1)跟踪agent实际引用了哪些检索文档,引用的为正例,未引用的为负例;2)让agent在生成回答后自评检索结果的有用性(打分);3)用任务完成质量作为间接反馈,如果任务失败,说明检索结果可能不好;4)用强模型判断弱模型的检索结果质量,生成训练数据。本质是把“人类点击”替换成“agent引用”。
检测时机:1)监控检索质量指标(如MRR、召回率),显著下降时触发更新;2)检测新数据中的OOV(未见过的词/概念)比例,超过阈值时更新。增量学习:1)用新数据继续对比学习微调,但要混合旧数据缓解灾难性遗忘;2)用EWC等正则化方法限制重要参数的变化幅度;3)更新后要重新计算全部文档的嵌入向量,确保一致性。
RELATED