【LLM】利用RoPE不微调大模型以扩展Context长度(更新中)

这篇具有很好参考价值的文章主要介绍了【LLM】利用RoPE不微调大模型以扩展Context长度(更新中)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

note

一、扩展LLM的Context长度

1. 常见方法

扩展LLM的Context长度其实已有不少,但多数是通过结合检索或者摘要的方式来缩短样本的长Context,如Unlimiformer。由于不是直接处理长Context,因此通常无法做精细的阅读理解,而且这些方案往往需要在训练阶段就考虑进去,而不是事后即插即用到已有的LLM模型中。

2. PCW方法

以前能够不微调地扩展Context长度的方案是Parallel Context Window(下面简称PCW),出自论文《Parallel Context Windows for Large Language Models》和《Structured Prompting: Scaling In-Context Learning to 1,000 Examples》,两篇论文是同一时期不同作者的工作,但所提的方法只有细微的差别。

PCW适用于Self Attention模型,主要修改包括Position Encoding和Attention Mask:
【LLM】利用RoPE不微调大模型以扩展Context长度(更新中),# 自然语言处理,# LLM大模型,大模型,扩展上下文,RoPE,原力计划

二、NBCE方法

使用朴素贝叶斯方法。
【LLM】利用RoPE不微调大模型以扩展Context长度(更新中),# 自然语言处理,# LLM大模型,大模型,扩展上下文,RoPE,原力计划
为了改善Random Sample的效果,将Pooling方式改为直接输出不确定性最低的那个分布:
[ log ⁡ p ( T ∣ S ) ] = log ⁡ p ( T ∣ S k ) k = arg ⁡ min ⁡ { H 1 , H 2 , ⋯   , H n } H i = − ∑ T p ( T ∣ S i ) log ⁡ p ( T ∣ S i ) \begin{array}{r} {[\log p(T \mid S)]=\log p\left(T \mid S_k\right)} \\ k=\arg \min \left\{H_1, H_2, \cdots, H_n\right\} \\ H_i=-\sum_T p\left(T \mid S_i\right) \log p\left(T \mid S_i\right) \end{array} [logp(TS)]=logp(TSk)k=argmin{H1,H2,,Hn}Hi=Tp(TSi)logp(TSi)

三、RoPE方法

RoPE的目标:构建一个位置相关的投影矩阵, 使得
( R m q ) ⊤ ( R n k ) = q ⊤ R m ⊤ R n k = q ⊤ R n − m k \left(\mathbf{R}_m \mathbf{q}\right)^{\top}\left(\mathbf{R}_n \mathbf{k}\right)=\mathbf{q}^{\top} \mathbf{R}_m^{\top} \mathbf{R}_n \mathbf{k}=\mathbf{q}^{\top} \mathbf{R}_{n-m} \mathbf{k} (Rmq)(Rnk)=qRmRnk=qRnmk

  • 对位置编码的转换称为位置插值。在这一步中,我们将位置索引从 [ 0 , L ′ ) \left[0, L^{\prime}\right) [0,L)减小到 [ 0 ,   L ) [0, \mathrm{~L}) [0, L),以匹配计算 RoPE 之前的原始索引范围。
  • 因此,作为 RoPE 的输入,任意两个标记之间的最大相对距离从 L ′ L^{\prime} L减小到 L L L 。由于我们在扩展之前和之后对位置索引和相对距离的范围进行了对齐,减轻了上下文窗口扩展对注意力得分计算的影响,这使得模型更容易适应。
  • 为了进一步证明这一点,下面的定理表明插值后的注意力得分具有良好的性质:

【LLM】利用RoPE不微调大模型以扩展Context长度(更新中),# 自然语言处理,# LLM大模型,大模型,扩展上下文,RoPE,原力计划

比如在chatGLM中也用到了旋转位置编码(下面的GLMBlock中的SelfAttention模块):

ChatGLMForConditionalGeneration(
  (transformer): ChatGLMModel(
    (word_embeddings): Embedding(130528, 4096)
    (layers): ModuleList(
      (0-27): 28 x GLMBlock(
        (input_layernorm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
        (attention): SelfAttention(
          (rotary_emb): RotaryEmbedding()
          (query_key_value): QuantizedLinear(in_features=4096, out_features=12288, bias=True)
          (dense): QuantizedLinear(in_features=4096, out_features=4096, bias=True)
        )
        (post_attention_layernorm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
        (mlp): GLU(
          (dense_h_to_4h): QuantizedLinear(in_features=4096, out_features=16384, bias=True)
          (dense_4h_to_h): QuantizedLinear(in_features=16384, out_features=4096, bias=True)
        )
      )
    )
    (final_layernorm): LayerNorm((4096,), eps=1e-05, elementwise_affine=True)
  )
  (lm_head): Linear(in_features=4096, out_features=130528, bias=False)
)

具体的旋转编码类代码如下:

class RotaryEmbedding(torch.nn.Module):
    def __init__(self, dim, base=10000, precision=torch.half, learnable=False):
        super().__init__()
        inv_freq = 1. / (base ** (torch.arange(0, dim, 2).float() / dim))
        inv_freq = inv_freq.half()
        self.learnable = learnable
        if learnable:
            self.inv_freq = torch.nn.Parameter(inv_freq)
            self.max_seq_len_cached = None
        else:
            self.register_buffer('inv_freq', inv_freq)
            self.max_seq_len_cached = None
            self.cos_cached = None
            self.sin_cached = None
        self.precision = precision

    def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys,
                              error_msgs):
        pass

    def forward(self, x, seq_dim=1, seq_len=None):
        if seq_len is None:
            seq_len = x.shape[seq_dim]
        if self.max_seq_len_cached is None or (seq_len > self.max_seq_len_cached):
            self.max_seq_len_cached = None if self.learnable else seq_len
            t = torch.arange(seq_len, device=x.device, dtype=self.inv_freq.dtype)
            freqs = torch.einsum('i,j->ij', t, self.inv_freq)
            # Different from paper, but it uses a different permutation in order to obtain the same calculation
            emb = torch.cat((freqs, freqs), dim=-1).to(x.device)
            if self.precision == torch.bfloat16:
                emb = emb.float()

            # [sx, 1 (b * np), hn]
            cos_cached = emb.cos()[:, None, :]
            sin_cached = emb.sin()[:, None, :]
            if self.precision == torch.bfloat16:
                cos_cached = cos_cached.bfloat16()
                sin_cached = sin_cached.bfloat16()
            if self.learnable:
                return cos_cached, sin_cached
            self.cos_cached, self.sin_cached = cos_cached, sin_cached
        return self.cos_cached[:seq_len, ...], self.sin_cached[:seq_len, ...]

    def _apply(self, fn):
        if self.cos_cached is not None:
            self.cos_cached = fn(self.cos_cached)
        if self.sin_cached is not None:
            self.sin_cached = fn(self.sin_cached)
        return super()._apply(fn)

四、FlashAttention方法

  • 最新发布的ChatGLM2-2B就用了这种方法将上下文长度(Context Length)由 ChatGLM-6B 的 2K 扩展到了 32K,并在对话阶段使用 8K 的上下文长度训练,允许更多轮次的对话。
  • 用了哈希感知(hash-aware)的技术,可以根据它们的相似性将输入序列中的元素分配到不同的桶(bucket)中。这样,模型只需要计算桶元素之间的注意力权重,而不是整个序列。

【LLM】利用RoPE不微调大模型以扩展Context长度(更新中),# 自然语言处理,# LLM大模型,大模型,扩展上下文,RoPE,原力计划

Reference

[1] Transformer升级之路:10、RoPE是一种β进制编码. 苏剑林
[2] NTK-Aware Scaled RoPE allows LLaMA models to have extended (8k+) context size without any fine-tuning and minimal perplexity degradation.
[3] ​Bias项的神奇作用:RoPE + Bias = 更好的长度外推性
[4] NBCE:使用朴素贝叶斯扩展LLM的Context处理长度.苏剑林
[5] Improving language models by retrieving from trillions of tokens. DeepMind的RETRO做法(以前是将文本分块chunk依次提供给LLM,但这只是暂时的做法)
[6] 【自然语言处理】【大模型】ChatGLM-6B模型结构代码解析(单机版)
[7] https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py
[8] 也谈langchain大模型外挂知识库问答系统核心部件:如何更好地解析、分割复杂非结构化文本
[9] 田渊栋团队新作:通过位置插值来扩展大语言模型的上下文窗口 Extending Context Window of Large Language Models via Positional Interpolation
[10] RoPE可能是LLM时代的Resnet.刘俊是
[12] flash-attention:https://github.com/Dao-AILab/flash-attention(chatglm2-6b就用了这个实现支持更长的上下文)
[13] https://huggingface.co/THUDM/chatglm2-6b
[14] NBCE:使用朴素贝叶斯扩展LLM的Context处理长度
[15] 为什么gpt模型输入的token最大数量被限制在几万,是有技术问题吗?
[16] 图解RoPE旋转位置编码及其特性.Yeungnlp(公式推倒)文章来源地址https://www.toymoban.com/news/detail-576406.html

到了这里,关于【LLM】利用RoPE不微调大模型以扩展Context长度(更新中)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入了解 大语言模型(LLM)微调方法

    众所周知,大语言模型(LLM)正在飞速发展,各行业都有了自己的大模型。其中,大模型微调技术在此过程中起到了非常关键的作用,它提升了模型的生成效率和适应性,使其能够在多样化的应用场景中发挥更大的价值。 那么,今天这篇文章就带大家深入了解大模型微调。其中

    2024年03月14日
    浏览(43)
  • 【大语言模型LLM】-基础语言模型和指令微调的语言模型

    🔥 博客主页 : 西瓜WiFi 🎥 系列专栏 : 《大语言模型》 很多非常有趣的模型,值得收藏,满足大家的收集癖! 如果觉得有用,请三连👍⭐❤️,谢谢! 长期不定时更新,欢迎watch和fork!❤️❤️❤️ ❤️ 感谢大家点赞👍 收藏⭐ 评论⭐ 🎥 大语言模型LLM基础-系列文章

    2024年04月28日
    浏览(57)
  • 【LLM系列之指令微调】长话短说大模型指令微调的“Prompt”

    1 指令微调数据集形式“花样”太多 大家有没有分析过 prompt对模型训练或者推理的影响?之前推理的时候,发现不加训练的时候prompt,直接输入模型性能会变差的,这个倒是可以理解。假如不加prompt直接训练,是不是测试的时候不加prompt也可以?还有一个就是多轮prompt和单轮

    2024年02月14日
    浏览(47)
  • 【LLM】Prompt tuning大模型微调实战

    prompt tuning可看做是prefix tuning的简化版本,在输入层加入prompt tokens,并不需要加入MLP进行调整来解决难训练的问题,作者实验表明随着预训练模型参数量的增加,prompt tuning效果逼近fine tuning效果 之前提到过可以借助 peft 库(Parameter-Efficient Fine-Tuning)进行微调,支持如下tuni

    2024年02月13日
    浏览(47)
  • 【LLM】金融大模型场景和大模型Lora微调实战

    金融行业需要垂直领域LLM,因为存在金融安全和数据大多数存储在本地,在风控、精度、实时性有要求 (1)500亿参数的BloombergGPT BloombergGPT金融大模型也是用transformer架构,用decoder路线, 构建目前规模最大的金融数据集FINPILE,对通用文本+金融知识的混合训练。 用了512块40

    2024年02月12日
    浏览(51)
  • 大语言模型LLM微调技术:Prompt Tuning

    截止23年3月底,语言模型发展走过了三个阶段: 第一阶段 :设计一系列的自监督训练目标(MLM、NSP等),设计新颖的模型架构(Transformer),遵循Pre-training和Fine-tuning范式。典型代表是BERT、GPT、XLNet等; 第二阶段 :逐步扩大模型参数和训练语料规模,探索不同类型的架构。

    2024年02月03日
    浏览(39)
  • [NLP]LLM---大模型指令微调中的“Prompt”

    大家有没有分析过 prompt对模型训练或者推理的影响?之前推理的时候,发现不加训练的时候prompt,直接输入模型性能会变差的,这个倒是可以理解。假如不加prompt直接训练,是不是测试的时候不加prompt也可以?还有一个就是多轮prompt和单轮prompt怎么构造的问题?好多模型训练

    2024年02月09日
    浏览(45)
  • LLM大语言模型训练中常见的技术:微调与嵌入

    微调 (Fine-Tuning): 微调是一种用于预训练语言模型的技术。在预训练阶段,语言模型(如GPT-3.5)通过大规模的文本数据集进行训练,从而学会了语言的语法、语义和世界知识。然后,在微调阶段,模型会在特定任务或领域的小规模数据集上进行额外的训练。这个微调过程

    2024年02月06日
    浏览(45)
  • 精进语言模型:探索LLM Training微调与奖励模型技术的新途径

    LLMs Trainer 是一个旨在帮助人们从零开始训练大模型的仓库,该仓库最早参考自 Open-Llama,并在其基础上进行扩充。 有关 LLM 训练流程的更多细节可以参考 【LLM】从零开始训练大模型。 使用仓库之前,请先安装所有需要的依赖: 继续预训练是指,在一个已有的模型上继续进行

    2024年02月11日
    浏览(39)
  • ChatGLM-6B模型微调实战(以 ADGEN (广告生成) 数据集为例,序列长度达 2048)

    kingglory/ChatGLM-6B 项目地址 1 介绍 对于 ChatGLM-6B 模型基于 P-Tuning v2 的微调。P-Tuning v2 将需要微调的参数量减少到原来的 0.1%,再通过模型量化、Gradient Checkpoint 等方法,差不多需要 7GB或则8GB 显存即可运行。 2 环境 2.1 python 环境 或者 2.2 下载代码 2.3 安装依赖 运行微调需要4.27

    2024年02月03日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包