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

news2024/11/15 12:50:47

来源:网络

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.coloradmin.cn/o/1398390.html

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

相关文章

STM32407用汇顶的GT911触摸芯片调试实盘

这个配置很关键 代码 #include "stm32f4xx.h" #include "GT9147.h" #include "Touch.h" #include "C_Touch_I2C.h" #include "usart.h" #include "delay.h" #include "LCD.h" #incl…

HarmonyOS 页面跳转控制整个界面的转场动画

好 本文 我们来说 页面间的转场动画 就是 第一个界面到另一个界面 第一个界面的退场和第二个界面的进场效果 首先 我这里 创建了两个页面文件 Index.ets和AppView.ets index组件 编写代码如下 import router from "ohos.router" Entry Component struct Index {b…

视频监控需求记录

记录一下最近要做的需求,我个人任务还是稍微比较复杂的 需求:需要实现一个视频实时监控、视频回放、视频设备管理,以上都是与组织架构有关 大概的界面长这个样子 听着需求好像很简单,但是~我们需要在一个界面上显示两个厂商的视…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟,引脚,将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

我们应该了解的⽤户画像

当我们谈⽤户画像时,到底在谈什么 对于互联⽹公司来说,企业的增⻓、内容、活动、产品等⼯作基本上都是围绕着“⽤户”来做的,可以说都是在做“⽤户运营”这个⼯作,⽽⽤户画像是⽤户运营⼯作中⾮常重要的⼀环 ⽤户画像的主要特征是…

Linux命令手册

简介 Multics(大而全)项目失败,吸取教训启动Unix(小而精),Linus Benedict Torvalds受Unix启发开发初始版本Linux内核,Git也由其开发,目的是为了更好的管理Linux内核开发。Unix是商业…

Windows如何部署TortoiseSVN客户端

文章目录 前言1. TortoiseSVN 客户端下载安装2. 创建检出文件夹3. 创建与提交文件4. 公网访问测试 前言 TortoiseSVN是一个开源的版本控制系统,它与Apache Subversion(SVN)集成在一起,提供了一个用户友好的界面,方便用…

专业130+总分380+哈尔滨工程大学810信号与系统考研经验水声电子信息与通信

今年专业课810信号与系统130,总分380顺利考上哈尔滨工程大学,一年的努力终于换来最后的录取,期中复习有得有失,以下总结一下自己的复习经历,希望对大家有帮助,天道酬勤,加油!专业课&…

Java找二叉树的公共祖先

描述: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节…

[AI]文心一言出圈的同时,NLP处理下的ChatGPT-4.5最新资讯

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【C语言】编译和链接深度剖析

文章目录 📝前言🌠 翻译环境和运行环境🌉翻译环境 🌠预处理(预编译)🌉编译 🌠词法分析🌠语法分析 🌉语义分析🌠汇编 🌉 链接&#x1f…

动态闪图怎么在线合成?仅需三秒在线合成

GIF闪图是一种常见的动态图像格式,它由多个静态图像帧组成,以连续的方式播放,形成动画效果。每个图像帧都可以包含不同的颜色和透明度,因此GIF闪图通常用于展示简单的动画、表情符号或者短视频片段。这种格式在网络上广泛应用&…

论rtp协议的重要性

rtp ps流工具 rtp 协议,实时传输协议,为什么这么重要,可以这么说,几乎所有的标准协议都是国外创造的,感叹一下,例如rtsp协议,sip协议,webrtc,都是以rtp协议为基础&#…

C++中的static(静态)

2014年1月19日 内容整理自The Cherno:C系列 2014年1月20日 内容整理自《程序设计教程:用C语言编程 第三版》 陈家骏 郑滔 -----------------------------------------------------------------------------------------------------------------------------…

【RT-DETR有效改进】利用MobileNetV3替换Backbone(轻量化网络结构,提点)

前言 大家好,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持ResNet32、ResNet101和PP…

TEE2024大湾区进出口贸易博览会

TEE2024大湾区进出口贸易博览会 INTE 2024RNATIONAL TRADE E-COMMERCE EXPO 时间:2024年08月11--13日 地点:深圳福田会展中心 联合主办: 深圳市电子商务协会 深圳市跨境电子商务行业发展促进会 广东进出口商会 广东省国牌出海电子商务…

根据IP查找城市 - 华为OD统一考试

OD统一考试 题解: Java / Python / C 题目描述 某业务需要根据终端的IP地址获取该终端归属的城市,可以根据公开的IP地址池信息查询归属城市。 地址池格式如下: 城市名起始IP,结束IP 起始和结束地址按照英文逗号分隔&#xff0…

链表回文结构

链表回文结构 编写一个函数,检查输入的链表是否是回文的。 示例 1: 输入: 1->2 输出: false 示例 2: 输入: 1->2->2->1 输出: true 链表的回文结构,应该先找到中间节…

yum配置文件及NFS共享

一 yum配置文件及命令 1 /etc/yum.conf //主配置文件 2 /etc/yum.repos.d/*.repo //yum仓库文件位置 写错一个字母就不行,可以ping www.google.com 测试网络 3 /var/log/yum.log //日志文件 二 yum命令 1 [rootlocalhost ~…

Python项目——计算器(PySide6+Pyinstaller)

1、介绍 使用python编写一个计算器,可以实现基本的运算。【注】该项目最终还有一些细小的bug没有完善,例如符号可以一直输入。 2、实现 使用pyCharm创建一个新的项目。 2.1、设计UI 使用Qt designer设计一个UI界面,保存ui文件&#xff0…