LLM上下文长度扩展方案:NTK-aware interpolation

文章目录

  • 1. Position Interpolation存在的问题
    • 高频信息损失
  • NTK-aware Scaled RoPE:高频外推+低频内插
    • 进制编码
    • 代码实现

1. Position Interpolation存在的问题

在之前的一篇文章中讲了位置内插方案:LLM上下文长度扩展方案:Position Interpolation。PI本质上是一种线性内插,即把每个位置均匀压缩为之前的 1 S \frac{1}{S} S1,其中 S = L ′ L S=\frac{L^{'}}{L} S=LL为扩展后长度和原始长度的比值。

在RoPE中,针对 m m m位置的向量 x m x_m xm,其变换方式为:
在这里插入图片描述
其中 θ i = b − 2 ( i − 1 ) / d ( b = 10000 ,   i = 1 , 2 , 3 , . . . , d / 2 ) \theta_i = b^{-2(i - 1) / d}(b=10000,~i=1,2,3,...,d/2) θi=b2(i1)/d(b=10000, i=1,2,3,...,d/2)。PI将上式中所有的 m m m替换成了 m S \frac{m}{S} Sm,因此造成了每两个维度形成的复数在复平面上旋转的角度变成了原来的 1 S \frac{1}{S} S1

高频信息损失

在RoPE中,周期和频率有如下关系:

当base和位置m固定时,维度 i ↓ i \downarrow i,复向量旋转的角度越大,转满一圈的耗时越短,即周期越短,频率越高
当维度 i i i和位置m固定时,base越大, θ i ↓ \theta_i \downarrow θi,转满一圈的耗时越长,即周期越长,频率越低

我们主要研究第一种情况,这种情况可以用八个字概括:低维高频、高维低频。

接着,我们可以发现PI的缩放是平等对待地对待所有维度,即高频旋转角度缩小的倍数和低频旋转角度缩小的倍数是一样的,没有考虑针对不同维度作出不同的缩放。这可能会造成以下问题:对于高频低维度,插值后变得异常拥挤

造成高频低维内插后异常拥挤的原因是我们有 θ i = b − 2 ( i − 1 ) / d ( b = 10000 ,   i = 1 , 2 , 3 , . . . , d / 2 ) \theta_i = b^{-2(i - 1) / d}(b=10000,~i=1,2,3,...,d/2) θi=b2(i1)/d(b=10000, i=1,2,3,...,d/2),旋转角度随着维度 i ↑ i \uparrow i呈现指数级别减小。由于旋转角度随着维度 i ↑ i \uparrow i呈现指数级别减小,我们可以假设从低维到高维的旋转角度依次为1000 100 10 1 0.1,将旋转角度都除以缩放因子 S = 4 S=4 S=4,那么每个维度的旋转角度将依次变为250、25、2.5 、0.25 和 0.025。相比内插之前,我们可以发现维度间变得更拥挤了(差值变小)。

原本在低维度上,旋转角度较大,意味着这些维度上的信号变化非常迅速,能够精细地区分相邻位置,虽然不同维度间的差异都减小了 4 倍,但是高频低维由于量级比较大,所以相比之前降低更多,对用低维区分不同位置间的能力影响更大,显得“更拥挤”。而高维度由于本来旋转角度就很小,这种变化对高维度区分不同位置的能力影响相对较小,不会立即表现为“更拥挤”。因此,PI会在扩展倍数特别大时显著降低位置编码区分不同位置的能力,这种现象称之为高频信息的损失。

NTK-aware Scaled RoPE:高频外推+低频内插

为了解决PI中出现的问题,NTK-aware提出的改进策略为:高频外推和低频内插。即:不是将RoPE的每个维度平均缩放一个因子 S S S,而是通过减少高频的缩放和增加低频的缩放将插值压力分散到多个维度。

在讲NTK-aware之前,为了将PI和其NTK-aware,或者更广义上的多种内插方法联系起来,我们定义了如下表达式:
f ′ ( x m , m , θ ) = f ( x m , g ( m ) , h ( θ ) ) \begin{equation} f^{'}(x_m, m, \theta) = f(x_m, g(m), h(\theta)) \end{equation} f(xm,m,θ)=f(xm,g(m),h(θ))其中第 i i i个维度有 θ i = b − 2 ( i − 1 ) / d ( b = 10000 ,   i = 1 , 2 , 3 , . . . , d / 2 ) \theta_i = b^{-2(i - 1) / d}(b=10000,~i=1,2,3,...,d/2) θi=b2(i1)/d(b=10000, i=1,2,3,...,d/2)。上式从位置和旋转角度两个方面对所有内插方案进行了总结,即所有内插方案都是建立在对二者的变换上的。此时,我们可以将PI改写为:
f P I ( x m , m , θ ) = f ( x m , g ( m ) = m S , h ( θ i ) = θ i ) \begin{equation} f_{PI}(x_m, m, \theta) = f(x_m, g(m)=\frac{m}{S}, h(\theta_i)=\theta_i) \end{equation} fPI(xm,m,θ)=f(xm,g(m)=Sm,h(θi)=θi)即PI中没有对旋转角度做任何改变,只是将位置索引除以扩展比。

基于上式,NTK-aware的做法可以被表述为:
f N T K ( x m , m , θ ) = f ( x m , g ( m ) = m , h ( θ i ) = ( b ⋅ S d / ( d − 2 ) ) − 2 ( i − 1 ) / d ) \begin{equation} f_{NTK}(x_m, m, \theta) = f(x_m, g(m)=m, h(\theta_i)=(b\cdot S^{d/(d-2)})^ {-2(i-1) / d}) \end{equation} fNTK(xm,m,θ)=f(xm,g(m)=m,h(θi)=(bSd/(d2))2(i1)/d)即NTK-aware interpolation本质上就是将原始RoPE中的 θ i = b − 2 ( i − 1 ) / d \theta_i = b^{-2(i - 1) / d} θi=b2(i1)/d改为 h ( θ i ) = ( b ⋅ S d / ( d − 2 ) ) − 2 ( i − 1 ) / d h(\theta_i)=(b\cdot S^{d/(d-2)})^ {-2(i-1) / d} h(θi)=(bSd/(d2))2(i1)/d,更本质的区别是将基数base乘以了一个和扩展比 S S S有关的常量 S d / ( d − 2 ) S^{d/(d-2)} Sd/(d2)

进制编码

为什么简单将基数base乘上 S d / ( d − 2 ) S^{d/(d-2)} Sd/(d2)就能达到高频外推+低频内插呢?这要从位置编码的本质说起:

位置 n n n的RoPE编码,本质上就是数字 n n n β \beta β进制编码。

我们知道,如果要求一个十进制数字 n n n β \beta β进制数的第(从右往左数) m m m位数字,可以用如下方式:
⌊ n β m − 1 ⌋ m o d    β \left \lfloor \frac{n}{\beta^{m-1}} \right \rfloor \mod \beta βm1nmodβ例如数字15的8进制表示是17,第1位数字7可以计算为15/1 mod 8 = 7,第2位数字为15 / 7 mod 8 = 1。然后再来回忆一下Transformer中提出的Sinusoidal位置编码:
在这里插入图片描述
其中 i = 0 , 1 , 2 , . . . , d / 2 − 1 i=0,1,2,...,d/2-1 i=0,1,2,...,d/21,即偶数维度为sin,奇数维度位cos。对于第 n n n个位置,每个维度的值依次为:
[ sin ⁡ ( n ( 1000 0 2 d ) 0 ) , cos ⁡ ( n ( 1000 0 2 d ) 0 ) , sin ⁡ ( n ( 1000 0 2 d ) 1 ) , cos ⁡ ( n ( 1000 0 2 d ) 1 ) , . . . , sin ⁡ ( n ( 1000 0 2 d ) d / 2 − 1 ) , cos ⁡ ( n ( 1000 0 2 d ) d / 2 − 1 ) ] \left [ \sin(\frac{n}{(10000^{ \frac{2}{d} })^{0} }),\cos(\frac{n}{(10000^{ \frac{2}{d} })^{0} }), \sin(\frac{n}{(10000^{ \frac{2}{d} })^{1} }),\cos(\frac{n}{(10000^{ \frac{2}{d} })^{1} }), ...,\sin(\frac{n}{(10000^{ \frac{2}{d} })^{d/2-1} }),\cos(\frac{n}{(10000^{ \frac{2}{d} })^{d/2-1} }) \right ] [sin((10000d2)0n),cos((10000d2)0n),sin((10000d2)1n),cos((10000d2)1n),...,sin((10000d2)d/21n),cos((10000d2)d/21n)]此时不妨令其中 β = 1000 0 2 / d \beta=10000^{2/d} β=100002/d,则上式可以改写为:
[ sin ⁡ ( n β 0 ) , cos ⁡ ( n β 0 ) , sin ⁡ ( n β 1 ) , cos ⁡ ( n β 1 ) , . . . , sin ⁡ ( n β d / 2 − 1 ) , cos ⁡ ( n β d / 2 − 1 ) ] \left [ \sin(\frac{n}{\beta^{0} }),\cos(\frac{n}{\beta^{0} }), \sin(\frac{n}{\beta^{1} }),\cos(\frac{n}{\beta^{1} }), ...,\sin(\frac{n}{\beta^{d/2-1} }),\cos(\frac{n}{\beta^{d/2-1} }) \right ] [sin(β0n),cos(β0n),sin(β1n),cos(β1n),...,sin(βd/21n),cos(βd/21n)]这时,我们就可以将位置编码和进制转换联系起来了:

  1. 二者都含有 n β i \frac{n}{\beta^{i}} βin
  2. 二者都对 n β i \frac{n}{\beta^{i}} βin进行了一个周期操作:求余操作含有周期性,sin和cos函数也具有周期性
  3. 去除掉取整这个无关紧要的操作后,位置编码就和进制编码操作一致

因此我们可以说,位置编码本质就是求位置 n n n β \beta β进制数。有了这个发现后,为了让我们的编码方案能够编码之前的 S S S倍长度,那么需要被编码的数就变成之前最大位置索引的 S S S倍。在维度大小 d d d不变的情况下,为了编码更大的数,我们只能将进制扩大。这很好理解,假设一开始为 β = 2 \beta=2 β=2进制,那么长度为3的向量最多编码到111也就是7,而10进制却能编码到999位置。

那么我们就假设对应的进制要从 β \beta β变成 k β k\beta kβ,其中 k > 1 k > 1 k>1。为了对低频也就是高维度进行内插,我们考虑最高维度对应的 n β d / 2 − 1 \frac{n}{\beta^{d/2-1}} βd/21n,进制扩大 k k k倍后变成 n ( k β ) d / 2 − 1 \frac{n}{(k\beta)^{d/2-1}} (kβ)d/21n。为了让这个维度对应到内插操作,我们令:
n ( k β ) d / 2 − 1 = n / S β d / 2 − 1 \frac{n}{(k\beta)^{d/2-1}} = \frac{n/S}{\beta^{d/2-1}} (kβ)d/21n=βd/21n/S上式的含义为:将进制扩大 k k k倍后使用 k β k\beta kβ进制对位置 n n n进行编码等价于使用 β \beta β进制对 n / S n/S n/S(位置内插)位置进行编码,即低频内插。上式解得 k = S 2 / ( d − 2 ) k=S^{2/(d-2)} k=S2/(d2)

接着,为了对高频也就是低维度进行直接外推,我们考虑最低维度对应的 n β \frac{n}{\beta} βn,进制扩大 k k k倍后变成 n k β \frac{n}{k\beta} kβn,由于 d d d很大,所以前边解出来的 k k k趋近于1,那么其实对于高频低维度,就和改变前一样了,也就是直接外推。

综上所述,为了实现高频外推和低频内插,我们只需要将进制从 β = 1000 0 2 / d = b 2 / d \beta=10000^{2/d}=b^{2/d} β=100002/d=b2/d变成 k β = S 2 / ( d − 2 ) ⋅ b 2 / d k\beta=S^{2/(d-2)} \cdot b^{2/d} kβ=S2/(d2)b2/d即可。上面说过,NTK-aware interpolation本质上就是将原始RoPE中的 θ i = b − 2 ( i − 1 ) / d \theta_i = b^{-2(i - 1) / d} θi=b2(i1)/d改为 h ( θ i ) = ( b ⋅ S d / ( d − 2 ) ) − 2 ( i − 1 ) / d h(\theta_i)=(b\cdot S^{d/(d-2)})^ {-2(i-1) / d} h(θi)=(bSd/(d2))2(i1)/d,更本质的区别是将基数 b b b乘以了一个和扩展比 S S S有关的常量 S d / ( d − 2 ) S^{d/(d-2)} Sd/(d2)。此时我们发现,NTK-aware interpolation其实就是将进制从之前的 β \beta β变成了 k β k\beta kβ

NTK-aware interpolation通过一个简单的基数扩大操作,便巧妙实现了高频外推+低频内插。

代码实现

NTK-aware代码链接

from transformers import AutoModelForCausalLM, AutoTokenizer, GenerationConfig
import torch

import transformers

old_init = transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__
def ntk_scaled_init(self, dim, max_position_embeddings=2048, base=10000, device=None):

    #The method is just these three lines
    max_position_embeddings = 16384
    a = 8 #Alpha value
    base = base * a ** (dim / (dim-2)) #Base change formula

    old_init(self, dim, max_position_embeddings, base, device)

transformers.models.llama.modeling_llama.LlamaRotaryEmbedding.__init__ = ntk_scaled_init

可以看到核心代码为:

base = base * a ** (dim / (dim-2))

即前边提到的基数扩大操作。

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

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

相关文章

【计算机网络篇】数据链路层(11)在数据链路层扩展以太网

文章目录 🍔使用网桥在数据链路层扩展以太网🥚网桥的主要结构和基本工作原理🎈网桥的主要结构🔎网桥转发帧的例子🔎网桥丢弃帧的例子🔎网桥转发广播帧的例子 🥚透明网桥🔎透明网桥的…

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面 二开的精美UI站长源码分享论坛网站源码 可切换皮肤界面

c# winform修改控件数字类型运行输入null

txtMaxQty.Properties.Mask.MaskTypeDevExpress.XtraEditors.Mask.MaskType.Numeric; txtUrgentQty.Properties.Mask.MaskTypeDevExpress.XtraEditors.Mask.MaskType.Numeric;txtMinQty.Properties.Mask.MaskType DevExpress.XtraEditors.Mask.MaskType.Numeric;在winform里&am…

openh264 码率控制原理框架

openh264 OpenH264 是一个开源的 H.264 视频编码库,由 Cisco Systems, Inc. 开发并提供。它支持 H.264 的主要编码特性,包括但不限于: 支持基线、主要、高和高10配置文件支持帧内预测、帧间预测、变换编码、量化、环路滤波等支持多线程编码支…

Nvidia Isaac Sim 入门教程 2024(3)图形界面

Isaac Sim 基本使用 版权信息 Copyright 2023-2024 Herman YeAuromix. All rights reserved.This course and all of its associated content, including but not limited to text, images, videos, and any other materials, are protected by copyright law. The author …

Hadoop3:MapReduce中的Partition原理及自定义Partition

一、默认Partition分区配置 以WC案例来进行验证。 1、设置setNumReduceTasks 修改的代码 这行代码,确定了reduceTask的数量,也确定了分区逻辑 在mapper文件中,打上断点 计算分区的代码 这里会对每一个kv进行计算,然后&#…

【星环社区版TDH2024年度大事件】全新版本?全新组件?性能提升10倍?

TDH社区版家族迎来新成员 不知不觉社区版已经陪伴大家将近两年的时间了,在这两年里收获到了很多认可,同时也收获到了一些建议与意见,比如资源成本的问题。在去年我们发布了TDH社区开发版,仅需单台服务器即可一键安装部署Inceptor…

zip文件上传到linux服务器文件大小发生变化

在传一个文件到服务器的时候,第一次传完看见大小不一样(服务器中du命令查看大小796596MB)就重传了一下,还是大小不一样,就查了下。 查了下有以下原因: 文件系统的不同: 原因:不同的…

12.2 Go 编写测试代码

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

Spring之IoC(容器配置、Spring坐标导入、获取bean)

这里的话,因为博主学习时间有限,并没有实际去操作,只是学习和了解一个大概的流程。 目录 一、引言 1、管理什么?(对象:Service、Dao ...) 2、如何将被管理的对象告知 IoC 容器?(用…

Linux内核编程(六)平台总线plantform驱动模型

本文目录 前述:为什么引入平台总线模型一、知识点1. 什么是平台总线模型2. 平台总线模型使用3. 平台总线是如何工作的4. 平台总线模型的优点 二、平台总线设备层1. 常用API(1) 注册一个平台设备(2) 注销一个平台设备&a…

2748. 美丽下标对的数目

题目 给定一个下标从 0 开始的整数数组 nums。如果下标对 (i, j) 满足 0 ≤ i < j < nums.length&#xff0c;且 nums[i] 的第一个数字与 nums[j] 的最后一个数字互质&#xff0c;那么认为 nums[i] 和 nums[j] 是一组美丽下标对。 对于两个整数 x 和 y&#xff0c;如果…

无忧易售新功能:集成图片库智能图片翻译,跨越语言障碍

在电商全球化的浪潮中&#xff0c;跨越语言的障碍&#xff0c;让产品图像说话&#xff0c;成为了商家致胜的关键。"无忧易售ERP"推出集成图片库与图片翻译功能的全新升级&#xff0c;为全球电商提供一站式解决方案&#xff0c;让商品跨越国界&#xff0c;沟通无界。 …

使用二进制安装安装docker

在一些情况下无法使用yum安装docker下面写了一个使用二进制安装docker的文档 官网下载地址https://download.docker.com/linux/static/stable/x86_64/ 可以按需求下载 wget https://download.docker.com/linux/static/stable/x86_64/docker-20.10.10.tgz 下载包 tar xf dcker…

计算机网络 —— 应用层(DHCP)

计算机网络 —— 应用层&#xff08;DHCP&#xff09; 什么是DHCPDHCP工作过程DHCP DISCOVERDHCP OFFERDHCP RQUESTDHCP ACK DHCP租约机制中继代理工作原理功能与优势 我们今天来计网的DHCP&#xff1a; 什么是DHCP DHCP&#xff08;Dynamic Host Configuration Protocol&…

Python11 使用爬虫实现图书250排行榜信息爬取

1.什么是网络爬虫 Python爬虫是使用Python编程语言编写的程序&#xff0c;它能自动从互联网上抓取数据。这类程序一般利用网络请求来访问网站&#xff0c;解析网站的HTML或其他格式的内容&#xff0c;提取出有用的数据&#xff0c;有时还会进行后续的数据处理或存储。 Python…

人工智能大模型之开源大语言模型汇总(国内外开源项目模型汇总)

开源大语言模型完整列表 Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 所谓"语言模型"&#xff0c;就是只用来处理语言文…

如何制定数据治理策略?做好这7点就够了

在当今的商业环境中&#xff0c;数据已成为企业最宝贵的资产之一。随着大数据、云计算、物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;等技术的不断进步&#xff0c;企业积累的数据量呈指数级增长&#xff0c;这为企业提供了前所未有的商业机会&…

大语言模型的微调方法_大语言模型六种微调方法

01 引言 自2018年BERT发布以来&#xff0c;“预训练微调”成为语言模型的通用范式。以ChatGPT为代表的大语言模型针对不同任务构造Prompt来训练&#xff0c;本质上仍然是预训练与微调的使用范式。千亿规模的参数微调需要大量算力&#xff0c;即使提供了预训练的基座模型&…

正版 navicat 下载

1. 打开浏览器访问 navicat 官网 Navicat | 下载 Navicat Premium 14 天免费 Windows、macOS 和 Linux 的试用版 windows 用户选择这三项其中一个就可以 2. 下载 点击之后等个几秒钟就会开始下载了 3. 双击打开 下载好的 .exe 程序 进入安装程序 (不影响之前已经安装过的) 可…