Day: May 28, 2024

深度学习中的状态空间模型(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。 初级形式 假设我们有一个在目标数据集训练好的教师扩散模型 [...]

Fast Transformer Decoding: One Write-Head is All You NeedFast Transformer Decoding: One Write-Head is All You Need

引言 《Fast Transformer Decoding: One Write-Head is All You Need》是一篇提出了一种变换模型多头注意力机制变体的研究论文。该论文解决了变换模型在增量推理过程中由于反复加载大规模“键”和“值”张量而导致的内存带宽成本问题。 论文要点 1. 多查询注意力(Multi-Query Attention) 作者提出了一种称为多查询注意力的变体,其中键和值在所有注意力头之间共享。这种方法减少了张量的大小以及在增量解码过程中对内存带宽的需求。 2. 内存带宽的减少 通过共享键和值,所提出的方法显著减少了在解码过程中反复加载这些张量的内存带宽成本。 3. 更快的解码速度 采用多查询注意力的模型在解码速度上比传统的多头注意力模型要快得多。 4. 质量轻微下降 作者通过实验验证了多查询注意力模型在相较于基线模型的情况下,质量仅有轻微下降。 进一步了解 通过这篇论文,我们可以看到在不牺牲太多模型质量的前提下,通过优化内存带宽和共享键值对,可以显著提高变换模型的解码速度。这对于提升自然语言处理任务中的推理效率具有重要意义。 多查询注意力 多查询注意力是一种注意力机制,其中键和值在所有注意力头之间共享。这意味着在解码过程中,只需要加载一次键和值向量,从而显著减少了内存带宽成本。 传统多头注意力 传统的多头注意力是一种注意力机制,其中每个注意力头都有自己的键和值向量。这意味着在解码过程中,需要反复加载这些向量,从而导致内存带宽成本高。 [...]

OpenVINO-Java-APIOpenVINO-Java-API

📚 简介 OpenVINO™ 是一个用于优化和部署 AI 推理的开源工具包,旨在提升深度学习在计算机视觉、自动语音识别、自然语言处理和其他常见任务中的性能。它支持使用流行框架(如TensorFlow,PyTorch等)训练的模型,减少资源需求,并在从边缘到云的一系列英特尔®平台上高效部署。 该项目通过Java Native Access (JNA) 实现了基于OpenVINO™工具套件的OpenVINO™ Java API,旨在推动 OpenVINO™在Java领域的应用。由于是基于 OpenVINO™ 开发,OpenVINO™ Java API 支持的所有平台与OpenVINO™ 一致。 版本计划 Java库公示 ⚙ 如何安装 以下文章提供了OpenVINO™ Java API在不同平台的安装方法,可以根据自己使用的平台进行安装。 简短安装步骤 详细使用文档 🏷 [...]

GQA: 从多头检查点训练广义多查询变换模型GQA: 从多头检查点训练广义多查询变换模型

引言 在自然语言处理领域,如何在不牺牲模型质量的前提下实现更快的推理速度一直是一个重要的研究课题。本文将介绍一篇名为《GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints》的研究论文,该论文提出了一种从多头检查点训练广义多查询变换模型的方法,旨在解决这一挑战。 论文贡献 1. 现有多头语言模型检查点的再训练 论文提出了一种再训练现有多头语言模型检查点的方法,将其转换为具有多查询注意力(MQA)的模型。MQA使用单个键值头,大幅加快解码器推理速度。通过仅使用原始预训练计算量的5%,再训练现有模型,作者旨在实现更快的推理速度,而无需单独训练一个新模型。 2. 引入分组查询注意力(GQA) 论文引入了GQA,作为MQA的一种广义形式。GQA使用中间数量的键值头,数量介于1和查询头总数之间。该方法旨在平衡MQA的速度和多头注意力的质量。作者通过实验表明,再训练的GQA模型在保持与MQA相当速度的同时,能够达到接近多头注意力的质量。 方法与实验结果 再训练方法 论文详细介绍了再训练现有多头语言模型检查点的具体步骤。通过仅使用原始预训练计算量的5%,再训练现有模型,使其具备MQA的特点,从而实现更快的推理速度。 GQA的实现 GQA通过使用中间数量的键值头,增加了模型的灵活性和适应性。实验结果表明,再训练的GQA模型在多个自然语言处理任务中表现出色,质量接近于多头注意力,同时推理速度与MQA相当。 结论 本文提出的方法为实现更快的推理速度提供了一个有效的解决方案,而无需牺牲模型质量。通过再训练现有多头语言模型检查点,并引入分组查询注意力(GQA),可以在保持高质量的同时,实现高效的推理。这一研究对于提升变换模型在各类自然语言处理任务中的效率和性能具有重要意义。 进一步了解: [...]

缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA缓存与效果的极限拉扯:从MHA、MQA、GQA到MLA

引言 最近,幻方发布的DeepSeek-V2引起了广泛关注。其1块钱100万token的价格令人惊叹,而背后的关键技术之一——MLA(Multi-head Latent Attention)更是备受瞩目。本文将带大家梳理从MHA、MQA、GQA到MLA的演变历程,并深入介绍MLA的设计思路。 MHA:多头注意力 MHA(Multi-Head Attention)是《Attention is all you need》提出的注意力机制的基础。它通过多个独立的单头注意力拼接而成,广泛应用于当前的主流LLM(大语言模型)。 MHA的设计使得每个注意力头(Head)都有独立的键(Key)、值(Value)和查询(Query)向量,这些向量通过线性变换得到。MHA的计算量和存储开销较大,特别是在长上下文(Context)情况下,KV Cache(键值缓存)会占用大量显存。 瓶颈:为何降低KV Cache大小如此重要? LLM的推理主要在GPU上进行,而GPU显存有限。一部分显存用于存放模型参数和激活值,另一部分用于存放KV Cache。随着上下文长度增加,KV Cache的大小会逐渐占据主导地位,可能超出单张卡甚至单台机器的显存容量。 减少KV Cache的目的是在更少的设备上推理更长的上下文,或在相同上下文长度下提高批处理大小,从而实现更快的推理速度或更大的吞吐量,最终降低推理成本。 MQA:多查询注意力 MQA(Multi-Query Attention)是减少KV Cache的一次尝试,首次提出于《Fast Transformer Decoding: One Write-Head is All [...]