提纲
1 简介
2 方法
2.1 模型输入
2.2 Pooling策略
2.3 训练方式
3 实验
4 实验结论
5 讨论
参考文献
1 简介
In-context learning作为大模型的一种能力特性,使得大模型具备利用examples去处理类似任务的能力,在很多生成任务中能经常看到这种做法,但在text embedding任务中则没有先例。于是研究人员提出了 **bge-en-icl,通过提供若干个相关examples去生成高质量文本表征,具体做法就是在query端插入跟任务相关的examples,这种新的方法既保持了原本的模型结构又取得了明显受益** 。相关训练数据跟模型已经公开了,有兴趣的朋友可以自行查阅https://huggingface.co/BAAI/bge-en-icl。
图1: MTEB榜单(截止2024/09/27)
2 方法
2.1 模型输入
图2: ICL-based 模型框架
目前主流的text embedding模型会在query端跟document分别加上对应的instruction, 让模型根据instruction生成对应的text embedding。 **而基于ICL的模型则会在文本开始位置额外加入examples作为prefix,具体做法就是在query端的输入应该是{example 1}+{...}+{example n}+{Instruction}+{query},而document端的输入还是原始文本。** 其中example就是跟当前任务相关的样例数据,Instruction就是当前任务描述。
2.2 Pooling策略
虽然近期很多Decoder-only的模型在生成text embedding时都会采用双向注意力机制,包括LLM2Vec
LLM2Vec: 改造Decoder-only LLM以生成高质量text embedding 跟NV-Embed NV-Embed: 不装了,NVIDIA亲自下场,发布自家embedding模型并成功登顶MTEB ,但是研究人员认为改为双向注意力机制的做法会跟模型预训练不匹配,损害模型的in-context learning跟生成能力。于是依旧是采用单向注意力机制,并且以文本结束符号[EOS]对应的表征(也就是last token pooling)作为text embedding。
2.3训练方式
依旧是对比学习,采用标准的InfoNCE损失函数。比较特别的地方在于query端的examples的获取,在每一个训练step里,会通过抽样策略从这个batch里获取0到n个example作为某个query的examples。
这是一种动态训练策略,也就是对于同一个训练样本,每次训练时模型见到的内容都不尽相同。同时,研究人员引入了examples选择策略,用于进一步提升模型的ICL能力。
3 实验
研究人员选用Mistral-7B作为基底模型,利用LoRA的方式做进一步的SFT。出于一些考虑,分别在两个训练数据上进行了模型训练。在每次训练中,都通过随机采样,针对每个query,每次会从同batch里选择0~5个example作为in context learning的examples。
完成模型训练后,会在few-shot跟zero-shot两种设置上分别评测模型性能。
4 实验结论
a) bge-en-icl(few-shot)在基于full data训练下总体达到了新的SOTA性能,虽然由于不同模型的训练数据有所差异,这种对比不太公平。但在public data上,在训练数据基本一致的前提下,bge-en-icl(few-shot)展现了明显优势。
b) 通过进一步实验,验证了in-context learning所带来的提升以及动态examples的优势所在。Fix examples就是为每个任务指定3个预先定义好的examples,这不就是把原本的任务instruction加多了点内容嘛,并没有增加prompt的多样性,所以对于提升模型泛化能力而言就相对有限了。
c) 研究人员也尝试往document端添加相关instruction,但是会带来明显的性能损耗。这也跟其他模型一致,基本只会在query端添加相关的instruction。
5 讨论
**Bge-en-icl是目前我见到的一个把in-context learning引入到text embedding任务的模型,为了充分发挥大模型的ICL潜力,依旧沿用单注意力机制,并且找到了更加高效的examples构建策略,在效果上也有所提升。既然要将大模型应用到text embedding任务中,那就应该更好的从中挖掘大模型本身的能力特性,而不是简单的换个模型基底。这也是我写这个的最重要原因,虽然看起来挺简单,但bge-en-icl切切实实将in-context learning这种能力特性应用到这个任务了,挺值得借鉴的。**
其实Bge-en-icl的做法本质上就是丰富了prompt的多样性,从而提升了模型的泛化能力,相比于之前每个任务只有一个对应的instruction,它现在加上动态获得的examples后,每个训练样本都有一个特有的examples+instruction,数据的多样性自然上去了,模型的性能也会受益于此。
目前对这个模型的评测流程还是有较多困惑的,看官方规划也是打算将评测流程发布的,那就再稍微等等看吧。在具体使用中,examples应该根据具体的文本选取,还是跟任务强相关即可?examples所带来的额外模型输入长度也是个要考虑的点。 text embedding任务 都开始用到了in-context learning了,那么chain-of-thought还会远吗?是不是还会有更多能力特性被应用到这个任务里。
参考文献
1 MAKING TEXT EMBEDDERS FEW-SHOT LEARNERS