增量预训练(Pretrain)样本拼接篇

news2024/11/24 9:27:52

增量预训练(Pretrain)样本拼接篇

一、Pretrain阶段,为什么需要拼接拼接?

为了提高pretrain效率、拓展LLM最大长度,随机将若干条短文本进行拼接是pretrain阶段常见手段。

二、有哪些拼接方式?

拼接方式一:Random Concatenate

随机将短文本 {examples_i} 拼接成 {examples_k} 以打满maxLen是pretrain的常见手段,该方法不仅能够降低padding占比、提高训练效率,还能使LLM具备更好的长文本处理能力。

但笔者认为,绝大多数情况下构成 Example 的多个 examples 彼此互不相关,无法提供有效的上下文信息,LLM自然也无法从拓宽的窗口中获得反馈。甚至,在语料较少、分布比较集中时,LLM 很有可能从多次、偶然的(因拼接导致的)噪音共现中拟合到错误的特征。当然,如果语料足够多、分布足够广,LLM仍能通过足够的contrastive,逐渐聚焦于 examples 本身而非其他无关examples 。此外,也有一些使用specialToken对 examples 进行软隔离的方案,但没有额外的正则手段时,使用specialToken进行隔离或许只是鸡生蛋、蛋生鸡的死循环。

拼接方式二:Random Concatenate + NoiseMask

为缓解2.1所述的无关 examples 间的噪音共现问题,笔者尝试过添加自定义attentionMask,使LLM在pretrain 时仅 focus on 当前 example ,经笔者测试,该方法在ICL few-shot上相比2.1(也即常规pretrain方法)有1.6%左右的提升。

def segment_causal_mask(input_ids, device, val=float("-inf")):
    bsz, tgt_len = input_ids.shape
    cum_lens = torch.arange(1, tgt_len+1, device=device).unsqueeze(0) * \
               torch.eq(input_ids, EosTokenId).int().to(device)
    mask = torch.zeros([bsz, tgt_len, tgt_len]).to(device)
    for i, _cum_lens in enumerate(cum_lens):
        for v in _cum_lens:  
             mask[i,v:,:v] = val
	return mask

但这种方式仍存在一个问题,相对位置编码(如ALIBI、ROPE)的token-wise相对位置信息会在attentionScore矩阵对应位置有所体现,如果施加了attentionMask,这部分相对位置信息经过softmax会被完全掩盖/误杀,也即LLM无法在BP过程中,从跨 examples 间获得反馈(不论是相对位置的反馈还是语义信息的反馈)。因此在不考虑外推性的前提下,这种pretrain方法仍是在短文本窗口内进行训练,没有真正意义上实现maxLen级别的长文本训练,只能起到提高训练效率的作用。

另外,尽管2.1中没有利用attentionMask,LLM是否能从无关 examples 构成的窗口中获取对(更远)相对位置的正向反馈仍然存疑(如果数据构成表现为远的都不相关,即便没有mask,LLM也倾向于忽略更远的tokens),或许这也是多数LLM在拓宽maxLen之后,长文本支持效果仍然差强人意的原因之一。

拼接方式三:Random Concatenate + Cluster

鉴于2.2存在的问题,能否既不施加attentionMask,也能让LLM不受跨 examples 干扰甚至还能获益的方法呢?一个直观的想法就是以实体、语义等维度对 {examples_i} 进行聚类,使构成同一个Example 的 examples 存在真实可靠的信息共现前提,从而LLM更加不容易从噪音共现中学偏,也能从pretrain中适应更加广泛全局的attention、从而具备更好的长文本处理能力。

笔者曾经尝试沿实体维度进行聚类,但发现了一个比较棘手的问题:信息重复,以及经过关键词、语义去重后仍难以避免的信息泄露(或者说二者本质相同,只是程度的分别)。在此情况下LLM有从memorize变成了copy的风险,或许这就是后来实验结论没有显著的原因。

本文作者提出的ICLM实际上也是一种类似的方法,即基于语义对 examples 进行聚合、拼接,因此笔者开始时也十分好奇作者如何妥善处理泄露问题。

拼接方式四:IN-CONTEXT PRETRAINING

作者在文中提出的pretrain方法,基本思想是在拼接时,利用语义相似度,优先将最相似的进行拼接,从而构成语义更加连贯流畅的上下文,基本流程如下图:

  1. 将 {examples_i} embedding化(作者使用了contriever);
  2. 基于余弦距离进行数据去重;
  3. 基于旅行商思想,不断串联最相关的 examples(每个 example 用完即扔,不会repeat);
  4. 基于拼接后的 {examples_k} 进行pretrain;
    在这里插入图片描述

作者在文中多次强调了数据去重的重要性,并经过消融实验验证了去重对ICLM的正向增益。相比实体,沿语义聚合的 {examples_i} 分布更加平缓,受泄露影响的风险更低;此外,分布更广泛的数据、更妥善的去重操作,或许也是ICLM能够有效的重要原因。

总结

本文讨论了在增量预训练(Pretrain)阶段,为了提高训练效率和拓展LLM最大长度,常见的样本拼接方法。介绍了四种拼接方式:Random Concatenate、Random Concatenate + NoiseMask、Random Concatenate + Cluster和IN-CONTEXT PRETRAINING。每种方法都有其优缺点,如Random Concatenate可能导致噪音共现,NoiseMask限制了相对位置信息的反馈,Cluster面临信息重复和泄露问题,而IN-CONTEXT PRETRAINING通过语义相似度拼接和数据去重,有效提高了长文本处理能力。通过这些方法,可以在有限的计算资源下高效训练和推理大模型。

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

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

相关文章

【AI最前线】DP双像素sensor相关的AI算法全集:深度估计、图像去模糊去雨去雾恢复、图像重建、自动对焦

Dual Pixel 简介 双像素是成像系统的感光元器件中单帧同时生成的图像:通过双像素可以实现:深度估计、图像去模糊去雨去雾恢复、图像重建 成像原理来源如上,也有遮罩等方式的pd生成,如图双像素视图可以看到光圈的不同一半&#x…

从零开始-VitePress 构建个人博客上传GitHub自动构建访问

从零开始-VitePress 构建个人博客上传GitHub自动构建访问 序言 VitePress 官网:VitePress 中文版 1. 什么是 VitePress VitePress 是一个静态站点生成器 (SSG),专为构建快速、以内容为中心的站点而设计。简而言之,VitePress 获取用 Markdown…

使用uniapp编写APP的文件上传

使用uniapp插件文件选择、文件上传组件(图片,视频,文件等) - DCloud 插件市场 实用效果: 缺陷是只能一个一个单独上传

【51单片机】红外遥控

学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 红外遥控硬件电路 NEC协议编码编程实例LCD1602显示Data红外遥控控制扇叶转速 红外遥控 红外遥控是利用红外光进行通信的设备&#…

【解决】Unity TMPro字体中文显示错误/不全问题

问题描述:字体变成方块 原因:字体资源所承载的长度有限 1.找一个中文字体放入Assets中 2.选中字体创建为TMPro 字体资源 3.选中创建好的字体资源(蓝色的大F) 在右边的属性中找到Atlas Width h和 Atlas Heigth,修改的大一点&…

深度学习:GPT-1的MindSpore实践

GPT-1简介 GPT-1(Generative Pre-trained Transformer)是2018年由Open AI提出的一个结合预训练和微调的用于解决文本理解和文本生成任务的模型。它的基础是Transformer架构,具有如下创新点: NLP领域的迁移学习:通过最…

CKA认证 | Day2 K8s内部监控与日志

第三章 Kubernetes监控与日志 1、查看集群资源状态 在 Kubernetes 集群中,查看集群资源状态和组件状态是非常重要的操作。以下是一些常用的命令和解释,帮助你更好地管理和监控 Kubernetes 集群。 1.1 查看master组件状态 Kubernetes 的 Master 组件包…

概念解读|K8s/容器云/裸金属/云原生...这些都有什么区别?

随着容器技术的日渐成熟,不少企业用户都对应用系统开展了容器化改造。而在容器基础架构层面,很多运维人员都更熟悉虚拟化环境,对“容器圈”的各种概念容易混淆:容器就是 Kubernetes 吗?容器云又是什么?容器…

JDBC编程---Java

目录 一、数据库编程的前置 二、Java的数据库编程----JDBC 1.概念 2.JDBC编程的优点 三.导入MySQL驱动包 四、JDBC编程的实战 1.创造数据源,并设置数据库所在的位置,三条固定写法 2.建立和数据库服务器之间的连接,连接好了后&#xff…

移动充储机器人“小奥”的多场景应用(上)

在当前现代化城市交通体系中,移动充储机器人“小奥”发挥着至关重要的作用。该机器人不仅是一个简单的设备,而是一个集成了高科技的移动充电站,为新能源汽车提供了一种前所未有的便捷充电解决方案。该机器人配备了先进的电池管理系统&#xf…

element dialog会隐藏body scroll 导致tab抖动 解决方案如下

element dialog会隐藏body scroll 导致tab抖动 解决方案如下 在dialog标签添加 :lockScroll"false"搞定

Android 功耗分析(底层篇)

最近在网上发现关于功耗分析系列的文章很少,介绍详细的更少,于是便想记录总结一下功耗分析的相关知识,有不对的地方希望大家多指出,互相学习。本系列分为底层篇和上层篇。 大概从基础知识,测试手法,以及案例…

Bugku CTF_Web——my-first-sqli

Bugku CTF_Web——my-first-sqli 进入靶场 随便输一个看看 点login没有任何回显 方法一: 上bp抓包 放到repeter测试 试试万能密码(靶机过期了重新开了个靶机) admin or 11--shellmates{SQLi_goeS_BrrRrRR}方法二: 拿包直接梭…

BUUCTF—Reverse—easyre(1)

非常简单的逆向 拿到exe文件先查下信息,是一个64位程序,没有加壳(壳是对代码的加密,起混淆保护的作用,一般用来阻止逆向)。 然后拖进IDA(64位)进行反汇编 打开以后就可以看到flag flag{this_Is_a_EaSyRe}

全面击破工程级复杂缓存难题

目录 一、走进业务中的缓存 (一)本地缓存 (二)分布式缓存 二、缓存更新模式分析 (一)Cache Aside Pattern(旁路缓存模式) 读操作流程 写操作流程 流程问题思考 问题1&#…

React基础知识一

写的东西太多了,照成csdn文档编辑器都开始卡顿了,所以分篇写。 1.安装React 需要安装下面三个包。 react:react核心包 react-dom:渲染需要用到的核心包 babel:将jsx语法转换成React代码的工具。(没使用jsx可以不装)1.1 在html中…

Vue3中使用:deep修改element-plus的样式无效怎么办?

前言:当我们用 vue3 :deep() 处理 elementui 中 el-dialog_body和el-dislog__header 的时候样式一直无法生效,遇到这种情况怎么办? 解决办法: 1.直接在 dialog 上面增加class 我试过,也不起作用,最后用这种…

鸿蒙进阶-状态管理

大家好啊,这里是鸿蒙开天组,今天我们来学习状态管理。 开始组件化开发之后,如何管理组件的状态会变得尤为重要,咱们接下来系统的学习一下这部分的内容 状态管理机制 在声明式UI编程框架中,UI是程序状态的运行结果&a…

leetcode:129. 求根节点到叶节点数字之和

给你一个二叉树的根节点 root ,树中每个节点都存放有一个 0 到 9 之间的数字。 每条从根节点到叶节点的路径都代表一个数字: 例如,从根节点到叶节点的路径 1 -> 2 -> 3 表示数字 123 。 计算从根节点到叶节点生成的 所有数字之和 。…

(南京观海微电子)——GH7006+BOE2.6_GV026WVQ-N81-1QP0_800RGB480_MIPI_LVDS_RGB原理介绍

1. 原理介绍 2. 代码 // Model - GV026WVQ-1QP0 // IC - GH7006 // Width - 800 // Height - 480 // REV: - V01 // DATA - 20240507 // INTERFACE- MIPI //"Vfp" value"16" /> //"…