AI 文摘

语言模型之textembedding(思考篇)


  • By AiBard123
  • September 11, 2023 - 2 min read



作者: AINLP 来源: AINLP

提纲

1 简介

2 背景介绍

3 Finetune

4 Pretrain+Finetune

4.1 sentence-T5

4.2 GTR

4.3 Instructor

4.4 E5

4.5 BGE

5 LLM

5.1 PromptBert

5.2 PromptEOL+CSE+LLM

6 总结

参考文献

1 简介

前年底的时候写了一篇利用Bert的若干变体来生成句向量的方法,在最近两月又介绍了包括sentence-T5, GTR, Instructor, E5, GTE, BGE等一系列目前相对先进的句向量模型。自己在调研跟实践关于这方面内容还是有不少想法的,加上有读者反馈跟交流的问题跟意见,所以在这里想对整个text embedding的方案做些梳理,对前面文章做一些总结性概括, 帮助大家理清这些不同方法之间的联系跟差异。(PS:本文会带有不少作者个人的主观想法,如有错误,欢迎沟通交流。)

2 背景介绍

Text embedding就是将文本转成一组固定维度的向量表示。 我们所熟知的word embedding是以token为基本单位,而text embedding则是以文本为基本单位的。理想的text embedding应该尽可能保留文本的语义信息,相同语义但不同表述方式的文本可以被映射到同一个位置,而不同语义的文本在向量空间应该保持对应的距离。

Text embedding能用来做些什么?它可以用在Classification, Clustering, Pair Classification, Reranking, Retrieval, STS, Summarization, Bitext Mining等任务中。如何评价它的好坏,也可以通过在这些任务的表现来评估。

如何从语言模型中获得Text embedding呢?以目前主流的Transformer-Encoder为例,有以下几种不同方式。

a) 将模型最后一层[CLS]位置的向量表征直接作为句向量。

b) 将模型最后一层[CLS]位置的向量表征,再经过MLP层得到的向量。

c) 将模型最后一层所有位置的向量表征,再经过一个Pooling层得到的向量。(大部分情况下采用的是mean pooling,在有些情况下也会使用max pooling等其他方式)

d) 将模型最后一层所有位置的向量表征,再经过一个Pooling层跟MLP层得到的向量。

3 Finetune

从Bert问世开始,由于原生的Bert没办法直接得到高质量的句向量,所以衍生了很多相关的方法(具体可见前年的文章Bert系列之句向量生成),比较标志性的就是sentence-Bert跟simcse,前者验证了语言模型通过在文本相关性任务finetune过后,就能产生更高质量的句向量,而后者则是在验证了对比学习对于这类任务的收益。

在simcse后的一段时间里出现了各种魔改对比学习,这个时期的句向量方案都是让语言模型在文本相关性任务上进行特定的finetune,从而获得一个适配于特定场景的text embedding模型,一般训练数据集都比较局限,最终得到的text embedding模型泛化能力也比较有限,在A场景下finetune得到的模型很难直接迁移到B场景下。同时,模型能力也基本只能在STS跟Classification这类任务上评测,在更具难度的Retrieval等任务上的表现依旧不尽人意。

4 Pretrain+Finetune

语言模型预训练采用的基于token级别的MLM任务,跟基于sentence级别的text embedding本身就有所差异,所以如果想进一步提升text embedding的上限,或者获得一个更加通用的text embedding模型,就需要为text embedding设计针对性的预训练任务。基于此,衍生了两种不同的Pretrain+Finetune路线,第一种是对比学习+对比学习,第二种是自动编码+对比学习。

4.1 sentence-T5

21年8月谷歌的团队利用T5-encoder+mean pooling,经过两阶段的训练得到了sentence-T5。两个阶段采用的都是对比学习,第一阶段是在无人工标注的十亿级别的庞大语料上做预训练,而第二阶段则是在有人工标注的十万级别的高质量NLI语料上作进一步finetune得到。在这里验证了T5-encoder这种结构足以媲美先前的simcse-Bert系列,以及预训练对于T5-encoder的收益明显。

图1:sentence-T5效果

4.2 GTR

21年底的时候sentence-T5团队在之前的基础上发布了GTR,沿用之前的模型架构,将finetune的数据集从NLI换成检索相关的,并且利用百度的rocketqa来获得hard negative。同时将原先的对比学习改成双向对比学习(每个batch里有两个对比学习损失,第一个损失是以query为中心去构建正负样本,第二个损失是以positive document为中心去构建正负样本)。在这里验证了Pretrain跟Pretrain对于text embedding都是不可获取的,同时也验证了模型越大,能力越强。

图2:GTR效果

4.3 Instructor

在22年底Meta以谷歌的GTR为基底模型,经过进一步的“instruction tuning”得到Instructor。Instructor认为同一个文本在不同场景下应该有不同的text embedding,为此需要将模型输入改成Task Instuction+X,这样由于不同的Task Insturction才能得到不同的text embedding。为此,研究人员构建了一个Instruction tuning数据集MEDI(它包括300多个数据集,每个数据集都有对应的Task instruction,如果是非对称数据集,那么query跟document会有各自对应的instruction)。

图3:Instruction框架

这里要分析下sentence-T5, GTR, Instructor三者的差异,三者的模型结构虽然一致,但是sentence-T5是对称数据上训练的,GTR是在非对称数据上训练的,而Instructor则是在对称跟非对称数据上混合训练得到的以下图为例,左边第一个正方形就相当于sentence-T5,左边第二个正方形就相当于GTR,而右边第一个正方形就相当于Instructor。

图4:分析sentence-T5,GTR,Instructor三者差异

Instructor是我认为的第一个真正意义上通用的text embedding模型,它的训练数据包括了对称数据跟非对称数据,在所有评测任务上表现也不存在明显短板。,在整体能力上实现了通用。 以XL版本为例,可以比较下sentence-T5, GTR跟Instrutor之间的差异(在MTEB数据上的评测结果),可以看到sentence-T5更擅长与对称任务,GTR偏向于非对称任务,但是Instructor则是全能。

Model(XL)

STS

Retrieval

sentence-T5 81.66

38.47

GTR

77.8

47.96

Instructor

83.06

49.26

4.4 E5

在Instructor发布的同时,微软也发布E5,这是一个以Bert为基底的模型,跟前面几个模型的差别除了模型结构外,E5提出了一个预训练数据过滤的方案consistency-based filter,从1.3B数据汇总过滤得到270M高质量数据。同时,在模型输入侧加入了Prefix(“query:“跟“paragraph:”),从而让模型知道文本的类型,跟Instructor的instruction类似。E5的整体性能跟Instuctor相当,主要验证了预训练数据质量的重要性。

图5:E5模型结构

4.5 BGE

除了主流的对比学习+对比学习外,采用了自动编码+对比学习这个路线的BGE在23年8月份横空出世,占据METB榜首。针对text embedding,对于自动编码任务有两个要求,其一是重建任务需要足够难,从而迫使模型去生成高质量的句向量,其二是能够充分利用训练数据。

BGE的预训练采用了RetroMAE的方案,包括一个以Bert为基底的Encoder跟一个只有一层的Decoder,训练时,Encoder端以30%的比例对原文本进行mask,最终得到最后一层[CLS]位置的向量表征作为句向量,而Decoder端则以50%的比例对原文本进行mask,联合Encoder端的句向量,对原本进行重建(补充一句,基于RetroMAE+key word的RetorMAE-2的方案在22年底已经提出,但是目前没有基于此的text embedding模型开源)。另外,BGE在finetune阶段针对检索任务需要加入特定的Prefix(只在query侧加"Represent this sentence for searching relevant passages:")。

图6:BGE预训练框架

5 LLM

在大模型如此火热的年代,当然也有人期望直接利用LLM来生成text embedding。

5.1 PromptBert

PromptBert是22年10月份提出的,以Bert为基底,通过选择合适的prompt(“This sentence:"[X]” means [MASK] ”),然后以最后一层[MASK]位置的向量表征作为句向量,即便不经过额外的finetune也能取得令人惊艳的效果。这种方式的弊端在于严重依赖于的prompt的选取,不同的prompt所带来的差异天差地别。

5.2 PromptEOL+CSE+LLM

23年7月份提出的方法,语言模型使用的是OPT跟LLaMA(真正意义上的大模型),由于采用的是decoder-only的结构,所以构建了另一个新的prompt,“This sentence:”[X]” means in one word:",以下一个生成token的隐层状态作为text embedding(这个prompt是精心设计的,其中"in one word"是期望将模型输出压缩到一个token,从而保证text embedding的质量,而prompt最后的分号是为了避免模型生成的下一个token是无实质意义的标点符号)。另外,还引入了in-context learning,为每个语言模型找到了一个最佳的demonstration,从而指导语言模型生成更符合要求的text embedding。同时为了进一步提升性能,可以采用对比学习的方式作进一步的finetune,最终在STS这类任务的性能能超过sentence-T5。

图7:PromptEOL+CSE+LLM框架

6 总结

** 关于模型结构的选取,是Bert系列还是T5-encoder,目前看起来都可以,这两者之间没有明显优劣势,目前主流的Pretrain+Finetune训练范式,text embedding能力主要是从Pretrain阶段开始学习的,只要基底模型具备了基本能力即可。**

** Pretrain跟Finetune两者缺一不可,Pretrain负责筑底,而Finetune是主力,Pretrain能让模型学习到text embedding的基本能力,而Finetune则能将这部分能力激发到极致。只有Pretrain的话的text embeding能力就会变现的非常平庸,而只有Finetune的话容易让模型过拟合于特定场景,失去迁移到其他场景的能力,但是对于特定场景而言,可以没有Pretrain,但是不能没有Finetune。**

** Pretrain方案的选择,基于对比学习的依旧是主流,但是严重依赖于训练数据的质量,而且由于缺乏hard negative,往往只能选择用更大的batch size,会受到训练资源的限制。而基于自动编码的方案,不需要(query,document)的pair对数据,放低了数据要求,后续可能会受到更多重视,但是预训练跟finetune的任务不匹配可能会带来一些额外的问题。或许后续会有新的训练方式出来也说不准,例如自动编码+对比学习+对学学习,语言模型先在没有pair对的数据上以自动编码的任务做预训练,然后再在没有人工标注的数据上做对比学习,最后再在有人工标注的数据上做进一步finetune。**

** 对称数据跟非对称数据的区别处理,让模型同时在对称数据跟非对称数据上训练,可以提升整体的能力。但是这个过程为了让模型能有一定的辨识,需要引入对应的prefix。**

** LLM来获得text embedding目前的方法在我看来比较鸡肋,虽然支持只改prompt而不需要额外训练,但是text embedding严重依赖于prompt engineering的质量。如果要做进一步训练的话,使用对比学习finetune手段不就是将之前的方案换了个基底模型嘛,而且最终在STS任务上也没有明显优势,更别说缺乏Retrieval等任务的评测。没有真正发挥大模型的能力,有点硬炒CP的既视感。**

参考文献

  1. Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

https://aclanthology.org/D19-1410.pdf

  1. SimCSE: Simple Contrastive Learning of Sentence Embeddings

https://arxiv.org/pdf/2104.08821.pdf

  1. Sentence-T5: Scalable Sentence Encoders from Pre-trained Text-to-Text Models

https://arxiv.org/pdf/2108.08877.pdf

  1. Large Dual Encoders Are Generalizable Retrievers

https://arxiv.org/pdf/2112.07899.pdf

  1. One Embedder, Any Task: Instruction-Finetuned Text Embeddings

https://arxiv.org/pdf/2212.09741.pdf

  1. Text Embeddings by Weakly-Supervised Contrastive Pre-training

https://arxiv.org/pdf/2212.03533.pdf

  1. RetroMAE: Pre-Training Retrieval-oriented Language Models Via Masked Auto-Encoder

https://arxiv.org/pdf/2205.12035.pdf

  1. RetroMAE v2: Duplex Masked Auto-Encoder For Pre-Training Retrieval-Oriented Language Models

https://arxiv.org/pdf/2211.08769.pdf

  1. PromptBERT: Improving BERT Sentence Embeddings with Prompts

https://arxiv.org/pdf/2201.04337.pdf

  1. Scaling Sentence Embeddings with Large Language Models

https://arxiv.org/pdf/2307.16645.pdf

进技术交流群请添加AINLP小助手微信(id: ainlp2)

请备注具体方向+所用到的相关技术点

![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSJADkmZ2IX6Z23znAibuEevotDMq9iaMxiapK7jfMibiauGFkycicAJEs6x5U9SGyDJZ0S1tRed9TPNUUDQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括LLM、预训练模型、自动生成、文本摘要、智能问答、聊天机器人、机器翻译、知识图谱、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP小助手微信(id:ainlp2),备注工作/研究方向+加群目的。

  


  


![](https://api.allorigins.win/raw?url=https://mmbiz.qpic.cn/mmbiz_jpg/nW2ZPfuYqSKABHCqVVQkVYPrM4XY1vsd0iaeuXzyJnoFc8cibd5mYb4wdA3WMQtiaPVmr0XLZHMuVibqWncibpnTSnQ/640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1&wx_co=1)

阅读至此了,分享、点赞、在看三选一吧🙏

更多AI工具,参考Github-AiBard123国内AiBard123

可关注我们的公众号:每天AI新工具