一览大模型长文本能力

前言

如今的大模型被应用在各个场景,其中有些场景则需要模型能够支持处理较长文本的能力(比如8k甚至更长),其中已经有很多开源或者闭源模型具备该能力比如GPT4、Baichuan2-192K等等。

那关于LLM的长文本能力,目前业界通常都是怎么做的?有哪些技术点或者方向?今天我们就来总结一波,供大家快速全面了解。

当然也有一些关于LLM长文本的综述,感兴趣的小伙伴可以看看,比如:

《Advancing Transformer Architecture in Long-Context Large Language Models: A Comprehensive Survey》:https://arxiv.org/pdf/2311.12351.pdf

今天我们会从如下几个层面进行介绍::数据层面、模型层面、评估层面。每个层面挑几个还不错的工作浅浅学一下业界都是怎么做的。

全文涉及较多工作,建议收藏,方便后续查询细读或者下载数据

数据层面

  • LongAlpaca-12k

链接:https://huggingface.co/datasets/Yukang/LongAlpaca-12k

其是LongAlpaca-12k的一个工作,共收集了9k条长文本问答语料对,包含针对名著、论文、深度报道甚至财务报表的各类问答。

同时为了兼顾短文本能力,还从原有的Alpaca数据集中挑选了3k左右的短问答语料即最终构建了12k。

  • LongQLoRA

链接:https://huggingface.co/datasets/YeungNLP/LongQLoRA-Dataset

其是LongQLoRA的一个工作,其开源了两部分数据一部分是54k的预训练数据,一部分是39k的sft数据。

  • Ziya-Reader

链接:https://arxiv.org/abs/2311.09198

本篇paper主要贡献是如何构建长文本问答训练数据,专注用于多文档或单文档问答,虽然训练数据没有开源,但是做数据的方法我们可以学习一下

其主要借鉴cot的思路,在长文本问答领域也采用类cot,具体来说是:

(1)让模型先对问题进行复述,这使得模型在看了一段非常长的上下文信息后,也不会因为距离衰减的原因忘记原始的提问,因而在生成回复时,更加能够关注到问题。

(2)让模型预测正确上下文段落的索引下标,通过这样的方式可以让模型更加关注正确的上下文段落。

(3)预测最终答案

可以看到(1)(2)就是作者采用的cot

除此之外之外,还构建了一些负样本,比如没有正确上下文等等来增强模型的泛化性。

  • LongAlign

链接:https://huggingface.co/datasets/THUDM/LongAlign-10k

这篇工作主要聚焦做长文本的sft数据,具体来说作者从9个不同的来源收集长篇文章后使用Claude 2.1根据给定的长篇背景生成任务和答案。

模型层面

模型层面主要是探索外推性,即如何确保在模型推理阶段可以支持远远超过预训练的长度,其中限制外推的根本原因有两个即在inference阶段面对更长文本的时候,会出现更长的新位置编码(相比训练)以及历史上下文kv缓存过大这两个根本难题

为此目前的探索主要发力解决这两个难题:(1)设计位置编码;(2)动态设计局部注意力机制。下面我们逐个详细看看~

(1)设计位置编码

关于这部分推荐一篇博客:https://mp.weixin.qq.com/s/RtI95hu-ZLxGkdGuNIkERQ

大模型的位置编码发展史: 绝对位置编码 -> 相对位置编码 -> 旋转位置编码。

其中绝对编码的一个缺点是模型无法显式的感知两个token之间的相对位置,而后续的比如Sinusoidal相对位置编码则通过正余弦函数实现了相对位置编码,而旋转位置编码则实现了通过简单的周期性旋转将位置信息编入了进去

其中一个向量维度是d,越靠后的分组,它的旋转速度越慢,正弦函数的周期越大、频率越低。

所以我们简单总结一下旋转位置编码直观的性质,他的核心是通过旋转向量来将位置信息植入进来(非常巧妙,不需要其他什么复杂的改变,只需要旋转向量就可以),具体的旋转过程是:假设当前向量是d维,那么就分为d/2个组,每个组进行各自的周期旋转,越靠后的分组,它的旋转速度越慢,正弦函数的周期越大、频率越低

转化为数学一点为:向量q(维度为d)在位置m时, 它的第i组(总共d/2个组)分量的旋转弧度为$m\theta _{i} = m*base^{-2i/d} $

当训练长度为L时,模型训练的时候只见过 m θ i m\theta _{i} mθi [ 0 , ( L − 1 ) θ i ] [0,(L-1)\theta _{i}] [0,(L1)θi],当推理长度大于L时,模型不能cover新的旋转弧度也即无法插入新的位置信息了。

知道了卡点,下面我们来看几个相关的改进工作。

  • Position Interpolation

该方法为位置插值,思路也比较好的理解,既然超过L后的旋转模型因为没有见过就不能理解,那么我们就不超过,但是位置m还想扩大(比如一倍),那就可以通过缩小每个位置的旋转弧度(让向量旋转得慢一些),每个位置的旋转弧度变为原来的$\frac{L}{{L}’ } ,这样的话长度就可以扩大几倍。具体的为: ,这样的话长度就可以扩大几倍。具体的为: ,这样的话长度就可以扩大几倍。具体的为:\frac{mL\theta _{i}}{m{L}’ \theta _{i}} =m\frac{L}{{L}'} base^{-2i/d}$,这样的话即保证了没有超过训练的旋转范围,又插入更长或者更多的位置。

  • NTK-Aware Interpolation

该方法也是通过缩放,具体方法为如下:具体的是引入了一个缩放因子 α \alpha α

$m\theta _{i} = m*(base*\alpha )^{-2i/d} $

从数学角度看的话,Position Interpolation是将缩放因子放到了外面,而NTK是放到了里面(带有指数)。从直观的理论上看Position Interpolation方法是对向量的所有分组进行同等力度地缩小,而NTK对于较前的分组(高频分量)缩小幅度小,对于较后的分组(低频分量)缩小幅度大。

这样做的目的是靠前的分组,在训练中模型已经见过很多完整的旋转周期(因为旋转速度很快,这个性质之前已经介绍过了),位置信息得到了充分的训练,所以已经具有较强的外推能力。而靠后的分组,由于旋转的较慢,模型无法见到完整的旋转周期,或者见到的旋转周期很少,外推性能就很差,需要进行位置插值。

  • NTK-by-parts Interpolation

这个方法就更直接了,直接一刀切,对于高频分量就不缩小了(一点也不)即不进行插值,因为已经具备外推性,而对于低频分量由于训练没见过完整旋转周期所以外推性差,那就进行插值。相比于NTK-Aware Interpolation方法,这个方法更硬一些。

  • Dynamic NTK Interpolatio

NTK插值在超过训练长度L时表现还不错,但是在训练长度内反而表现较差,为此本方法实现了动态插值即当inference的长度l在训练长度L内就不进行插值,超过训练长度L才进行NTK-Aware Interpolation。

具体的缩小因子$\alpha 也是个动态值为: 也是个动态值为: 也是个动态值为:\alpha = (\frac{l}{L} )^{\frac{d}{d-2} } $,其中l随着不断生成不断累加,是个动态值。

(2)动态设计局部注意力机制

在生成每一个token的时候,其实核心都是在计算attention score,那么就需要查询之前token的kv值,为了提高效率,一般来说会把历史的kv值都缓冲起来,这样后续就可以快速用了,但问题是当随着长度增加时,内存必然OOM。

知道了卡点,下面我们来看几个相关的改进工作。

  • EFFICIENT STREAMING LANGUAGE MODELS WITH ATTENTION SINKS

论文链接:https://arxiv.org/pdf/2309.17453.pdf

(a) 就是常规inference,可以看到不论是复杂度还是效果性能随着长度增加,都会变得严峻。

(b) 就是常说的滑动窗口,核心方法就是每次只缓冲最近几个token,这样的话可以保证效率,但是当文本变长后,性能会下降。

© 就是不缓冲,每次重新计算最近几个token的,好处是保住了性能,但是效率也大大降低,因为每次都要重新计算

(d) 就是本文提出的方法,其通过观察发现大量的注意力分数被分配给初始token(即使这些token与语言建模任务没有相关性),基于此作者沿用(b)的方法,只不过每次除了用缓冲的最近几个token,额外再加上开头的几个token

通过(d)方法最终实现了无限外推,该工作的代码也已经开源,star非常多,很受欢迎。

  • LONGLORA: EFFICIENT FINE-TUNING OF LONG- CONTEXT LARGE LANGUAGE MODELS

论文地址:https://browse.arxiv.org/pdf/2309.12307.pdf

本篇主要的贡献在于开源了一个长文本训练数据(见上节)以及提出了一个shift short attention

可以看到就是先分组(各个组内进行self attention),只不过由于各个组由于之间没有交互信息,导致效果变成,于是作者也采用滑窗口机制来缓解一下,即使用半组长度来滑,本质上就是滑动窗口,只不过就是先分组再滑。

同时其支持lora训练,可快速训练适配部署自己的模型。

  • LONGQLORA: EFFICIENT AND EFFECTIVE METHOD TO EXTEND CONTEXT LENGTH OF LARGE LANGUAGE MODELS

论文地址:https://arxiv.org/pdf/2311.04879.pdf

其和上篇的LONGLORA大同小异,主要不同是替用qlora进行训练,更节省资源,同时另外一个贡献就是开源了一个长文本数据集(见上节)

  • Soaring from 4K to 400K: Extending LLM’s Context with Activation Beacon

论文地址:https://arxiv.org/pdf/2401.03462v1.pdf

这篇论文的思路也很朴素:大的思路也是采用滑动窗口,只不过在怎么动态保存之前上下文的思路上采用的是压缩思路,即前面信息既然太多,那就压一压。

具体的前面咱们介绍的EFFICIENT是通过每次滑的时候始终保留最前面几个token,而本篇的思路就是把每个区间的信息(图中蓝色)压缩成一个激活信标(图中绿色),而后面就用这些单个激活信标来代表整个区间的信息。

那激活信标怎么得到呢?作者也是采用了注意力机制,具体的探索了三种方法,一种是分段即每个信标只用自己区间的信息(图A),第二种是逐步分段即每个信标可以关注比其前身多一个子区间(图B),第三种是完全覆盖,其中所有信标都可以关注整个上下文(图C)。这三种方法的计算成本相同。最后作者发现第二种最好。

有了信标后,便可以将信标和来自普通信息一起使用滑动窗口进行流式处理即每个滑动窗口由过去上下文区间的m个信标和最新上下文区间的普通标记组成。

评估层面

在迭代模型长文本能力的过程中,需要一个量化指标来不断指导,目前业界已经有一些评估,一起来看看吧~

  • ZeroSCROLLS

论文链接:https://arxiv.org/pdf/2305.14196.pdf

其由十个自然语言任务构成,包括摘要、问答、聚合任务(给50条评论,让模型预测正面评论的百分比)等等

  • longeval

论文链接:https://lmsys.org/blog/2023-06-29-longchat/

该工作通过设计topic和lines长文本记忆能力来测试模型的长文本能力。

  • L-Eval

论文链接:https://arxiv.org/pdf/2307.11088.pdf

该工作从公开数据集收集数据,然后手动过滤和校正,重新标注得到。

  • LongBench

论文链接:https://arxiv.org/abs/2308.14508

该工作也是设计了单文档问答、多文档问答、摘要任务、Few-shot任务、合成任务、代码补全等等

  • LooGLE

论文链接:https://arxiv.org/pdf/2311.04939.pdf

该工作从科学论文、维基百科文章、电影和电视中收集样本,然后也是设计摘要等任务。

  • FinLongEval

论文链接:https://github.com/valuesimplex/FinLongEval

主要聚焦金融领域的长文本评测

总结

可以看到,在助力LLM长文本能力的道路上目前有两个大的方向在发力:

(1)从数据入手即构建做高质量长文本数据,这非常重要,因为有了数据才能训练,其中长文本预训练数据相对来说比较好找,但是sft数据就比较难了,并不是说强行cat起来就是有效长文本,比如把多个单轮文本cat到8k,但是这是一个伪多轮,对模型学习全局信息帮助很小;关于怎么构建高质量的长文本数据尤其是中文领域的数据还需要更多的探索,可以借鉴长文本评测任务来汲取灵感进行构建训练数据。

(2)从模型层面入手进行外推,目前一个是探索位置编码,另外一个就是探索怎么缓解kv缓冲也即两个核心问题:第一就是寻找或设计合适的位置编码;第二是设计局部注意力机制。其中第一个大的方向都是缩放即通过缩放将旋转范围依然缩放到和训练一致但实现了插入了更多的或者更长的位置,第二个大的方向基本都是探索怎么把之前的信息进行动态压缩,更进一步这里的动态其实就是滑动,只不过在滑动上进行各种不同的逻辑。将两个技术点(本来就是解决不同问题的)合理的结合也是很重要的。

总的来说,首先尽可能的收集准备好高质量的长文本训练数据,然后在当前资源下训练到最大长度,最后在推理时可以借助各种外推手段进行拓展。

关注

欢迎关注,下期再见啦~

知乎,csdn,github,微信公众号

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32 寄存器操作 GPIO 与下降沿中断

一、如何使用stm32寄存器点灯? 1.1 寄存器映射表 寄存器本质就是一个开关,当我们把芯片寄存器配置指定的状态时即可使用芯片的硬件能力。 寄存器映射表则是开关的地址说明。对于我们希望点亮 GPIO_B 的一个灯来说,需要关注以下的两个寄存器…

leetcode hot100不同路径

本题可以采用动态规划来解决。还是按照五部曲来做 确定dp数组:dp[i][j]表示走到(i,j)有多少种路径 确定递推公式:我们这里,只有两个移动方向,比如说我移动到(i,j&#x…

【机器学习】数据清洗之识别重复点

🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:机器学习 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步…

React入门到精通:掌握前端开发的必备技能!

介绍:React是一个由Facebook开发和维护的JavaScript库,用于构建用户界面,特别是用于构建单页应用程序和移动应用程序的用户界面。以下是对React的详细介绍: 虚拟DOM:React通过使用虚拟DOM(Document Object …

Rust 数据结构与算法:3栈:用栈实现符号匹配

1、符号匹配 如: (56)(78)/(43)、{ { ( [ ] [ ])}}、(ab)(c*d)func() 等各类语句的符号匹配。 这里我们关注的不是数字而是括号,因为括号更改了操作优先级,限定了语言的语义,这是非常重要的。如果括号不完整,那么整个…

C语言指针(初阶)

文章目录 1:内存与地址1.1内存1.2:如何理解编址 2:指针变量与地址2.1:指针变量与解引用操作符2.1.1:指针变量2.1.2:如何拆解指针类型2.1.3:解引用操作符 2.2:指针变量的大小 3:指针变量类型的意义代码1解引用修改前解引用修改后 代码2解引用修改前解引用修改后 4:const修饰指针…

RSIC-V“一芯”学习笔记(三)——读后感以及部分PA0工作

文章目录 一、别像弱智一样提问二、提问的智慧三、安装linux以及配置问题3.1 关于问题配置 一、别像弱智一样提问 提问前,应该清晰问自己几个问题,1. 是否尝试了在搜索引擎进行搜索过2. 相关的手册和文档是否看了3. 找找有没有常见的问题文档&#xff0…

Android Jetpack:提高开发效率的终极工具集

Android Jetpack:提高开发效率的终极工具集 1. 引言 Android Jetpack是一套为Android应用程序开发提供帮助的工具集。它旨在简化开发流程,提高开发效率,并提供一致的用户体验。无论您是新手还是经验丰富的开发者,Jetpack都可以为…

命令行参数和环境变量

命令行参数 命令行参数是在用户在命令行中输入命令时,跟随命令一起输入的一些附加信息。这些参数可以用来配置命令的行为或传递一些数据给命令。 让同样的程序在不同的命令行参数下运行出不同的结果! 将这些命令和参数可以传给 main 函数生&#xff0…

Junit5基础教程

文章目录 一,导入依赖二,基本功能一、常用断言二、执行顺序和常用注解1、通过BeforeAll类的注解来保证顺序2、通过order注解来保证执行顺序 三、依赖测试四、参数化测试五、测试套件SelectPackages、IncludePackages、SelectClasses、IncludeTags等注解的…

苹果手机充电充不进去怎么办?这里有你想要的一些故障排除技巧

当你的iPhone插上充电器或将其放在无线充电器上充电时,稍后再检查发现它没有充电,怎么办呢?可能的原因不少。让我们来看看一些最常见的iPhone充电问题,以及你能做些什么。 常规故障排除提示 故障排除中最基本的技术之一是用已知的好的相同组件代替不起作用的组件,如把你的…

【复现】cellinx摄像设备 未授权漏洞_50

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一: 四.修复建议: 五. 搜索语法: 六.免责声明 一.概述 cellinx是一家韩国的摄像设备 二 .漏洞影响 通过未授权访问可以创建用户进入后台,可能造成系统功能破坏。 三.漏洞复…

python工具方法 45 基于ffmpeg以面向对象多线程的方式实现实时推流

1、视频推流 参考基于ffmpeg模拟监控摄像头输出rtsp视频流并opencv播放 实现视频流的推流。 其基本操作就是,安装视频流推流服务器,ffmpeg,准备好要推流的视频。 命令如下所示:ffmpeg -re -stream_loop -1 -i 风景视频素材分享.flv -c copy -f rtsp rtsp://127.0.0.1:554/…

挑战杯 python的搜索引擎系统设计与实现

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 python的搜索引擎系统设计与实现 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:5分创新点:3分 该项目较为新颖&#xff…

租赁香港服务器多少钱一个月?24元

阿里云香港服务器2核1G、30M带宽、40GB ESSD系统盘优惠价格24元/月,288元一年,每月流量1024GB,多配置可选,官方优惠活动入口 https://t.aliyun.com/U/bLynLC 阿里云服务器网aliyunfuwuqi.com分享阿里云香港服务器优惠活动、详细配…

图像识别基础之模板匹配

principle 图像匹配 本质:图像的相似度很高(矩阵的相似度很高) code /*\brief 我的图像匹配函数,获取差方和均值最小的矩阵作为结果\param srcPicFile:用以匹配的图像文件\param templatePicFile:模板图像文件\param destPicFile:输出的检测结果文件…

【方法】如何打开带密码的RAR分卷压缩文件?

RAR分卷文件是一种特殊的RAR压缩文件格式,也就是将文件压缩成多个相同大小的压缩包,可以更方便传输。那如果收到了带有密码的RAR分卷压缩文件,要如何打开呢? 无论RAR分卷压缩文件是否设置了密码保护,在打开或者解压分…

数据结构与算法:双向链表

朋友们大家好啊,在上节完成单链表的讲解后,我们本篇文章来对带头循环双向链表进行讲解 双向链表 双向链表、头节点和循环的介绍构建双向链表节点的构建初始化双向循环链表(空链表)销毁双向链表 链表的打印双向链表头尾的插与删尾插…

基于Java (spring-boot)的房屋租赁管理系统

一、项目介绍 基于Java (spring-boot)的房屋租赁管理系统功能:登录、管理员、租客、公告信息管理、房屋信息管理、用户信息管理、租金信息管理、故障信息管理、房屋出租信息详情、个人信息、修改密码、等等等。 适用人群:适合小白、大学生、毕业设计、课…

【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系

欢迎来CILMY23的博客喔,本期系列为【C语言】指针的进阶篇,深入理解指针和数组,函数之间的关系,图文讲解其他指针类型以及指针和数组,函数之间的关系,带大家更深刻理解指针,以及数组指针&#xf…