【LLM 论文】OpenAI 基于对比学习微调 LLM 得到嵌入模型

news2024/11/27 2:39:34

论文:Text and Code Embeddings by Contrastive Pre-Training
⭐⭐⭐⭐
OpenAI

一、论文速读

这篇论文基于大型生成式 LLM 通过对比学习来微调得到一个高质量的 text 和 code 的 embedding 模型。

训练数据的格式:是一堆 ( x i , y i ) (x_i, y_i) (xi,yi) 形式的 positive pairs,这些 pairs 的 x i x_i xi y i y_i yi 存在着语义相似性或者上下文相关性。在具体训练时,使用 in-batch negatives 的方法来构造出 negative pairs。

在训练 text embedding model 和训练 code embedding model 时,所使用的数据不一样:

  • 训练 text embedding model 时,互联网上相邻 piece 的文本就作为 positive pair
  • 训练 code embedding model 时,function 上方的 docstring 与其实现作为 positive pair ( t e x t , c o d e ) (text, code) (text,code)

Embedding Model:这个 encoder 将一个 sentence 转为一个 vector representation:

具体做法是:对于输入 sentence input x x x,将其前后拼接上 [SOS] 和 [EOS] 两个特殊 token,之后输入给 LLM,然后将 [EOS] token 的 hidden state 作为编码后的 embedding 结果。

相似度计算方式:将 x 和 y 分别输入给 encoder 得到 representation,然后计算 cosine 相似度即可:

该工作训练得到的模型,可以为 text 和 code 编码出高质量的 representation,其 embedding 效果在文本 classification、sentence similarity、semantic search 等实验中都表现出不错的效果。

二、模型的训练

模型的推理过程较为简单直接,这里重点详细介绍一下他的训练过程。

前面说了训练数据的格式,按照上面所述,我们可以得到一批用于训练模型的数据,然后将其划分为多个 mini-batch 对模型迭代训练微调。

每一个 mini-batch 由 M M M 个 positive pairs,在使用它们的训练过程中,首先使用 in-batch negatives 的方法可以得到这个 batch 的 negative pairs,然后针对每一个 pair,将 x 与 y 输入给 encoder 得到其向量表示,然后计算这个 pair 的 logit 值:

其中 τ \tau τ 是一个可训练的温度参数,用于调整相似度的缩放。

这样,可以计算出 M × M M \times M M×M 个 logits 组成一个 logit matrix,其中对角线上的元素是 positive pairs 的 logits,其余是负样本的 logits,然后针对 matrix 的每一行每一列计算 cross-entropy 损失,这样的损失是希望模型让正样本的 logit 最大化,让负样本的 logit 最小化,这里计算损失的伪代码如下:

可以看到, l r l_r lr l c l_c lc 分别是行方向和列方向上计算的交叉熵损失,然后取它们的平均值作为最终的损失函数值,它衡量了区分 positive pairs 和 negative pairs 方面的表现

通过最小化这个损失函数,模型学习到的嵌入表示能够捕捉输入样本之间的语义相似性,从而在不同的下游任务中发挥作用。

关于 cross entropy 损失,如果忘了可以参考相关资料,从而理解这里为什么用这个函数。

三、实验

论文使用 GPT-3 来初始化 text embedding model 的基座模型,使用 Codex 来初始化 code embedding model 的基座模型,分别对两个模型进行了训练。

论文做了很多实验,这里选取了在文本检索任务上做的实验结果:

其中,cpt-text 就是本论文基于 GPT-3 微调得到的 text embedding model,可以看到:

  • 模型越大(参数越多),其效果可以越好
  • 该模型的效果远远超过了无监督的检索模型,其中 cpt-text XL 版本的表现已经可以与微调的 SOTA 模型相比较了

四、分析

4.1 Batch Size 的影响

论文的消融实验研究了 batch size 对模型训练的影响。

已经公认的是,由于对比学习的机制,当 batch size 越大时,学习难度就越高,使得模型可以学得更好。论文的实验也证明了这一点:

4.2 训练时长的影响

一般认为,训练越久,效果越好,后面会趋于稳定。但是该论文的实验显示,训练越久,在检索和分类任务上效果越好,但是对于句子相似度任务来说,却恰好相反

这其实涉及到一个很重要的讨论点:训练 embedding 时,检索任务和句子相似度任务是存在冲突的

这两个任务看似类似,都可以基于 sentence embedding 完成,但两种却是属于两个研究方向,各有自己侧重的研究 topic。从本质上,这两个任务就是存在冲突的,比如一个句子及其否定可以被相似度任务认为是相关的,但在句子相似度任务中则却应该被认为是“相似-相似”的。

在本论文的 model checkpoint 评估时,也是给检索任务和分类任务赋予了更高的重要性,因为它们往往与现实世界的应用相关联,而句子相似度任务则没那么重要。

总结

这篇论文表明,基于 GPT 系列的 LLM,在足够大的批处理的无监督数据上进行对比预训练,可以获得高质量的文本和代码的 embedding 表示,并可以应用于其他的下游任务中得到不错的表现。

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

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

相关文章

前端nginx(windows操作系统)学习配置开发验证

Nginx概述 Nginx 作为负载均衡在 Linux 系统上具备很好的并发性能,并且占用极小的内存。但是在 Windows 系统上并不支撑较高并发,所以在Windows系统上选用Nginx作为负载均衡,需要考虑并发情况。 若并发需求低于 300,部署集群仅以…

Spring的基本应用

概述:Spring是由Rod Johnson组织开发的一个分层的java SE/EE一站式的轻量级开源框架,以IOC(控制反转)和AOP(面向切面)为核心,的开发模式。 注:喜欢的朋友可以关注公众号“JAVA学习课堂”系统学习相关技术&a…

ElasticSearch知识点汇总

1、ES中的​​​​​​​倒排索引是什么。 倒排索引,是通过分词策略,形成了词和文章的映射关系表,这种词典映射表即为倒排索引 2、ES是如何实现master选举的。 选举过程主要包括以下几个步骤: 心跳检测: 每个节点…

【消息队列】MQ介绍

MQ MQ(MessageQueue),中文是消息队列,就是存放消息的队列,也是下面提到的事件驱动架构中的Broker 同步调用的优点: 时效性强,可以立即得到结果 同步调用的问题: 耦合度高性能和吞吐…

基于 llama2 的提示词工程案例2

优化大型语言模型(LLMs) 优化大型语言模型(LLMs)中的提示词(prompts)是提高模型性能和输出相关性的重要手段。以下是一些优化提示词的方向: 明确性:确保提示词清晰明确,…

【Java 刷题记录】前缀和

前缀和 25. 一维前缀和 示例1: 输入: 3 2 1 2 4 1 2 2 3输出: 3 6import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(S…

【强化学习】公平性Actor-Critic算法

Bringing Fairness to Actor-Critic Reinforcement Learning for Network Utility Optimization 阅读笔记 Problem FormulationLearning AlgorithmLearning with Multiplicative-Adjusted RewardsSolving Fairness Utility Optimization Evaluations 在网络优化问题中&#xff…

PyGame 文字显示问题及解决方法

在 Pygame 中显示文字时可能会遇到一些问题,例如文字显示不清晰、字体不正确或者文字位置不准确等。以下是一些常见的问题及其解决方法,具体情况可以看看情况。 1、问题背景 一位用户在使用 PyGame 库进行游戏开发时,遇到了一个问题&#xf…

[AI OpenAI-doc] 迁移指南 Beta

我们已经改变了助手 API 在 beta 的 v1 版本和 v2 版本之间工具和文件的工作方式。今天,通过 API,两个 beta 版本仍然可以访问,但我们建议尽快迁移到我们 API 的最新版本。我们将在 2024 年底之前废弃 beta 的 v1 版本。 如果您今天不使用助手…

套管外径测量仪 多尺寸型号 规格全可定制

套管(bushing)是一种将带电导体引入电气设备或穿过墙壁的一种绝缘装置。前者称为电器套管,后者称为穿墙套管。套管通常用在建筑地下室,是用来保护管道或者方便管道安装的铁圈。套管的分类有刚性套管、柔性防水套管、钢管套管及铁皮…

SpringBoot中HandlerInterceptor拦截器的构建详细教程

作用范围:拦截器主要作用于Spring MVC的DispatcherServlet处理流程中,针对进入Controller层的请求进行拦截处理。它基于Java的反射机制,通过AOP(面向切面编程)的思想实现,因此它能够访问Spring容器中的Bean…

Python-VBA函数之旅-property函数

目录 一、property函数的常见应用场景 二、property函数使用注意事项 三、如何用好property函数? 1、property函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页:神奇夜光杯-CSDN博客 一、prop…

【北京迅为】《iTOP-3588开发板源码编译手册》-第4章 Android12/Linux设备树简介

RK3588是一款低功耗、高性能的处理器,适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用,RK3588支持8K视频编解码,内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

4.【Orangepi Zero2】Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90)

Linux定时器(signal、setitimer),软件PWM驱动舵机(SG90) signalsetitimer示例 软件PWM驱动舵机(SG90) signal 详情请看Linux 3.进程间通信(shmget shmat shmdt shmctl 共享内存、si…

帆软报表实现填报报表

我们拿emp表举例 登记信息表 设计一个报表实现对emp表员工的登记 (emp表为ORACLE自带用户scott下的一个表) 首先,我们设计好填报界面,新建一个普通报表,将emp表中需要的输入一一回应填写进表中。 如下图所示&#xf…

代码随想录Day 40|Leetcode|Python|139.单词拆分 ● 关于多重背包,你该了解这些! ● 背包问题总结篇!

139.单词拆分 给你一个字符串 s 和一个字符串列表 wordDict 作为字典。如果可以利用字典中出现的一个或多个单词拼接出 s 则返回 true。 注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。 解题思路: 确定dp数组含义…

如何去官网下载windows10操作系统iso镜像

文章目录 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去二、然后按图示一步步点进去三、点击下载工具这个工具会帮你生成windows操作系统iso文件四、下载好后一步步按图示要求成功操作 一、先从微软中国官网https://www.microsoft.com/zh-cn/进去 二、然后按图示一…

【牛客】排列计算

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 如果直接涂色来计算单点权重&#xff0c;2e5*2e5必然超时。 所以用差分进行优化。 3. 代码实现 #include<bits/stdc.h> using name…

【工作记录】openjdk-22基础镜像的构建

背景 近期使用到的框架底层都用的是springboot3.0&#xff0c;要求jdk版本在17甚至更高。 于是决定制作一个基于openjdk22的基础镜像&#xff0c;本文对这一过程进行记录。 作为记录的同时也希望能够帮助到需要的朋友。 期望效果 容器内可以正常使用java相关命令且版本是2…

vm虚拟机安装网络适配器驱动卡死/无响应/无限等待状态

大部分原因都是以前的vm没有卸载干净所导致的&#xff0c;只需要使用CCleaner清楚干净就好 使用控制面板里的卸载把VM卸载干净 使用CCleaner软件删除干净注册表&#xff0c;这个软件百度很容易找到&#xff0c;只有十兆左右 打开下载好的软件&#xff0c;不需要注册码&#xff…