继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

DeepSeek解析4:多词预测详解

陪伴而非守候
关注TA
已关注
手记 398
粉丝 62
获赞 285
DeepSeek 如何在文本生成中更好地平衡效率与质量

这是作者用ChatGPT生成的图片。

这是DeepSeek-V3系列文章的第四篇,我们将解释DeepSeek [1, 2]模型中的重大架构创新:多令牌输出预测

在之前的几篇文章中,我们解释过 DeepSeek 如何仔细权衡各种架构权衡,
确保术语的一致性和正式的语调,同时使用“文章”来保持流畅和风格一致性,并在“文章”后添加逗号以提高可读性。

在这篇文章中,我们将分析DeepSeek如何在生成文本方面权衡效率和质量之间的平衡。

目录如下:

  • 背景:介绍大型语言模型(LLM)中解码过程的基本原理,特别是下一个词预测的工作原理及其局限性。我们还会回顾关于多词预测(MTP)的先前研究,讨论其设计选择以及优势与局限。

  • DeepSeek的多词预测:解释其工作原理并讨论设计选择,重点介绍它与先前研究的差异。此外,我们还会介绍DeepSeek的MTP策略如何与推测解码结合以加速推断。

  • 评估:讨论MTP对训练效果和推断效率的影响。

  • 总结。

  • 参考文献。
背景信息

要了解DeepSeek的多令牌预测,我们不妨先来看看大型语言模型是如何生成文本的。

下一个标记预测

通常,大型语言模型采用自回归的方式来生成文本,即给定一串之前的标记,新的标记会以逐字逐句的方式生成,预测最有可能的下一个标记。

例如,对于文本“ The cat sat”,它将被分词成如下标记序列:

    "猫坐那儿" -> ["猫", "坐", "那儿"]

每个 token 都有一个与它在词汇表中的索引相对应的 token ID,并将通过该索引从嵌入矩阵中查找,映射到稠密向量。在大多数情况下,会在该稠密向量中添加一个位置嵌入,以形成将传递给大规模语言模型的嵌入。

    Emb("The") = vector("The") + PositionalEncoding(1),  
    Emb("猫") = vector("猫") + PositionalEncoding(2),  
    Emb("坐着") = vector("坐着") + PositionalEncoding(3)

经过LLM中的Transformer层之后,最后一层通常是将每个嵌入向量通过线性映射映射回词汇的词汇空间,然后通过Softmax函数输出每个词汇的概率。在我们这个例子中,概率最高的那些标记可能是这些标记。

P("在") = 0.7,  
P("在...底下") = 0.3,  
...

因此,模型会选择最有可能的词“on”,生成的文本就会是这样的。

    "猫坐在了上面。"

此逐字过程将持续到达到最大长度限制或遇到EOS(句末)标记为止。由于它每次只生成一个标记,因此通常被称为下一个词预测,这一过程可以更正式地描述为

哪里

  • t 表示第 t 个时间步骤。
  • x_{t:1} 表示从 x_1 到 x_t 的 token 序列(代表过去的部分)。
  • x_{t+1} 是下一个 token(代表未来)。

从模型的角度来说,下一个词预测听起来非常自然,但是它存在一些限制。

  • 首先,它无法并行处理,因为需要按顺序逐个处理每个词元。
  • 另外,每个预测都需要进行一次完整的前向传递,这使得训练和推理都非常耗时,尤其是实时生成长文本时。

为了克服这些限制,我们提出了多令牌的预测方法。

之前的多标记预测方法

在[3]中,作者将单词预测扩展成多词预测机制。

如果输入序列相同,模型将通过一次前向计算生成从 (x{t+1}) 到 (x{t+n}) 共 n 个词元。

注意,这并不表示从单个Softmax输出的概率中一次选择n个词元,因为Softmax不支持从单个概率分布中同时选择n个词元。

这是由于Softmax被设计用于类别概率分布,这种分布用于描述在多个互斥的选择中单一的离散事件的概率。因此,Softmax每次只能生成一个标记,为了预测多个标记的话,我们需要设置多个Softmax层,每个层负责生成一个单独的标记。

因此,上述多词预测损失将首先分解为一系列单词预测操作头,然后每个单词预测头将分别运行独立的Softmax来选择对应的词。

更具体地来说,引入了中间潜在表示 ( z_{t:1} ),用来表示大语言模型中的隐藏表示,如以下方程所示。

本文作者基于[3]中的方程式创作的图片。

这将输入序列 x{t:1} 与输出序列解耦开来,使模型能够并通过一次前向传递将 x{t:1} 编码成 z_{t:1},并在所有后续生成过程中重复利用。

那之后,(x{t+n:t+1}) 和 (z{t:1}) 之间的条件概率进一步分解为 (n) 个独立的单步条件,每个代表一个单令牌生成步骤,如蓝色突出显示的那样:

根据[3]中的方程式绘制的图。

在[3]中,这个过程是这样做的:

基于[3]中的方程,作者制作的图片(由作者根据[3]中的方程制作)。

如下图所示,其中

  • 一个共享的Transformer ( fs ) 来对 ( x{t:1} ) 进行编码,生成 ( z_{t:1} ),仅需一次前向传播。
  • ( n ) 个独立的输出头 ( f_{hi} ),实现为Transformer层,将中间隐藏状态 ( z{t:1} ) 映射到 ( x_{t+i} )。特别是当 ( i==1 ) 时,第一个输出头可视为预测下一个标记的头。
  • 一个共享的解嵌入矩阵 ( f_u ),用来将 ( x ) 映射到词汇表大小的维度,然后在上面应用Softmax以得到每个标记的概率。

图1. [3]中的多令牌的预测架构。图片来自文献[3]。

现在让我们更深入地看看这种架构的设计,特别是这些共享与独立组件背后的设计选择。

  • 共享 fs:正如我们之前提到的,这使我们能够通过一次前向传播得到 z{t:1} 以生成 n 个 token,这相比下一个 token 的预测提高了计算效率。
  • 共享 解嵌入矩阵 f_u:这节省了参数预算,对性能影响较小,因为其维度为 d×V,其中 d 是隐藏层维度,V 是词汇表大小(通常为 50~200K)。
  • 独立 的 head:这是架构中唯一不共享的部分。如前所述,每个 token 需要一个单独的 Softmax,因此我们不能共享所有组件。

使用独立的输出头设计解耦了生成n个令牌的过程,使它们彼此独立。一方面,这使得令牌生成过程变得并行化,并有可能提高训练效率。然而,独立生成令牌可能会导致不连贯和不一致的输出。此外,模型可能会出现模式崩溃的情况,倾向于生成通用且频繁出现的词汇,而不是细微的回应,从而降低输出的多样性和丰富度。

接下来,我们将看到DeepSeek的这项多令牌预测方法如何解决这个问题。

DeepSeek多令牌预测功能

正如我们之前所解释的,[3] 中的多令牌预测方法独立生成 n 个令牌,这可能导致输出不连贯甚至模式崩溃。为了解决这个问题,DeepSeek 通过保持每个令牌预测的完整因果联系来实现他们的多令牌预测,如下图所示的。

图2展示了DeepSeek中的多令牌预测功能。图片引自[2]。

上面的图展示了三个步骤,分别称为主模型,、MTP模块1和MTP模块2。

主模型的架构与我们在[3]中看到的非常相似,也包括三个主要模块。

  • 一个共享的词嵌入层。
  • 一个独立的Transformer模块(块)。
  • 还有一个共享的线性输出头,类似于[3]中提到的解嵌入矩阵。

然而,从MTP模块1起,这样的差异就变得明显了,因为输入到Transformer块的依赖于前一个token的表示。

更具体地来说,第 i 个词元的 Transformer 输入如下所示:

这儿

  • k 表示 MTP 模块的索引。
  • h^{k-1}_{i} 是上一步的表示。
  • Emb(t_{i+k}) 是第 (i+k) 个 token 的嵌入输出。
  • RMSNorm 操作对两个表示向量进行归一化,使它们的值更具可比性,并允许它们被拼接。随后通过 [·;·] 拼接操作符生成 2d 表示。
  • 最后应用线性投影矩阵 M_k,将维度从 2d 调整回 d,使其准备好供 Transformer 使用。

引入 MTP 模块之间的依赖关系虽然打破了 [3] 中的并行性,但使得生成的文本更加连贯,更适合用于对话和推理等场景。

多令牌预测主要应用于DeepSeek模型的训练过程,每个模块都会采用交叉熵损失,如下所述:

其中 (t{i}) 表示在第 (i) 位置的“真实标记”,而 (p^{k}{i}[t_i]) 是第 (k) 个MTP module预测的 (t_i) 的概率。

所有MTP损失的总和作为额外的训练目标。

在推理阶段中,所有的MTP模块将不再使用,仅使用主模型来进行预测。不过,作者在[2]中也提到,他们的MTP技术可以与推测性解码结合以加快推理速度。

那到底是怎么操作的呢?

猜测性解码

Speculative是一种利用草稿再验证范式的技术手段,旨在通过并行生成多个候选词,随后用原来的自回归(AR)模型验证或修正这些候选词,来加速自回归生成过程,如下面的图所示:

图3. 推测解码草图。图片来自[5]。

更具体地说,投机性解码分为两个步骤。

  • 并行生成标记:不是使用原始的自回归模型逐个生成标记,而是通过并行解码并行生成标记。
  • 批处理验证:使用原始的自回归模型通过一次传递来验证生成的标记,直接接受或在必要时进行修正。

由于草拟的代币可能会被接受或拒绝,实际的性能提升主要看接受率。

  • 在理想情况下,所有被抽取的K个token都会被接受,这使得模型能够通过一次前向传递推进K步,从而实现K倍的速度提升。
  • 如果某些token被拒绝,生成流程仍然受益于一定的加速,因为只需要重新生成被拒绝的那些token,而不需要重生成整个序列。

换句话说,更高的接受比例可以带来更大的加速。在接下来的一节中,我们将看到DeepSeek是如何在推理过程中更详细地应用这一技术的。

评估

在文献[2]中,研究者们评估了这一多令牌预测方法在训练和推理阶段的表现。

对训练效果的影响

为了看看他们的多令牌预测方法是否对模型训练有帮助,[2]的作者在两个不同规模的MoE模型上进行了实验,看看效果如何。

  • 较小的15.7B模型,激活参数为2.4B个,如下表中用蓝色标出;
  • 较大的228.7B模型,激活参数为20.9B个,如下表中用绿色标出;

图4. 多令牌预测法对训练表现的影响。图由作者基于[2]中的表格绘制。

在这两个模型中,他们比较了原模型与带有额外MTP模块的变体之间的性能表现,并保持其他设置相同。在这个实验中,简单地在推理时丢弃了MTP模块,因此,推理时间没有差异。

根据上述表格的结果,在两种设置中添加MTP后,多个任务的整体性能都有所提升,这表明我们提出的MTP策略确实有效。

对推理速度的影响

而不需要完全丢弃 MTP 模块,如前所述,我们也可以在进行推理时将推测性解码与 MTP 模块结合使用,从而加快推理速度。

在[2]中,作者们通过MTP技术尝试通过预测接下来的两个词,并将其与推测性解码结合,他们发现第二个词的预测接受率为大约在85%到90%左右,表明他们的MTP策略生成质量一直都很稳定可靠。

更重要的是,由于这么高的接受率,将MTP与投机解码相结合可以将推理速度提高到1.8倍,以每秒token数(TPS)为衡量标准。

以下为概要

这篇文章探讨了多令牌预测技术,这是DeepSeek的另一项关键架构创新,其在文本生成效率与质量之间平衡的方法。

所有这些设计创新构成了DeepSeek模型的基础,使得DeepSeek模型既高效又强大。

  • 多头潜注意力机制 优化了内存使用,同时在解码过程中保持了模型性能的同时。
  • DeepSeekMoE 在专家混合架构(MoE)中达到了更好的平衡,既促进了知识共享也实现了专家专长的优化。
  • 无辅助损失的负载均衡 确保了有效的负载均衡,从而不妥协主要的训练目标。

重要收获:

  • 大型语言模型训练仍然存在许多未解决的问题,引入新技术常常会导致意外的负面作用。
  • 应对这些挑战需要进行深入分析以及对内部机制的深刻理解。
  • 解决方案并不一定很复杂——有时候,简单的策略也能出乎意料地有效。

这也结束了我们关于模型架构创新的讨论。在下一篇文章中,我们将进一步探讨DeepSeek模型的训练策略,深入了解预训练、微调和对齐过程中的关键设计选择。

谢谢你看我的文章!

参考
打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP