Month: May 2024

Transformer升级之路:逆用Leaky ReRoPE解决推理成本问题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)形式上是一种绝对位置编码,但实际上它实现了相对位置编码。其对应的相对位置矩阵为: [latex][\left(\begin{array}{cccccccccc}0 & 1 & 2 & 3 & \cdots & L-2 & L-1\-1 & 0 & 1 & [...]

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

语言模型(LLM)在自然语言处理中的应用越来越广泛,而通过增大Tokenizer的词表来提高压缩率,从而缩短串行长度、降低解码成本,是大家都喜闻乐见的事情。然而,这种方法在带来诸多优点的同时,也可能产生一些问题。本文将探讨增大词表后语言模型在续写任务中遇到的问题,并提出解决方案。 优劣分析 优点 缺点 续写问题 Armen Aghajanyan分享了一个典型的例子:在训练代码模型时使用超大词表,导致“import numpy as np”变成了一个token。当用户输入“import numpy”时,模型无法续写出“ as np”。这种现象在自然语言模型中也很常见。例如,“太阳能”和“太阳”都是独立的token时,用户输入“太阳”后,模型续写出的内容可能不符合用户的期望。 参考对策 虽然Armen Aghajanyan提到的问题确实存在,但笔者认为通过适当的处理,这个问题不仅可以解决,还能转化为增大词表的优点。以下是一个可行的解决方案: 基于词表的前缀搜索 假设用户输入了“广州的白云”,Tokenizer将其分为“广州/的/白云”。此时,如果直接将这三个词转换为id输入模型,模型可能无法续写出“广州/的/白云机场”等结果。因此,我们可以进行以下步骤: 这种方法不仅解决了Armen Aghajanyan所提到的问题,还能在词表压缩率高的情况下,一次性生成更多的字。特别地,回退操作只需在采样第一步进行,从第二步开始就不需要回退操作,计算量很少。 文章小结 本文介绍了增大词表后LLM在续写任务中可能出现的问题,并分享了参考的解决方案。通过结合基于LLM的续写和基于词表的前缀搜索,可以有效地解决续写问题,并将增大词表的缺点转化为优点。希望这些思路能为语言模型的进一步优化提供参考。 [...]

Viterbi Sampling算法的改进与完善Viterbi Sampling算法的改进与完善

在自然语言处理领域,分词是一个至关重要的步骤。最近,一篇名为《随机分词浅探:从Viterbi Decoding到Viterbi Sampling》的文章中,作者提出了一种名为“Viterbi Sampling”的随机分词算法。本文将详细讨论该算法的改进,并从数学上证明其效果可以与Subword Regularization等价。 问题分析 在知乎的评论中,用户 @鹤舞 指出,当前的采样算法可能会在多次二选一的过程中“稀释”了部分方案的出现概率,导致原本分数最高的切分并不是以最高概率出现。 例如,假设有三种切分方案,每种方案的得分都一样,理应每种方案的出现概率都是1/3。然而,Viterbi Sampling算法将多选一的过程拆分成多步的二选一,从而导致概率分布发生偏移。 示例分析 以单词“watching”为例,有三种切分方案:watch ing, wat ching, 和 w atching。按照Viterbi Sampling的操作,先在前两种方案中选择,概率均为1/2;然后再与第三种方案比较,概率依然为1/2。最终,前两种方案的出现概率为1/4,而第三种方案的出现概率变为了1/2。 解决办法 为了解决上述问题,可以采用“水塘采样(Reservoir sampling)”的算法。具体来说,每次进行二选一后,同时缓存累积概率,并在后续的二选一过程中使用累积概率进行比较。 具体实现 假设前两种切分方案的概率均为1/3,选择其中一种后,总的累积概率为2/3。接下来,新方案被选中的概率为1/3,而不是1/2。这保证了每种方案的出现概率均保持为1/3。 在实际计算时,为避免指数爆炸问题,可以缓存对数形式的概率,并利用logsumexp函数避免溢出。 相应的实现已经内置在bytepiece>=0.5.0中。 完美采样的证明 为了证明改进后的Viterbi Sampling算法是“完美采样”,我们需要回顾Viterbi [...]

探索线性Attention的局限性:从“集中注意力”角度出发探索线性Attention的局限性:从“集中注意力”角度出发

近年来,Transformer架构在自然语言处理领域取得了显著的成果,而Attention机制则是其核心所在。然而,随着研究的深入,传统的标准Attention机制暴露出了一些计算复杂度和资源需求上的问题,这促使研究者们开始探索更高效的线性Attention。然而,线性Attention在实际效果上却一直不如标准Attention。本文将从“集中注意力”的角度,探讨线性Attention的局限性,并尝试给出一个合理的解释。 Attention机制的稀疏性 什么是稀疏性? 在《从熵不变性看Attention的Scale操作》一文中,我们用信息熵来度量Attention的“集中注意力”程度。熵越低,Attention越有可能集中在某个token上。然而,信息熵只能用于归一化且非负的Attention矩阵,这限制了其适用范围。因此,我们引入了另一种稀疏性度量指标:S(x) = E[|x|] / sqrt(E[x^2])。这个指标与信息熵类似,S(x)越小,表示对应的随机矢量越稀疏,即越有可能“一家独大”。 标准Attention的稀疏性 对于标准Attention机制,f = exp,我们可以推导出其稀疏性: 当σ或||q||趋向无穷大时,S(a)趋向于0,这意味着标准Attention可以任意稀疏地“集中注意力”。 GAU的稀疏性 对于Gated Attention Unit (GAU)机制,f = relu2,其稀疏性较为复杂,但通过计算可以发现,只有当偏置项β小于0时,稀疏性才有机会趋于0。这表明,GAU在某些条件下也能实现较高的稀疏性。 线性Attention的局限性 极简线性Attention 对于最简单的线性Attention,即不加任何激活函数f = identical,其稀疏性为: 从图像可以看出,极简线性Attention的稀疏性存在一个较高的下限,这意味着它难以“集中注意力”到关键位置上。 一般线性Attention 线性Attention的一般形式为a_j ∝ g(q) [...]

深度学习中的状态空间模型(SSM)初探深度学习中的状态空间模型(SSM)初探

引言 前几天,笔者看了几篇介绍SSM(State Space Model)的文章,才发现原来自己从未认真了解过SSM,于是打算认真去学习一下SSM的相关内容,顺便开了这个新坑,记录一下学习所得。 SSM的概念由来已久,但这里我们特指深度学习中的SSM,一般认为其开篇之作是2021年的S4,不算太老,而SSM最新最火的变体大概是去年的Mamba。当然,当我们谈到SSM时,也可能泛指一切线性RNN模型,这样RWKV、RetNet还有此前我们在《Google新作试图“复活”RNN:RNN能否再次辉煌?》介绍过的LRU都可以归入此类。不少SSM变体致力于成为Transformer的竞争者,尽管笔者并不认为有完全替代的可能性,但SSM本身优雅的数学性质也值得学习一番。 尽管我们说SSM起源于S4,但在S4之前,SSM有一篇非常强大的奠基之作《HiPPO: Recurrent Memory with Optimal Polynomial Projections》(简称HiPPO),所以本文从HiPPO开始说起。 基本形式 先插句题外话,上面提到的SSM代表作HiPPO、S4、Mamba的一作都是Albert Gu,他还有很多篇SSM相关的作品,毫不夸张地说,这些工作筑起了SSM大厦的基础。不论SSM前景如何,这种坚持不懈地钻研同一个课题的精神都值得我们由衷地敬佩。 言归正传。对于事先已经对SSM有所了解的读者,想必知道SSM建模所用的是线性ODE系统: [latex][ x′(t) = Ax(t) + Bu(t) ][/latex][latex][ y(t) = Cx(t) + Du(t) ][/latex] 其中 [...]

何加盐深度揭秘:我是怎么找资料的?何加盐深度揭秘:我是怎么找资料的?

在信息爆炸的时代,获取和整理信息的能力变得尤为重要。何加盐在其博客文章《何加盐深度揭秘:我是怎么找资料的?》中,详细介绍了他搜集资料的技巧和方法。以下是文章中的一些关键内容和技巧总结: 一、用好搜索引擎 1. 善于选择时间段 通过设置搜索时间段,可以过滤掉大量无关信息。例如,想要了解百度创始人李彦宏的早期历程,可以将搜索时间设置在2000-2004年,这样可以找到更多关于他创业初期的报道。 2. 善用关键词的组合 关键词组合能让搜索结果更加精准。例如,搜索“程维 滴滴”可能会得到大量杂乱的信息,但如果组合搜索“程维 王刚”,就能找到更多关于滴滴和投资人的相关资料。 3. 善用一些搜索命令 二、用好社交网站 社交平台如微博、微信、知乎和脉脉等是搜集资料的重要渠道。通过浏览目标人物的社交账号,可以获取大量一手信息。例如,何加盐在写程维时,浏览了程维的所有微博;在写王兴时,浏览了王兴的饭否账号。 三、用好视频网站 视频网站是一个信息宝库,特别是知名人物的演讲、采访视频能提供大量鲜活的细节。例如,写程维时,何加盐参考了吴晓波的《二十年二十人》对程维的采访视频。 四、用好名人演讲 名人在各种场合的演讲活动通常会透露很多重要信息。马云在“18罗汉大会”上的演讲是了解他创业史的重要资料。 五、用好传记作品 传记是了解人物和企业最全面的方式。例如,《腾讯传》是了解腾讯发展历程的必读书目;《这世界既残酷,也温柔》是了解孙宇晨的主要资料来源之一。 六、用好杂志 专业杂志如《财经杂志》、《中国企业家》、《南方人物周刊》等,对人物和企业的报道非常深入。例如,何加盐写TMD三部曲时,引用了不少《财经杂志》的内容。 总结 何加盐分享的这些方法,旨在帮助大家更高效地搜集和整理信息。在此过程中,要注意两点:一是信息的真伪,需要多方交叉验证;二是使用好的工具,付费版通常能提供更高效的服务。 希望这些技巧对你有所帮助! Learn more: [...]

DeepSeek-V2 大模型DeepSeek-V2 大模型

DeepSeek-V2 是一个强大、经济高效的混合专家语言模型。它具有2360亿个总参数,每个标记激活的参数为210亿。相比于DeepSeek 670亿,DeepSeek-V2 在性能上更强大,同时节省了42.5%的训练成本,将KV缓存减少了93.3%,并将最大生成吞吐量提升了5.76倍[1]。 DeepSeek-V2的配置方法如下: 这些是配置 DeepSeek-V2 的基本步骤。根据具体的应用场景和需求,你可能需要进一步调整模型的参数和设置。 Learn more: 配置和使用 DeepSeek-V2:强大、经济高效的混合专家语言模型 DeepSeek-V2 是一款强大且经济高效的混合专家(Mixture-of-Experts, MoE)语言模型。相比于之前的 DeepSeek 67B,DeepSeek-V2 不仅性能更强,还显著降低了训练成本和资源消耗。本文将介绍如何配置和使用 DeepSeek-V2 模型。 模型简介 DeepSeek-V2 拥有 2360 亿个总参数,其中每个标记激活 210 亿个参数。与 DeepSeek 67B 相比,DeepSeek-V2 [...]

Caddy 2中配置缓存Caddy 2中配置缓存

在Caddy 2中配置缓存可以使用cache-handler插件。以下是配置Caddy 2缓存的步骤: 在这个示例中,cache指令启用了缓存处理,并将请求代理到your-app:8080。 在这个示例中,所有以.css结尾的URI将使用指定的规则生成缓存键。 在这个示例中,使用Fastly作为CDN提供商,并配置了相关的API密钥、邮箱、主机名等信息。 这些是配置Caddy 2缓存的基本步骤。你可以根据需要调整和扩展这些配置选项。请参考cache-handler插件的文档以获取更多详细信息和选项[1]。 Learn more: darkweak/souin 是一个HTTP缓存系统,符合RFC标准,并与@tyktechnologies、@traefik、@caddyserver、@go-chi、@bnkamalesh、@beego、@devfeel、@labstack、@gofiber、@go-goyave、@go-kratos、@gin-gonic、@roadrunner-server、@zalando、@zeromicro、@nginx和@apache兼容[1]。它可以作为反向代理缓存系统,可以放置在当前反向代理(如Apache、Nginx)的顶部,也可以作为Træfik、Caddy或Tyk等喜爱的反向代理的插件使用。由于它是用Go语言编写的,可以部署在任何服务器上,并且由于具有Docker集成,可以轻松安装在Swarm或Kubernetes实例上。它支持Vary、请求合并、陈旧的Cache-Control和其他与RFC-7234相关的规范,还支持新编写的RFC(目前处于草案阶段)http-cache-groups和http-invalidation。它还支持ESI标签,感谢go-esi包的支持[1]。 Souin的配置文件存储在/anywhere/configuration.yml中,可以根据需要提供自己的配置文件。配置文件中包含了各种配置选项,如缓存时间、反向代理URL、API配置、缓存键配置等[1]。 Souin还提供了各种插件,如Beego过滤器、Caddy模块、Chi中间件、Dotweb中间件、Echo中间件、Fiber中间件、Gin中间件、Goa中间件、Go-zero中间件、Goyave中间件、Hertz中间件、Kratos过滤器、Roadrunner中间件、Skipper过滤器、Træfik插件、Tyk插件、Webgo中间件、Prestashop插件和Wordpress插件等[1]。 Souin还支持Prometheus API、Souin API和Security API,可以用于监控和管理缓存系统[1]。 总结:darkweak/souin是一个符合RFC标准的HTTP缓存系统,可以作为反向代理缓存系统使用,也可以作为插件嵌入到其他反向代理中。它支持各种配置选项和插件,并提供了API用于监控和管理缓存系统。 Learn more: [...]

深入解析 LoRA+:如何通过调整学习率进一步优化LLM深入解析 LoRA+:如何通过调整学习率进一步优化LLM

在当前大规模语言模型(LLM)的参数高效微调方法中,LoRA(Low-Rank Adaptation)无疑是一个重要的手段。此前,我们在《梯度视角下的LoRA:简介、分析、猜测及推广》中曾简单讨论过LoRA。今天,我们来学习LoRA的一个新结论:给LoRA的两个矩阵分配不同的学习率,LoRA的效果还能进一步提升。这一结论出自最近的论文《LoRA+: Efficient Low Rank Adaptation of Large Models》(下称“LoRA+”)。 为什么调整学习率显得如此重要? 乍一看,给不同的矩阵分配不同的学习率似乎并没有什么特别之处,因为配置不同的学习率相当于引入了新的超参数,而通常来说,只要引入并精调超参数,模型性能都会有所提升。然而,“LoRA+”的特别之处在于,它从理论角度肯定了这一必要性,并且明确指出最优解必然是右矩阵的学习率大于左矩阵的学习率。 LoRA基本原理回顾 假设预训练参数为 ,如果使用全量参数微调,那么增量也是一个 ( n \times m ) 矩阵。为了降低参数量,LoRA将更新量约束为低秩矩阵,即设 ( W = W_0 + AB ),其中 。在训练时,只更新 ( A [...]

论文分享:Score Identity Distillation——更快更好的扩散模型蒸馏方法论文分享:Score Identity Distillation——更快更好的扩散模型蒸馏方法

引言 今天我们分享的是一篇名为《Score Identity Distillation: Exponentially Fast Distillation of Pretrained Diffusion Models for One-Step Generation》的新论文。该论文探讨了如何更快更好地蒸馏扩散模型。 即便没有做过蒸馏,大家可能也能猜到蒸馏的常规步骤:随机采样大量输入,然后用扩散模型生成相应结果作为输出,用这些输入输出作为训练数据对,来监督训练一个新模型。然而,众所周知,作为教师的原始扩散模型通常需要多步(比如1000步)迭代才能生成高质量输出,所以且不论中间训练细节如何,该方案的一个显著缺点是生成训练数据太费时费力。此外,蒸馏之后的学生模型通常或多或少都有效果损失。 有没有方法能一次性解决这两个缺点呢?这就是上述论文试图要解决的问题。 思路简介 论文将所提方案称为“Score Identity Distillation(SiD)”,基于几个恒等式来设计和推导了整个框架。实际上,它的设计思想与几个恒等式并没有直接联系,其次几个恒等式都是已知的公式而不是新的,所以这个名字显得相当随意。 本文将其称之为“重现江湖”,是因为SiD的思路跟之前在《从去噪自编码器到生成模型》介绍过的论文《Learning Generative Models using Denoising Density Estimators》(简称“DDE”)几乎一模一样,甚至最终形式也有五六分相似。只不过当时扩散模型还未露头角,所以DDE是将其作为一种新的生成模型提出的,在当时反而显得非常小众。而在扩散模型流行的今天,它可以重新表述为一种扩散模型的蒸馏方法,因为它需要一个训练好的去噪自编码器——这正好是扩散模型的核心。 接下来笔者用自己的思路去介绍SiD。 初级形式 假设我们有一个在目标数据集训练好的教师扩散模型 [...]