如何提高LLMs的文本表征(Text Embedding)能力?

news2024/11/19 14:24:10

目前,大模型落地的可靠方案还是以RAG(retrieval-augmented-generation,检索增强生成)为主,那么检索在大模型落地中就起着重要的作用。而稠密检索可以从语义层面找到与用户Query相关的文档片段,文本表征(Text Embedding)模型也就成为除大模型外的研究内容。

但也许有一些人存在疑惑,为了不用大模型作为文本表征模型呢?前两天就在知乎上刷到了这个问题,今天就来回答一下。

图片

并且分享一篇前几天刚刚刷了MTEB-英文榜单的论文,《Improving Text Embeddings with Large Language Models》,即提高大模型的文本表征。

图片

HF: https://huggingface.co/intfloat/e5-mistral-7b-instruct
Paper: https://arxiv.org/abs/2401.00368

为什么主流方法不用直接用大模型进行文本向量表征?

  • 效果不理想。现在大模型的训练都是基于文本续写形式来训练的,损失函数主要预测下一个Token是否准确,而不是判断整个句子表征的好坏。因此直接用当前的大模型来对文本进行表征,效果并不理想。但如果将大模型以文本表征为目的的训练,也就用point-wise、pair-wise、list-wise等方法训练大模型,相信大模型文本向量表征一定更好。

之前也分享过一篇OpenAI以GPT3为底座训练的向量表征模型的论文-《基于对比学习的预训练文本&代码表征技术》,欢迎大家阅读。这也可能是现在openai向量接口为什么好的原因吧,内部可能就是用了更大参数的模型。

  • 部署成本变高。越大的模型,部署的成本就越高,如果利用大模型进行向量表征,那么部署成本就是翻倍的。BGE等主流向量表征模型,一般都是110M-300M参数量,相较于现在的大模型来说都是极小模型,部署和推理成本都在可接受范围之内的。
  • 向量表征模型对负例个数和难度都有一定的要求,当训练资源一定的情况下,模型太大,负例个数就会相对减少,可能负例减少带来的副作用比参数变大带来的好处要大。

知乎:https://www.zhihu.com/question/637789621/answer/3351187000

提高大模型的文本向量表征

对于《Improving Text Embeddings with Large Language Models》一文总结就是以下几点:

  • 构造高质量训练数据
  • 文本向量表征时写好提示词
  • 选对底座大模型

数据构造

数据构造方法一般根据已有文档生成查询Query、伪标签或者根据查询Query生成伪文档等,而本文直接挖掘大模型内部存储的知识内容,在不依赖已有文档或查询Query的情况下,生成文档片段和查询Query,因此可以生成更多样化的数据,如下图所示。

图片利用GPT-4构造数据样例

数据构造两步走:

  • 通过GPT4模型进行头脑风暴,生成固定个数的检索任务列表
  • 通过GPT4模型根据上一步生成的任务定义、Query类型、Query长度、Query清晰度、文档片段长度、语言等生成具体示例。

并且在数据构造时,根据向量表征任务不同,划分为非对称任务和对称任务:

  • 非对称任务:主要是查询Query和文档片段在语义上相关,但不是彼此之间不能释义(也就是相关但不等同)。并且根据查询Query和文档片段的长度,进一步分为短长匹配、长短匹配、短短匹配和长长匹配。
  • 对称任务:主要是询Query和文档片段在语义相似,但表面表达不同,包括单语语义文本相似度(STS)和双语文本检索。

通过150个指令构造了500k个样本,涉及92种语言,其中25%数据由GPT-35-Turbo构造,75%数据由GPT-4构造,详细分布如下图所示。

图片构造数据的任务类型和语言统计

模型训练

模型在训练过程中,将数据末尾添加一个[EOS]标记,文本经过大模型后,将[EOS]标记对应的向量作为整个文本的句子向量。并采用InfoNCE作为损失函数,负例采用Batch内负例和一个难负例。

图片

其中, 表示经过提示词改造的查询Query, 表示与查询Query相关的文档片段, 表示与查询Query无关的文档片段。 表示查询和文档片段 之间的匹配值,采用缩放的余弦相似度表示,缩放值 为超参数,默认为0.02。

图片

模型在训练时,查询Query需要进行提示词改造,文档片段不做提示改造;并且不同数据集下,查询Query拼接的提示词内容不同,详细如下表所示。

图片

当然,在模型预测时,不同评测榜单中的各个数据的提示词也略有不同,如下表所示。

图片

模型训练过程中,采用DeepSpeed ZeRO-3 + Lora方式微调,基模采用mistral-7b模型,rank为16,训练参数共计42M,最大长度为512,批次为2048,学习率为1e-4,在32个V100上训练了18小时。

结果分析

模型在训练过程中,数据不仅涉及利用GPT4生成的数据,还包括:ELI5 、HotpotQA、FEVER、MIRACL、MSMARCO、NQ、NLI、SQuAD、TriviaQA、Quora Duplicate Questions、MrTyDi、DuReader和T2Ranking等多个数据集,共180万训练样本。

通过下表可以看到,在全量数据微调下,可以达到Sota的效果,即便是仅采用生成数据进行微调,效果也比较理想,说明生成数据很重要。

图片

进行一些列的消融实验后,可以看出,基座模型的选择比较重要,选择Llama2-7B要比Mistral-7B低1.6%,说明底座模型越好,预训练数据效果越好,对文本向量表征模型效果越好。并且与上表进行对比,仅用msmarco数据效果为62.7%,用msmarco+构造数据效果为64.5%,进一步说明构造数据的重要性。

图片

对于文本向量的选择,当选择平均池化和带权重平均时,都存在下过的下降,说明利用文本最后一个Token标记作为文本向量表征的效果较好。Lora的rank值选择不同时,效果也存在些许波动。并且发现,不在查询Query前加入提示词会有4.2%的下降,说明提示词很重要。

同时,对多语言表征进行了结果比较,发现模型在高资源语言下的效果比较理想,在少资源语言下的效果不理想,应该与底座模型Mistral-7B的预训练数据有关。

图片

图片

并且做了一个个性化密钥的检索试验,说明基于大模型的向量表征,虽然训练采用512作为最大长度,但可以将文本表征外推到4k。

图片个性化密钥检索示意图

图片

写在最后

E5-Misral-7B模型,即使在榜单上比BGE-large高了2个点,但在工业上并不是很实用。参数增加太多了,部署&推理成本也变高。那么是不是可以利用1-2B的大模型来进行向量表征呢?

如何学习大模型

现在社会上大模型越来越普及了,已经有很多人都想往这里面扎,但是却找不到适合的方法去学习。

作为一名资深码农,初入大模型时也吃了很多亏,踩了无数坑。现在我想把我的经验和知识分享给你们,帮助你们学习AI大模型,能够解决你们学习中的困难。

我已将重要的AI大模型资料包括市面上AI大模型各大白皮书、AGI大模型系统学习路线、AI大模型视频教程、实战学习,等录播视频免费分享出来,需要的小伙伴可以扫取。

一、AGI大模型系统学习路线

很多人学习大模型的时候没有方向,东学一点西学一点,像只无头苍蝇乱撞,我下面分享的这个学习路线希望能够帮助到你们学习AI大模型。

在这里插入图片描述

二、AI大模型视频教程

在这里插入图片描述

三、AI大模型各大学习书籍

在这里插入图片描述

四、AI大模型各大场景实战案例

在这里插入图片描述

五、结束语

学习AI大模型是当前科技发展的趋势,它不仅能够为我们提供更多的机会和挑战,还能够让我们更好地理解和应用人工智能技术。通过学习AI大模型,我们可以深入了解深度学习、神经网络等核心概念,并将其应用于自然语言处理、计算机视觉、语音识别等领域。同时,掌握AI大模型还能够为我们的职业发展增添竞争力,成为未来技术领域的领导者。

再者,学习AI大模型也能为我们自己创造更多的价值,提供更多的岗位以及副业创收,让自己的生活更上一层楼。

因此,学习AI大模型是一项有前景且值得投入的时间和精力的重要选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1887705.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++:C与C++混合编程

混合编程 为什么需要混合编程 (1)C有很多优秀成熟项目和库,丢了可惜,重写没必要,C程序里要调用 (2)庞大项目划分后一部分适合用C,一部分适合用C (3)其他情况,如项目组一部分人习惯用C,一部分习惯用C 为什么…

FormLayout布局和FormItem对比

FormLayout布局和FormItem对比 FormLayout布局 package mainimport ("fyne.io/fyne/v2""fyne.io/fyne/v2/app""fyne.io/fyne/v2/container""fyne.io/fyne/v2/layout""fyne.io/fyne/v2/widget" )func main() {myApp : app.…

代码随想录-Day45

198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

三维家:SaaS的IT规模化降本之道|OceanBase 《DB大咖说》(十一)

OceanBase《DB大咖说》第 11 期,我们邀请到了三维家的技术总监庄建超,来分享他对数据库技术的理解,以及典型 SaaS 场景在数据库如何实现规模化降本的经验与体会。 庄建超,身为三维家的技术总监,独挑大梁,负…

IDEA Debug 断点

今天在工作发现有些新入职的小伙伴们,在调试程序时不是很会正确使用IDEA所提供Breakpoints(断点),这里就简单的介绍下比较常用的功能。 快捷键: 切换行断点:Ctrl F8 编辑断点属性:Ctrl Shift F8 断点的类型 行断点&am…

数据质量管理-可访问性管理

前情提要 根据GB/T 36344-2018《信息技术 数据质量评价指标》的标准文档,当前数据质量评价指标框架中包含6评价指标,在实际的数据治理过程中,存在一个关联性指标。7个指标中存在4个定性指标,3个定量指标; 定性指标&am…

文献阅读:逆行病毒示踪剂之间的神经嗜性和神经毒性的差异

文献介绍 文献题目: Differences in neurotropism and neurotoxicity among retrograde viral tracers 研究团队: 曹罡(华中农业大学)、戴金霞(华中农业大学) 发表时间: 2019-02-08 发表期刊&…

cefsharp(winform)默认菜单/自定义菜单/二级菜单定义方法

一、有关cefsharp(winform)菜单定义 接口:IContextMenuHandler 菜单:OnBeforeContextMenu 命令:OnContextMenuCommand void IContextMenuHandler.OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters,…

智慧公厕系统改变了人们对服务区公厕的看法

在过去,服务区公厕常常给人留下脏乱差的印象,成为人们在长途旅行途中不愿停留的地方。然而,随着智慧科技的不断发展和应用,智慧公厕系统的出现改变了人们对服务区公厕的看法,为公共卫生设施的提升注入了新的活力。 一、…

常见反爬及应对

一,特殊混淆的还原 1.1 还原 AAEncode 与 JJEncode AAEncode是一种JavaScript代码混淆算法,利用它,可以将代码转换成 颜文字 表示的JavaScript代码。 去掉代码最后的 (‘‘),这是函数的自调用,去除后就是函数的声明…

嵌入式存储介质之SD卡基础知识记录

嵌入式存储介质之SD卡 SD卡简介: SD卡(Secure Digital Card,安全数字卡)是一种广泛应用的可移除存储设备,主要用于存储各种数字信息,如照片、视频、音乐和文档等。SD卡由SD协会(Secure Digita…

Golang 开发实战day15 - Input info

🏆个人专栏 🤺 leetcode 🧗 Leetcode Prime 🏇 Golang20天教程 🚴‍♂️ Java问题收集园地 🌴 成长感悟 欢迎大家观看,不执着于追求顶峰,只享受探索过程 Golang 开发实战day15 - 用户…

SSM学习3:注解开发定义bean、纯注解开发模式、注解开发依赖注入、注解开发管理第三方bean

注解开发定义bean 使用注解加载bena applicationContext.xml 配置组件扫描 <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:context"http://www.springframework.o…

Linux文件管理:文件扩展属性 chattr lsattr 命令详解

目录 chattr命令常用参数属性选项完整的支持的属性选项 使用案例 lsattr命令常用参数使用案例 结合使用chattr和lsattr 在Linux系统中&#xff0c;文件属性决定了文件的可见性、可读性、可写性等特性。chattr和lsattr是两个用于管理文件系统属性的重要工具。 它们可以帮助用户保…

STM32智能家居掌上屏实战:从WiFi连接到MQTT通信,打造你的家庭物联网网关

摘要: 本文深入探讨一种基于STM32的智能家居掌上屏设计方案&#xff0c;详细阐述其硬件架构、软件设计以及通信协议等关键技术细节。该方案利用WiFi构建局域网&#xff0c;实现与各类传感器、执行器的便捷交互&#xff0c;并通过TFT彩屏提供直观的控制和数据展示&#xff0c;旨…

数组-二分查找

二分查找 leetcode704 /*** param {number[]} nums* param {number} target* return {number}*/ var search function(nums, target) {let left 0, right nums.length - 1;while (left < right) {const mid Math.floor((right - left) / 2) left;const num nums[mid]…

深入理解ThreadLocal原理

以下内容首发于我的个人网站&#xff0c;来这里看更舒适&#xff1a;https://riun.xyz/work/9898775 ThreadLocal是一种用于实现线程局部变量的机制&#xff0c;它允许每个线程有自己独立的变量&#xff0c;从而达到了线程数据隔离的目的。 基于JDK8 使用 通常在项目中是这样…

仅1月出刊:计算机科学类知网检索普刊

【欧亚科睿学术】 Journal of Computer Science and Electrical Engineering 《计算机科学与电气工程杂志》是一份同行评审期刊&#xff0c;发表计算机科学和电气工程几个领域的原创研究文章和综述文章。 它由UPUBSCIENCE出版社出版。它支持开放获取政策&#xff0c;即让所有…

后台运行大师:HarmonyOS 3.0中如何轻松设置APP常驻后台

有不少人想要让某些常用的APP直接挂在后台&#xff0c;减少应用程序自动关闭的情况。这种需求&#xff0c;其实就是希望APP能够“保持在后台运行”。 本篇文章用14张图片、7大步骤&#xff0c;讲解手机如何将某个APP保持在后台运行。图片直接使用的是华为手机HarmonyOS 3.0的手…

Verilog开源项目——百兆以太网交换机(五)TCAM单元设计

Verilog开源项目——百兆以太网交换机&#xff08;五&#xff09;TCAM单元设计 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚焦整体架…