关于大模型学习中遇到的3

来源:网络

Embedding模型

随着大型语言模型的发展,以ChatGPT为首,涌现了诸如ChatPDF、BingGPT、NotionAI等多种多样的应用。公众大量地将目光聚焦于生成模型的进展之快,却少有关注支撑许多大型语言模型应用落地的必不可少的Embedding模型。本文将主要介绍为什么Embedding模型在大语言模型中十分重要、当前主流的Embedding训练方法,以及我们关于Embedding模型初步探索的一些思考。

一、Embedding技术简介及历史概要

在机器学习和自然语言处理中,Embedding模型是指将高维度的数据(例如文字、图片、视频)映射到低维度空间的过程。简单来说,embedding向量就是一个N维的实值向量,它将输入的数据表示成一个连续的数值空间中的点。本文主要关注文本embedding。

Embedding重要的原因在于它可以表示单词或者语句的语义。实值向量的embedding可以表示单词的语义,主要是因为这些embedding向量是根据单词在语言上下文中的出现模式进行学习的。例如,如果一个单词在一些上下文中经常与另一个单词一起出现,那么这两个单词的嵌入向量在向量空间中就会有相似的位置。这意味着它们有相似的含义和语义。

Embedding的概念可以追溯到20世纪中叶,Harris提出了分布式语义理论。到20世纪80年代,人们开始尝试用神经网络来学习单词的embedding表示。自2010年以来,随着深度学习技术的发展,先后出现了以Word2Vec、GloVe、FastText为代表的静态向量Embedding和使用ELMo、GPT、BERT为代表生成上下文相关的动态向量embedding,后者可以更好地捕捉单词的语义和上下文信息。

二、Embedding在大模型中的价值

如前文所述,也是被我们熟知的,embedding向量包含语义信息,含义越相近的单词,embedding向量在空间中的位置也越相近。实值向量embedding可以通过从大量的数据中学习单词的语义和上下文信息,从而可以进行向量运算和在不同自然语言处理任务中共享和迁移。

然而,这是Embedding之前的价值。在大语言模型时代,Embedding又有什么新的价值呢?

这要从类ChatGPT模型的缺陷说起。尽管它们能力强大,但目前依然存在以下几点问题:

  • 训练数据不实时(如ChatGPT是基于2021年9月之前的数据训练),重新训练成本过高,不现实
  • 输入文本长度有限制,通常限制在几千到数万个tokens之间
  • 无法访问不能公开的文档

对此,OpenAI发布了一篇文档,说明如何基于embedding使用两步搜索的方式来解决GPT无法处理长文本和最新数据的问题。两步搜索,即先搜索文本库以查找相关的文本部分,再将检索到的文本部分添加到类ChatGPT模型的输入中,获取回复。

以一个代表性的应用来说明,当我们想让大模型根据我们给定的pdf文档进行问题回复时,就可以对超长pdf进行分块,获取每个分块内容的embedding,并使用向量数据库存储。接下来,当你提出问题“xxx在文档中是如何实现的?”时,就可以使用你的问题embedding,去数据库中检索得到与问题embedding相似度最高的pdf内容块embedding。最终把检索得到的pdf内容块和问题一起输入模型,来解决新知识和超长文本输入的问题。

因此,尽管当前的讨论热度不高,但embedding模型的探索对于大语言模型的落地是必不可少的。

三、主流Embedding训练方法

前面提到,OpenAI早已提出了基于Embedding的搜索方案来解决长文本输入和最新数据的问题。自然而然,OpenAI也有一套未公开训练细节的Embedding方案:text-embedding-ada-002。这是OpenAI的二代Embedding模型,仅使用了一个模型就能同时完成三种下游任务:文本搜索,文本相似度和代码搜索。相较于一代模型分成了五个模型来完成上述三种任务,二代模型简化为了单一模型,且在中文和英文任务上都表现出较好的性能。

在本章中,我们将梳理一些主流的Embedding训练方法。近年来,Sentence Embedding的相关工作大多基于BERT-like models。从基于Decoder结构的模型中获取Embedding,只有少数的研究和公开代码。OpenAI所发表的Embedding论文的训练细节也不甚清楚。因此,在本章中,我们主要梳理基于BERT-like models的Sentence Embedding的一些代表性方法。

在BERT前时代,一般采用word2vec训练出的word embedding结合pooling策略进行句向量表征。在BERT时代,人们借助预训练语言模型的固有优势,先是采用BERT模型的[CLS]向量作为句向量表征,而后Sentence-BERT又巧妙地使用孪生网络模型的框架来获取句向量,后续又相继出现BERT-Flow、BERT-Whitening、SimCSE、R-Drop、ESimCSE等工作。其中,被大家较为熟知的就是BERT-whitening和SimCSE,之后便有大量的工作以对比学习为主线思路,在构造正负样本对的数据层面和训练层面进行了改进。本章节主要对该类方法进行一个简要概括。

由于近期的Sentence Embedding工作多围绕对比学习展开,我们首先来回忆一下对比学习的基础。

对比学习背景

对比学习就是「以拉近相似数据,拉远不相似数据为目标,有效地学习数据表征」。给定一个pair对样本集合, 其中和为相似样本,优化目标一般采用通过in-batch negetives交叉熵损失函数,如下:

其中,和为和的句向量表示,N为训练过程中batch的大小,为向量和余弦相似度,为温度超参。

经典方法

近年来,自SimCSE横空出世后,句嵌入领域也引起了一小波研究热潮。在本小节,我们主要对SimCSE相近时期的三篇工作(SimCSE、ESimCSE、CoSENT)进行了相对详细的梳理,并简单总结了后续部分代表工作。

SimCSE

SimCSE算是句嵌入领域最出圈的工作之一了。

它分为两个版本:

  • 无监督版本SimCSE:正样本来自于对同一个句子应用不同的dropout mask所产生的两个相近的表示,负例则使用in-batch negatives;
  • 有监督版本的SimCSE,则基于NLI数据集构造正负样本,正例取蕴含关系的句子对,负例取矛盾关系的句子对(难负例)和in-batch negatives。

以上就是SimCSE的核心思想,简单有效,同时很有启发意义,引领了句嵌入技术后续一波研究热潮。

ESimCSE

ESimCSE分别从正负样本构建的角度对SimCSE进行了改进。

(  (1)正例:代表我们目标的类别。 (2)负例:代表我们不关心的那个类别。)

(1)正例对的构建方法:

由于SimCSE是通过调节dropout率构建的正例对,长度是一样大的,负例则长度不等,这会使得模型倾向于判断相同或相似长度的句子在表达上更相近。

为了缓解这个问题,ESimCSE选择在句子中随机重复一些单词,这可以在改变句子长度的同时,而不改变其语义。

(2)负例对的构建方法:

在对比学习中,理论上负对越多,对之间的比较就越好。ESimCSE也遵从了这一思想,但并没有直接强硬开大batch size,而是维护了一个队列,重用前面紧接的mini-batch的编码嵌入来扩展负对,并使用了动量编码器。具体做法是:由于排队句子嵌入来自前面的mini-batch,可以取其参数的移动平均来保持动量更新模型,并利用动量模型生成排队句子嵌入。当使用动量编码器时,关闭dropout,来缩小训练和预测之间的差距。 编码器的参数和动量更新编码器的参数进行更新,按以下公式计算:


为动量系数参数。注意,只有参数通过反向传播更新。这里我们引入来为队列生成句子嵌入,因为动量更新可以使比进化得更平稳。因此,尽管队列中的嵌入是由不同的编码器编码的(在训练期间的不同“步骤”中),但这些编码器之间的差异可以很小。

CoSENT

早期的Sentence-BERT存在训练、预测不一致和调优困难的问题。但如果直接优化预测目标cos值,效果往往又特别差。难道直接优化cos值的方案就没有出头之日了吗?

有幸的是,答案是不会。苏剑林老师提出了一种CoSENT方案,一个优化cos值的损失函数:

记为所有正样本对集合,为所有负样本对集合,那么我们希望对于任意的正样本对和负样本对,都有

其中,是它们各自的句向量。说白了,我们只希望正样本对的相似度大于负样本对的相似度,至于大多少,模型自己决定就好。事实上语义相似度常见的评价指标spearman也是一样,它只依赖于预测结果的相对顺序,而不依赖于具体的值。

针对这类需求,可以用到Circle Loss理论里边的公式作为解决方案:


 

简单来说,就是如果最终希望实现,那么就往log里边加入一项。对应我们这里的场景,我们可以得到损失函数:

其中是一个超参数。上述公式本质上是一个为排序设计的损失函数,同样适用于多分类的数据,写成更通用的形式:

也就是说,只要我们认为样本对(i,j)的真实相似度应该大于(k,l)的真实相似度,就可以往log里边加入;换句话说,只要我们能够为样本对设计顺序,就可以使用CoSENT方案。

对于NLI数据而言,它有“蕴含”、“中立”、“矛盾”三种标签,我们自然可以认为两个“蕴含”的句子相似度大于两个“中立”的句子,而两个“中立”的句子相似度大于两个“矛盾”的句子,这样基于这三种标签就可以为NLI的句子对排序了。而有了这个排序后,NLI数据也可以用CoSENT来训练了。类似地,对于STS-B这种本身就是打分的数据,就更适用于CoSENT了,因为打分标签本身就是排序信息。

后续部分工作概括

  • SNCSE: Contrastive Learning for Unsupervised Sentence Embedding with Soft Negative Samples
    • 针对模型「无法区分文本相似度和语义相似度,更偏向具有相似文本,而不考虑实际语义差异」的问题,提出了一种「显式添加否定词从而生成软负样本」结合「双向边际损失」的方案。

  • EASE: Entity-Aware Contrastive Learning of Sentence Embedding
    • 强调实体在句向量表征中的重要性。在数据层面,使用正、负实体代替正负样本。
  • CLAIF:Improving Contrastive Learning of Sentence Embeddings from AI Feedback
    • 针对训练过程中缺乏细粒度的监督信号, 即没有考虑到正样本对之间的相似性差异,引入来自LLM的AI反馈,构造具有不同相似度的样本对,并对这些样本对给出细粒度的相似度分数作为监督信号,帮助文本表示的学习。

PromptBERT

PromptBERT是句嵌入领域继SimCSE又一篇经典之作。

这篇工作的核心就是想用Prompt来产生句子表示。作者认为,原生BERT表现不好主要是因为词语频率、大小写、subword等token导致的bias,而BERT本身各层Transformer都没有纠正这个问题。通过利用prompt,可以更有效地使用BERT各层中的知识,并且用[MASK]来表示embedding的话,可以避免像以前一样做各种token的平均,从而避免了token引入的偏差。

这篇工作方法的核心思路也比较简单,分为两步:

  1. 用Prompt的方式生成句子表示,比如[X] means [MASK],[X]是输入句子,[MASK]是输出的表示,用这个当句子表示
  2. 用不同的Prompt模版来生成对比学习的角度,继续采用自监督的方式训练

Instrcutor Embedding

根据OpenAI的论文《Text and Code Embeddings by Contrastive Pre-Training》的说法,文本相似度和语义检索是两个不同的任务,训练目标可能存在一定冲突。随着训练进行,如果模型可能在语义搜索任务上的表现越好,在句子相似度任务上的表现可能就越差。同时,现有的Embedding模型面对新任务和新领域时,性能通常表现不佳。

而我们理想的Embedding显然应该同时具备多种能力。怎么能让Embedding模型同时适应多个任务,并且在新领域上有泛化性呢?

Instrcutor Embedding设计了一种基于指令微调的文本嵌入新方法:在文本输入之前拼接解释用例的指令(包含任务和领域信息)。Instrctor Embedding在训练期间为330个文本嵌入数据集手工编写了任务指令,并在 70 个嵌入评估任务(其中 64 个任务在训练过程中未见)上评估了 INSTRUCTOR,范围从分类和信息检索到语义文本相似性和文本生成评估,整体达到了一个较好的性能。

四、Embedding相关探索与思考

上一章节梳理了基于BERT-like models的Sentence Embedding的代表工作。其实,对于使用双向注意力机制的BERT-like models擅长做内容理解类的任务似乎是很合理的。但OpenAI Embedding模型较好的效果和OpenAI 对于Decoder-Only架构模型的坚持程度,以及近半年大模型的迅速发展,让我们不禁好奇,Decoder-only的大模型有没有可能在Embedding任务上也给我们一次惊喜?

对此我们进行了一些探索类的尝试。在摸索的过程中,我们最希望能搞清两个问题:

  • BERT-like models真的比Decoder-Only架构的模型天然更适合做Embedding任务吗?
  • 对于Embedding任务而言,模型也是越大越好吗?

最终,经过我们对于Decoder-only模型padding方式、pooling方式、不同层各向异性程度的探究,最终得到的结论和当前部分公开结论相对一致。

针对第一个问题,《How Contextual are Contextualized Word Representations? Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings》论文进行了BERT和GPT不同层效果对比的探究实验,实验效果如下表:

根据上表,可以发现:

  • 在不同层上,BERT的效果整体要显著优于GPT
  • GPT-2 last layer的各向异性比较严重,中间层或低层比顶层更适合做similarity任务

针对第二个问题,Instructor Embedding论文也给出了不同参数量模型的效果对比实验,如下表:

根据上表,可以发现:

  • 相比335M的GTR_LARGE模型,参数量数十倍的4.8B的GTR-XXL模型性能并无显著上升。
  • Decoder-Only架构的5.8B的SGPT-NLI模型不敌相近参数量的Encoder-Only架构的4.8B的GTR-XXL模型。

综上,结合我们的实验,初步结论是:

  • 模型参数量角度:在Embedding任务上,模型参数量提升并不一定能带来效果的提升。
  • 模型结构角度:根据当前的实验结果,双向注意力的BERT-like models确实效果比单向注意力的Decoder-only结构更佳。

当然,由于OpenAI并未公布他们Embedding方案的技术细节,或许我们还没有获取使用GPT来做Embedding的正确打开方式。也欢迎感兴趣的同学进一步讨论~

参考文献

  • SimCSE: Simple Contrastive Learning of Sentence Embeddings
  • ESimCSE: Enhanced Sample Building Method for Contrastive Learning of Unsupervised Sentence Embedding
  • SNCSE: Contrastive Learning for Unsupervised Sentence Embedding with Soft Negative Samples
  • EASE: Entity-Aware Contrastive Learning of Sentence Embedding
  • PromptBERT: Improving BERT Sentence Embeddings with Prompts
  • Improving Contrastive Learning of Sentence Embeddings from AI Feedback
  • Text and Code Embeddings by Contrastive Pre-Training
  • One Embedder, Any Task: Instruction-Finetuned Text Embeddings
  • 苏剑林. (Jan. 06, 2022). 《CoSENT(一):比Sentence-BERT更有效的句向量方案 》[Blog post]. Retrieved from https://kexue.fm/archives/8847
  • How Contextual are Contextualized Word Representations? Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings
  • SGPT: GPT Sentence Embeddings for Semantic Search

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

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

相关文章

中仕教育:社会人员可以报名三支一扶吗?

三支一扶是针对高校应届毕业生的一种考试,社会人员并不满足报考条件,所以不能报考。 三支一扶报考条件: 1.应届毕业生或者毕业两年内未就业的往届毕业生。 2.专科以上学历 3.遵纪守法,作风良好。 不同地区的考试要求不同&…

【AJAX框架】AJAX入门与axios的使用

文章目录 前言一、AJAX是干什么的?二、AJAX的安装2.1 CDN引入2.2 npm安装 三、基础使用3.1 CDN方式3.2 node方式 总结 前言 在现代Web开发中,异步JavaScript和XML(AJAX)已经成为不可或缺的技术之一。AJAX使得网页能够在不刷新整个…

【C++】std::string 转换成非const类型 char* 的三种方法记录

std::string 有两个方法:data() 和 c_str(),都是返回该字符串的const char类型,那如何转换成非const的char呢? 下面展示三种方法: 强转:char* char_test (char*)test.c_str();使用string的地址&#xff…

LeetCode 热题 100 | 双指针(下)

目录 42. 接雨水 1 方法一:我的方法 2 方法二:动态规划 3 方法三:双指针 菜鸟做题第一周,语言是 C 42. 接雨水 1 方法一:我的方法 Warning:这是我的智障做法,请勿模仿 我只能说它教会…

用Go plan9汇编实现斐波那契数列计算

斐波那契数列是一个满足递推关系的数列,如:1 1 2 3 5 8 ... 其前两项为1,第3项开始,每一项都是其前两项之和。 用Go实现一个简单的斐波那契计算逻辑 func fib(n int) int {if n 1 || n 2 {return 1}return fib(n-1) fib(n-2) …

MySQL---视图索引

表定义: 学生表:Student (Sno, Sname, Ssex , Sage, Sdept) 学号,姓名,性别,年龄,所在系 Sno为主键 课程表:Course (Cno, Cname,) 课程号,课程名 Cno为主键 学生选课表:S…

Redis设置开机自启动

1.新建一个系统服务文件 首先输入命令:vi /etc/systemd/system/redis.service 进入vim后粘贴下方代码,注意查看地址是否一致。 ExecStart后面接的是你的redis-server的安装位置和redis配置文件的目录 [Unit] Descriptionredis-server Afternetwork.ta…

Pycharm无法刷新远程解释器的框架: Can‘t get remote credentials for deployment server

在Pycharm上部署项目到远程服务器,有时候需要启动SSH会话,启动的时候发现没反应,且事件日志显示:无法刷新远程解释器的框架: Can’t get remote credentials for deployment server 观察pycharm界面最下边,发现“无默…

2024最新最全:【CISP系列考试大纲】零基础入门到精通

CISP(Certified Information Security Professional)中文全称注册信息安全专业人员认证,是经中国信息安全测评中心依据中编办批准开展“信息安全人员培训与资质认证”的职能,推出的代表国家对信息安全专业人员能力认可的证书。 C…

数据结构——排序

前言:哈喽小伙伴们好久不见,也是顺利的考完试迎来了寒假。众所周知,不怕同学是学霸,就怕学霸放寒假,假期身为弯道超车的最佳时间,我们定然是不能懒散的度过。 今天我们就一起来学习数据结构初阶的终章——…

仰暮计划|“学校四周无围墙,教室通风望天窗”

一九七二年高中毕业,我成了回乡青年。玉米地里抡过锄,当阳峪村烧白干,化肥厂内装卸车,深山修渠扛石块。一九七四年十月,村革委会主任找我谈话,“回乡二年来,你无论是政治思想改造,还…

Python爬虫从入门到入狱系列合集

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

ES框架详解

ES框架详解 1、全文检索的介绍 ​ 那么对于一般的公司,初期是没有那么多数据的,所以很多公司更倾向于使用传统的数据库:mysql;比如我们要查找关键字”传智播客“,那么查询的方式大概就是:select * from table where …

公平与公正对团队的好处

公平与公正对团队的好处 如何联系我 作者:鲁伟林 邮箱:thinking_fioa163.com或vlinyes163.com 版权声明:文章和记录为个人所有,如果转载或个人学习,需注明出处,不得用于商业盈利行为。 一、什么是公平…

网络文件共享ftp

一,存储类型 (一)三种存储类型介绍 直连式存储:Direct-Attached Storage,简称DAS 直连:硬盘加服务器 存储区域网络:Storage Area Network,简称SAN(可以使用空间&#…

Android-三方框架的源码

ARouter Arouter的整体思路是moduelA通过中间人ARouter把路由信息的存到仓库WareHouse;moduleB发起路由时,再通过中间人ARouter从仓库WareHouse取出路由信息,这要就实现了没有依赖的两者之间的跳转与通信。其中涉及Activity的跳转、服务prov…

tomcat与servlet

目录 一、Http服务器 二、tomcat 1、概念 2、tomcat解压缩文件 (1)bin文件夹 (2)conf文件夹 (3)logs (4)webapps 3、借助tomcat服务器访问网页 三、servlet 1、概念 2、s…

在微信公众号上怎么做报名链接_让你的活动报名与众不同

微信公众号报名链接:引领潮流,让你的活动报名与众不同 在这个信息爆炸的时代,微信早已成为我们生活中不可或缺的一部分。而微信公众号,更是成为了企业和个人传递信息、推广品牌的重要平台。如何在众多的微信公众号中脱颖而出&…

流量控制与熔断利器:Sentinel介绍

这是《百图解码支付系统设计与实现》专栏系列文章中的第(19)篇,也是流量控制系列的第(6)篇。点击上方关注,深入了解支付系统的方方面面。 本篇聊聊流量控制与熔断利器Sentinel,背后的原理&…

CVE-2024-0195 利用分析

1. 漏洞介绍 SpiderFlow爬虫平台项目中spider-flow-web\src\main\java\org\spiderflow\controller\FunctionController.java文件的FunctionService.saveFunction函数调用了saveFunction函数,该调用了自定义函数validScript,该函数中用户能够控制 functi…