Category: AI

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] 其中 [...]

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 [...]

深入解析 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 [...]