月度归档: 2024 年 5 月

  • Transformer升级之路:逆用Leaky ReRoPE解决推理成本问题

    在上周的文章《Transformer升级之路:12、无限外推的ReRoPE?》中,我们介绍了ReRoPE和Leaky ReRoPE的创新方法。实验结果表明,它们在几乎不损失训练效果的情况下能够扩展LLM的Context长度,并且实现了“longer context, lower loss”的理想特性。尤其是ReRoPE,似乎表现出了无限的Context处理能力。然而,这些方法也带来了推理阶段的成本增加问题。本文将探讨一种新的解决方案:逆用Leaky ReRoPE。

    回顾RoPE与Leaky ReRoPE

    RoPE与位置编码

    RoPE(Rotary Position Embedding)形式上是一种绝对位置编码,但实际上它实现了相对位置编码。其对应的相对位置矩阵为:

    *** QuickLaTeX cannot compile formula:
    [\left(\begin{array}{cccccccccc}0 & 1 & 2 & 3 & \cdots & L-2 & L-1\-1 & 0 & 1 & 2 & \cdots & L-3 & L-2\-2 & -1 & 0 & 1 & \cdots & L-4 & L-3\\vdots & \vdots & \vdots & \vdots & \ddots & \vdots & \vdots\2-L & 3-L & 4-L & \cdots & -2 & -1 & 0\1-L & 2-L & 3-L & \cdots & -3 & -2 & -1\\end{array}\right)]
    
    *** Error message:
    Extra alignment tab has been changed to \cr.
    leading text: ...2 & 3 & \cdots & L-2 & L-1\-1 & 0 & 1 & 2 &
    Undefined control sequence \2.
    leading text: ...vdots & \vdots & \ddots & \vdots & \vdots\2
    Extra alignment tab has been changed to \cr.
    leading text: ... \vdots & \vdots\2-L & 3-L & 4-L & \cdots &
    Undefined control sequence \1.
    leading text: ...ts\2-L & 3-L & 4-L & \cdots & -2 & -1 & 0\1
    Extra \right.
    leading text: ... & \cdots & -3 & -2 & -1\\end{array}\right)
    \begin{array} on input line 8 ended by \end{document}.
    leading text: \end{document}
    Improper \prevdepth.
    leading text: \end{document}
    Missing } inserted.
    leading text: \end{document}
    Missing \cr inserted.
    leading text: \end{document}
    Missing $ inserted.
    leading text: \end{document}
    
    

    Leaky ReRoPE与窗口化处理

    为了在保留局域性的同时避免Long Context导致位置越界问题,Leaky ReRoPE将推理阶段的相对位置矩阵改为:

    *** QuickLaTeX cannot compile formula:
    [\left(\begin{array}{cccccccccc}0 & 1 & 2 & \cdots & w-1 & w & \cdots & w+k & \cdots & w+L-1-wk\-1 & 0 & 1 & \cdots & w-2 & w-1 & \cdots & w+k-1 & \cdots & w+L-2-wk\\vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots\-w+1 & -w+2 & -w+3 & \cdots & -1 & 0 & \cdots & k-1 & \cdots & L-2-wk\\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\end{array}\right)]
    
    *** Error message:
    Extra alignment tab has been changed to \cr.
    leading text: ...& w & \cdots & w+k & \cdots & w+L-1-wk\-1 &
    Extra alignment tab has been changed to \cr.
    leading text: ... & \ddots & \vdots & \vdots & \vdots\-w+1 &
    Extra \right.
    leading text: ...\vdots & \vdots & \vdots\\end{array}\right)
    \begin{array} on input line 8 ended by \end{document}.
    leading text: \end{document}
    Improper \prevdepth.
    leading text: \end{document}
    Missing } inserted.
    leading text: \end{document}
    Missing \cr inserted.
    leading text: \end{document}
    Missing $ inserted.
    leading text: \end{document}
    You can't use `\end' in internal vertical mode.
    leading text: \end{document}
    \begin{array} on input line 8 ended by \end{document}.
    leading text: \end{document}
    Missing } inserted.
    
    

    其中,( w ) 是窗口宽度,( k ) 用来调节可处理的最大长度。

    ReRoPE的无限扩展能力

    ReRoPE直接取了 ( k \to \infty ) 的极限:

    *** QuickLaTeX cannot compile formula:
    [\left(\begin{array}{cccccccccc}0 & 1 & 2 & \cdots & w-1 & w & \cdots & w & \cdots & w\-1 & 0 & 1 & \cdots & w-2 & w-1 & \cdots & w & \cdots & w\\vdots & \vdots & \vdots & \ddots & \vdots & \vdots & \ddots & \vdots & \vdots & \vdots\-w+1 & -w+2 & -w+3 & \cdots & -1 & 0 & \cdots & w & \cdots & w\\vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\end{array}\right)]
    
    *** Error message:
    Extra alignment tab has been changed to \cr.
    leading text: ...ts & w-1 & w & \cdots & w & \cdots & w\-1 &
    Extra alignment tab has been changed to \cr.
    leading text: ... & \ddots & \vdots & \vdots & \vdots\-w+1 &
    Extra \right.
    leading text: ...\vdots & \vdots & \vdots\\end{array}\right)
    \begin{array} on input line 8 ended by \end{document}.
    leading text: \end{document}
    Improper \prevdepth.
    leading text: \end{document}
    Missing } inserted.
    leading text: \end{document}
    Missing \cr inserted.
    leading text: \end{document}
    Missing $ inserted.
    leading text: \end{document}
    You can't use `\end' in internal vertical mode.
    leading text: \end{document}
    \begin{array} on input line 8 ended by \end{document}.
    leading text: \end{document}
    Missing } inserted.
    
    

    逆用Leaky ReRoPE:让训练阶段变慢,推理阶段变快

    为什么逆用?

    原本的ReRoPE和Leaky ReRoPE在推理阶段增加了计算成本。如果我们反过来在训练阶段使用Leaky ReRoPE,而在推理阶段使用常规的RoPE,能否解决这一问题呢?

    实验与结果

    我们进行了以下实验组合:“GAU + Deep Norm + Tiger + 语言模型”。在训练阶段使用 ( k=1/16, w=128 ) 的Leaky ReRoPE,在推理阶段使用正常的RoPE。测试结果如下:

    测试长度BaselineBaseline-lognNTK-RoPE-fixedNTK-RoPE-logn†-fixedNTK-RoPE-logn-fixedNTK-RoPE-mixedNTK-RoPE-logn†-mixedNTK-RoPE-logn-mixedReRoPE-w256ReRoPE-w256-logn†ReRoPE-w256-lognInvLeaky ReRoPE-w128-lognInvLeaky ReRoPE-w128-b8-lognHFWA512 (训练)
    训练49.41%49.40%49.41%49.41%49.40%49.41%49.41%49.40%49.41%49.41%49.40%49.38%49.62%48.70%
    4096(重复)24.17%24.60%51.86%55.94%62.85%53.09%59.11%68.91%77.90%82.40%85.12%82.25%81.15%80.84%
    4096(不重复)23.16%24.02%39.61%41.11%44.14%40.12%42.38%45.41%48.48%48.85%49.07%48.32%48.85%48.15%

    其中,( b8 ) 是指RoPE的频率底数从10000换成了80000。可以看到,“Leaky ReRoPE → RoPE”的InvLeaky ReRoPE虽然效果上不如“RoPE → ReRoPE/Leaky ReRoPE”,但依然胜过了HFWA,并且由于推理阶段是常规的RoPE,可以套用现成的加速技术,因此依然是有相当竞争力的。

    我们对 ( k, w, b ) 等参数做了一些简单的调参,发现最优解基本上就是上述两个组合。具体来说:

    调参与训练速度

    • ( k ) 设置为“扩展倍数的2倍的倒数”
    • ( w ) 设置为训练长度的四分之一
    • ( b ) 可选乘以扩展倍数

    在上述实验中,模型参数量为1亿,训练长度为512,每1000步的训练时间从330秒增加到了350秒,增加不到10%。虽然这里有GAU的原因,因为GAU是单头的注意力,本身比多头注意力快。如果是多头注意力或者训练长度更长,增加幅度可能会更大,但估计不会超过50%,依然在可接受范围内。

    小结

    本文提出了Leaky ReRoPE的“逆用”方法,通过在训练阶段使用更大步长的Leaky ReRoPE,使得推理阶段可以退回常规的RoPE,从而保持推理速度不变。实验结果表明,这种方法依然具有相当的竞争力。未来的工作可以进一步优化参数设置,提升模型性能。


    希望这篇文章能够帮助您更好地理解逆用Leaky ReRoPE的方法及其优势。如果有任何疑问或建议,欢迎在评论区留言讨论。

  • 增大Tokenizer词表:LLM续写任务的新挑战与解决方案

    语言模型(LLM)在自然语言处理中的应用越来越广泛,而通过增大Tokenizer的词表来提高压缩率,从而缩短串行长度、降低解码成本,是大家都喜闻乐见的事情。然而,这种方法在带来诸多优点的同时,也可能产生一些问题。本文将探讨增大词表后语言模型在续写任务中遇到的问题,并提出解决方案。

    优劣分析

    优点

    1. 解码速度提升:由于LLM是自回归的,解码过程会随着序列长度的增加变得越来越慢。通过“增大词表 → 提高压缩率 → 缩短串行长度”,可以减少相同文本对应的tokens数量,从而减少解码步数,提升解码速度。
    2. 缓解Exposure Bias:语言模型的训练方式通常是Teacher Forcing,缩短串行长度能够缓解Teacher Forcing带来的Exposure Bias问题,从而可能提升模型效果。

    缺点

    1. 割裂字符联系:增大词表可能会割裂token与token之间在字符层面的联系,影响模型的泛化能力。例如,“太阳能”和“太阳”都是词表中的一个词时,模型可能不知道“太阳能”是由“太阳”和“能”组成,从而难以完成一些子词相关的任务。
    2. 续写问题:增大词表后,常见的命令或短语可能被视为单个token,导致模型在续写时无法正确生成。例如,“import numpy as np”被当作一个token,用户输入“import numpy”时,模型无法续写出“ as np”。

    续写问题

    Armen Aghajanyan分享了一个典型的例子:在训练代码模型时使用超大词表,导致“import numpy as np”变成了一个token。当用户输入“import numpy”时,模型无法续写出“ as np”。这种现象在自然语言模型中也很常见。例如,“太阳能”和“太阳”都是独立的token时,用户输入“太阳”后,模型续写出的内容可能不符合用户的期望。

    参考对策

    虽然Armen Aghajanyan提到的问题确实存在,但笔者认为通过适当的处理,这个问题不仅可以解决,还能转化为增大词表的优点。以下是一个可行的解决方案:

    基于词表的前缀搜索

    假设用户输入了“广州的白云”,Tokenizer将其分为“广州/的/白云”。此时,如果直接将这三个词转换为id输入模型,模型可能无法续写出“广州/的/白云机场”等结果。因此,我们可以进行以下步骤:

    1. 前缀搜索:对“白云”进行词表的前缀搜索,假设搜索结果为“白云”、“白云机场”、“白云山”、“白云路”四个词。
    2. 计算条件概率:用LLM计算以下条件概率:
      [p(\text{白云}|\text{广州, 的})p(\text{白云机场}|\text{广州, 的})p(\text{白云山}|\text{广州, 的})p(\text{白云路}|\text{广州, 的})]
    3. 归一化与采样:将条件概率归一化后进行采样,决定续写内容。例如,采样结果为“白云机场”,则输出“机场”,并按照“广州/的/白云机场”进行续写。

    这种方法不仅解决了Armen Aghajanyan所提到的问题,还能在词表压缩率高的情况下,一次性生成更多的字。特别地,回退操作只需在采样第一步进行,从第二步开始就不需要回退操作,计算量很少。

    文章小结

    本文介绍了增大词表后LLM在续写任务中可能出现的问题,并分享了参考的解决方案。通过结合基于LLM的续写和基于词表的前缀搜索,可以有效地解决续写问题,并将增大词表的缺点转化为优点。希望这些思路能为语言模型的进一步优化提供参考。

人生梦想 - 关注前沿的计算机技术 acejoy.com 🐾 步子哥の博客 🐾 背多分论坛 🐾 借一步网
Page Stats: PV: 1 | UV: 1
Last updated: 2025-07-05 02:59:07
沪ICP备2024052574号-1