LLM上下文长度扩展方案:YaRN

文章目录

  • I. 前言
  • II. NTK-by-parts
  • III. YaRN
  • IV. Dynamic NTK

在这里插入图片描述
题目: YaRN: Efficient Context Window Extension of Large Language Models
论文地址: YaRN: Efficient Context Window Extension of Large Language Models

I. 前言

在之前的两篇文章中分别介绍了上下文长度扩展的两种方案:

  1. LLM上下文长度扩展方案:Position Interpolation
  2. LLM上下文长度扩展方案:NTK-aware interpolation

其中PI线性缩放所有位置索引,并平等地对待每个维度;NTK-aware则实现了高频外推和低频内插,缓解了高频也就是低维的压力,使模型能够更好地区分不同位置间的精细区别。

为了引出上述两种方案存在的问题,这里先引入一个新的定义:给定RoPE中一个具体的维度 i i i,则这个维度的波长被定义为:
λ i = 2 π θ i = 2 π b − 2 ( i − 1 ) / d = 2 π b 2 ( i − 1 ) / d \lambda_i = \frac{2\pi}{\theta_i} = \frac{2 \pi}{b^{-2(i - 1) / d}} = 2\pi b^{2(i-1)/d} λi=θi2π=b2(i1)/d2π=2πb2(i1)/d基于波长公式,我们有如下结论:

  1. 波长描述了为了在维度 i i i处嵌入的旋转位置执行全旋转( 2 π 2\pi 2π)所需的token的长度。
  2. 维度越高波长越长。

在这里插入图片描述
从上图我们知道第 i i i个维度(两两一组)处二维复向量的旋转角度为 m θ i m\theta_i mθi,为了能够在该维度处执行全旋转,令 m θ i = 2 π m\theta_i = 2\pi mθi=2π,则 λ i = m \lambda_i = m λi=m所以波长描述了为了在维度 i i i处执行全旋转( 2 π 2\pi 2π)所需的token的长度

像PI这种类型的插值方案不关心波长的维数,我们将这些方法称为“盲”插值方法(blind interpolation),比如像PI和“NTK-aware”插值这样的blind interpolation方法中,我们面对所有RoPE隐藏维度没有做任何针对性的处理。而其他方法如这篇文章提出的YaRN,我们将其归类为“有针对性的”插值方法,即有对RoPE的不同维度做出不同处理。

II. NTK-by-parts

为了针对不同维度做出不同的处理,YaRN中首先定义了NTK-by-parts插值方法。具体来说,关于RoPE中不同维度的波长,有如下结论:

存在某些维度 i i i,其波长 λ i \lambda_i λi大于在预训练期间看到的最大上下文长度 L L L

从理论上来讲,RoPE是一种编码绝对位置的方法。然而,我们前面说过,波长描述了为了在维度 i i i处嵌入的旋转位置执行全旋转( 2 π 2\pi 2π)所需的token的长度,如果某些维度的波长大于上下文长度 L L L,这说明该维度无法执行全旋转。在这种情况下,由于维度在预训练期间至少不会完全旋转一次,如果我们选择第一个令牌作为基准,那么在预训练期间每隔一个令牌到它的距离是唯一的,神经网络可以用它来确定它的绝对位置信息。相反,如果某个维度波长小于 L L L,那该维度就执行了至少一次全旋转,我们就无法在这个维度描述绝对距离,只能描述相对位置信息。

考虑到上述观察,作者认为,不要对只编码相对位置信息的维度( λ i < L \lambda_i < L λi<L)进行内插破坏,因为它们对于模型区分附近令牌的相对顺序至关重要。同时,应该始终对仅编码绝对位置信息的维度( λ i > L \lambda_i > L λi>L)进行内插,因为较大的距离将超出之前模型能够编码的距离。因此,可以制定一种考虑以上所有因素的显式且有针对性的插补方法,即:

  1. 如果波长远小于 L L L,即编码相对位置的维度,不进行内插
  2. 如果波长等于或大于 L L L,即编码绝对位置的维度,应该进行内插以防止超出绝对位置的最大可编码范围
  3. 波长介于上述之间的维度,采用NTK-aware方法

为了定义上述不同内插策略的边界,引入了两个额外的参数 α \alpha α β \beta β,并将维度 i i i处的波长定义为:
r ( i ) = 2 π θ i = 2 π b − 2 i / d = 2 π b 2 i / d r(i)=\frac{2\pi}{\theta_i} = \frac{2 \pi}{b^{-2i / d}} = 2\pi b^{2i/d} r(i)=θi2π=b2i/d2π=2πb2i/d上述维度的取值从0开始。接着,定义一个分段函数如下:
γ ( r ) = { 0 if  r < α , 1 if  r > β , r − α β − α otherwise . \gamma(r)= \begin{cases} 0 & \text{if } r < \alpha, \\ 1 & \text{if } r > \beta, \\ \frac{r-\alpha}{\beta-\alpha} & \text{otherwise}. \end{cases} γ(r)= 01βαrαif r<α,if r>β,otherwise.基于上述分段函数,NTK-by-parts被定义为:
f p a r t s ( x m , m , θ ) = f ( x m , g ( m ) , h ( θ i ) ) g ( m ) = m h ( θ i ) = ( 1 − γ ( r ( i ) ) ) θ i S + γ ( r ( i ) ) θ i \begin{aligned} f_{parts}(x_m, m, \theta) &= f(x_m, g(m), h(\theta_i))\\ g(m)&=m\\ h(\theta_i)=(1 - &\gamma( r(i) ) )\frac{\theta_i}{S} + \gamma( r(i) )\theta_i \end{aligned} fparts(xm,m,θ)g(m)h(θi)=(1=f(xm,g(m),h(θi))=mγ(r(i)))Sθi+γ(r(i))θi在原文中,作者针对LLaMA系列模型给出的建议参数值为 α = 1 \alpha=1 α=1 β = 32 \beta=32 β=32。简单来说,如果当前维度的波长远小于上下文长度 L L L(即远小于L/32)时不内插,即 h ( θ i ) = θ i h(\theta_i)=\theta_i h(θi)=θi;当波长大于等于上下文长度L(即大于 α L \alpha L αL)时执行内插,此时有 h ( θ i ) = θ i S h(\theta_i)=\frac{\theta_i}{S} h(θi)=Sθi

笔者曾在Qwen2系列模型上尝试多个组合值,发现效果始终不如 α = 1 \alpha=1 α=1 β = 32 \beta=32 β=32,这说明两个参数具有较好的代表性。

III. YaRN

YaRN的作者注意到,无论数据样本或者扩展上下文窗口上的令牌位置怎么样,在计算自注意力公式中引入温度系数 t t t对困惑度ppl有着一致的影响。为此,将该公式改为:
softmax ( q m ⊤ k n t d ) \text{softmax}(\frac{q_m^{\top}k_n}{t\sqrt{d}}) softmax(td qmkn)为了实现上述公式,只需要将两个位置的旋转位置嵌入各自缩放为原来的 1 / t 1/\sqrt{t} 1/t 即可,而无需做其他任何操作。

最后,将NTK-by-parts技术和上面自注意力计算公式结合,便得到了YaRN。

作者在原文中基于实验给出了 1 / t 1/\sqrt{t} 1/t 的表达式:
1 t = 0.1 ln ⁡ S + 1 \sqrt{\frac{1}{t}}=0.1 \ln S + 1 t1 =0.1lnS+1笔者曾根据作者的方法对Qwen2系列模型的温度系数参数进行了拟合,发现效果远差于上式。因此建议使用YaRN扩展除LLaMA以外的模型时,也可以直接采用上式。

IV. Dynamic NTK

在真正使用模型时,我们无法保证每次输入的长度都是固定的。在这种情况下,有以下两种方法得到扩展因子 S S S

  1. 在整个推理周期中, S = L ′ L S=\frac{L^{'}}{L} S=LL是固定的,保证模型输入的最大长度不超过扩展后的长度 L ′ L^{'} L即可
  2. 根据每次输入的长度来动态调整 S S S,进而动态内插。扩展比被定义为 S = max ⁡ ( 1 , l ′ / L ) S=\max(1, l^{'} / L) S=max(1,l/L),其中 l ′ l^{'} l为当前输入的长度。

第一种方式的问题是,当序列长度小于L时,模型的性能可能会出现一些折扣,而当序列长度大于L时,模型的性能会退化。但通过像方式2那样进行动态缩放,它允许模型在达到训练的上下文限制时较为缓慢地退化性能,而不是骤降。

将上述动态缩放和NTK-aware插值相结合时,我们称之为动态NTK插值。

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

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

相关文章

RuoYi-后端管理项目入门篇1

目录 前提准备 下载若依前后端 Gitee 地址 准备环境 后端数据库导入 1 克隆完成 若依后端管理后端 Gitte 地址 :若依/RuoYi-Vue 2.1 创建Data Source数据源 2.2 填写好对应的数据库User 和 Password 点击Apply 2.3 新建一个Schema 2.4 填写对应数据库名称 这边演示写的…

【工具使用】adb下载和配置

【工具使用】adb下载和配置 一&#xff0c;简介二&#xff0c;操作步骤2.1 Bing搜索adb2.2 下载adb工具2.3 添加路径到环境变量 三&#xff0c;效果验证 一&#xff0c;简介 本文主要介绍如何下载adb并安装使用&#xff0c;供参考。 此时打开cmd&#xff0c;输入adb 会提示&am…

计算机网络——网络层(概念及IP地址划分)

目录 网络层概念 网络层向上层提供的两种服务 虚电路 网络提供数据报服务 虚电路服务与数据报服务的对比 网络层的两个层面 分组传送到路由器的运作 对网络层进行分层 网际协议IP 虚拟互联网络 IP地址 IP地址及其表示方法 IP地址的计算方式 IP地址的结构 …

每日一练,java

目录 描述示例 总结 描述 题目来自牛客网 •输入一个字符串&#xff0c;请按长度为8拆分每个输入字符串并进行输出&#xff1b; •长度不是8整数倍的字符串请在后面补数字0&#xff0c;空字符串不处理。 输入描述&#xff1a; 连续输入字符串(每个字符串长度小于等于100) 输…

用Java连接MySQL数据库的总结

✨个人主页&#xff1a; 不漫游-CSDN博客 前言 在日常开发中&#xff0c;使用Java连接MySQL数据库是一个常见的任务&#xff0c;涉及多个步骤。接着我就带着大家细细看来~ 一.下载.jar 包文件 1.什么是.jar 文件 通俗点讲就是一个压缩包&#xff0c;不过里面存放的都是由Java代…

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…

1.27、基于径向基神经网络的曲线拟合(matlab)

1、基于径向基神经网络的曲线拟合简介及原理 1)原理简介 基于径向基神经网络(Radial Basis Function Neural Network, RBFNN)的曲线拟合是一种常用的非线性拟合方法,通过在输入空间中使用径向基函数对数据进行处理,实现对非线性关系的拟合。 RBFNN的基本原理是将输入空…

笔记 2 :linux 0.11 中的重要的全局变量 (a)

通过对全局变量的了解&#xff0c;也有助于了解整个代码的逻辑。就跟学习类一样&#xff0c;了解类有哪些成员变量&#xff0c;也有助于了解类的成员函数的功能。 以下介绍全局变量的顺序&#xff0c;符合这两本书的讲解顺序&#xff1a; &#xff08;1&#xff09;内存初始化相…

Kafka 高并发设计之数据压缩与批量消息处理

《Kafka 高性能架构设计 7 大秘诀》专栏第 6 章。 压缩&#xff0c;是一种用时间换空间的 trade-off 思想&#xff0c;用 CPU 的时间去换磁盘或者网络 I/O 传输量&#xff0c;用较小的 CPU 开销来换取更具性价比的磁盘占用和更少的网络 I/O 传输。 Kafka 是一个高吞吐量、可扩展…

多文件编程:c/c++分文件写法(入门)

前言 一个 C 项目通常会采取 声明与定义分离 的方式进行编写&#xff0c;其基本遵循&#xff1a;头文件中写声明&#xff0c;源文件中写定义。 此外&#xff0c;为了区分头文件与源文件&#xff0c;会采用不同的文件后缀&#xff1a; .h: 头文件 .cpp: 源文件 (当然还有其他的…

写真图片视频打赏系统源码全开源无加密

这是一款开源的写真图片及视频打赏系统源码&#xff0c;顾名思义他可以做写真图片打赏站也可以做视频打赏站&#xff0c;支付对接了易支付&#xff0c;拥有独立代理后台&#xff0c;全部源码无加密&#xff0c;另外也可以配合付费进群使用。支付扣量、域名防洪这些基本的就不介…

小白如何学习软件开发

众所周知&#xff0c;软件开发技术是IT技术的核心技术&#xff0c;也是从事IT职业的技术学习首选&#xff0c;因此不少人会去学习&#xff0c;下面我给大家分享关于软件开发学习方法有哪些&#xff0c;欢迎阅读! 1、明确学习目的 学习编程能锻炼思维&#xff0c;使我们的逻辑思…

openlayers WebGL裁剪图层,双图层拼接显示

本篇介绍一下使用openlayers WebGL裁剪图层&#xff0c;双图层拼接显示 1 需求 WebGL裁剪图层&#xff0c;双图层拼接显示 2 分析 图层prerender和postrender事件的使用 WebGL scissor方法的使用 scissor方法指定了一个裁剪区域&#xff0c;用来将绘图区域限制在其限定的盒…

【LeetCode】2187. 完成旅途的最少时间

1. 题意 2. 分析 二分法有一个关键特征&#xff1a;如果答案answer满足题意&#xff0c;那么对于任何整数i&#xff0c;如果有i>answer&#xff0c;那么i也会是一个存在的解&#xff0c;只不过不是最优解。 本题想要找出一个达到 totalTrips 趟需要的最少时间成本t&#x…

FreeRTOS 入门 知识

什么是FreeRTOS FreeRTOS 是一个轻量级的实时操作系统&#xff08;RTOS&#xff09;&#xff0c;由 Richard Barry 在 2003 年开发&#xff0c;并且由亚马逊的 FreeRTOS 项目&#xff08;一个由 Amazon Web Services (AWS) 支持的开源项目&#xff09;进一步推动和发展。FreeR…

麒麟系统开发笔记(十四):在国产麒麟系统上编译libmodbus库、搭建基础开发环境和移植测试Demo

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140387947 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

Java--接口的定义与实现

1.Java的接口是一种约束 2.定义一些方法&#xff0c;让不同的人实现 3.方法都是 public abstract 4.常量都是public static final 5.接口不能被实例化&#xff1a; 接口中没有构造方法 6.接口可以多继承&#xff1a; 使用implements即可实现 7.必须要重写接口中的方法…

在家上网IP地址是固定的吗?

在数字化时代&#xff0c;互联网已成为我们日常生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都离不开网络的支持。然而&#xff0c;当我们在家中接入互联网时&#xff0c;可能会产生这样一个疑问&#xff1a;在家上网IP地址是固定的吗&#xff1f;下面一…

秋招Java后端开发冲刺——MyBatisPlus总结

一、 基本知识 1. 介绍 yBatis-Plus 是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上增加了大量功能和简化操作&#xff0c;以提高开发效率。 2. 特点 无侵入&#xff1a;只做增强不做改变&#xff0c;引入它不会对现有项目产生影响。依赖少&#xff1a;仅仅依赖 …

CV05_深度学习模块之间的缝合教学(1)

1.1 在哪里缝 测试文件&#xff1f;&#xff08;&#xff09; 训练文件&#xff1f;&#xff08;&#xff09; 模型文件&#xff1f;&#xff08;√&#xff09; 1.2 骨干网络与模块缝合 以Vision Transformer为例&#xff0c;模型文件里有很多类&#xff0c;我们只在最后…