Deepseek技术原理2:最详细图解模型结构MTP和思考

作者: 罗辑

目录

为什么要做MTP(why)

访存密集型瓶颈

训练和推理效率瓶颈

什么是MTP(what)

怎么样实现MTP(how)

原始版MTP

Meta改进版

Meta GPU批次并行预测(batch)

DeepSeek改进版MTP

改进分析

DeepSeek GPU批次并行预测(batch)

DeepSeek MTP优缺点

什么时候做MTP(when)

个人的思考和改进(my suggestion)

参考文献


摘要:火热的DeepSeek模型结构的改进上,除了MLA、MOE,还有个MTP(Multi-Token Prediction)--多词预测,简单说是:让模型在训练时,一次性预测多个未来词(token),而不是仅仅预测下一个词(token)。这样计算loss时,除了和next token计算loss外,还可以和未来的token标签进行多个loss的计算,效果上可以加速模型收敛。

DeepSeek V3原始论文中的示意图,把几件事情杂糅在一起,所以看着理解起来有点费劲,别急,我会详细的剖析,拆分成多个环节来讲,结合图示讲解。做一次史上最详细讲解。

为什么要做MTP(why)

当前主流的大模型(LLM)都是decoder模型结构,传统训练方法是一个词一个词的做文本续写,叫token-by-token。实际操作过程中会面临两个瓶颈。

访存密集型瓶颈

每次在生成一个token的时候,都要频繁从显存中读取缓存的向量(加载KV-Cache),频繁跟访存交互,再通过多层神经网络做完整的前向计算。GPU擅长大规模并行计算,但显存访存效率形成训练和推理的瓶颈。

训练和推理效率瓶颈

训练时,每次在只用下一个token的预测结果,来计算loss更新模型,效率不高,同时,推理是也是token-by-token一个个的预测,效率也低,也跟人类做文本续写方式不太一致。虽然我们没法下笔时全篇都考虑清楚了,但是当前词语的下下一个词,多半提前已经在心里构思好了,不需要等到写完一个词语再停下来想一个词。

什么是MTP(what)

MTP(Multi-Token Prediction)实际上就是将大模型原始的1-token的生成,转变成multi-token的生成,从而提升训练和推理的性能。具体来说,在训练阶段,一次生成多个后续token,可以一次学习多个后续位置上的label,进而有效提升样本的利用效率,提升训练速度;在推理阶段通过一次生成多个后续token,实现成倍的推理加速来提升推理性能。

用个示意图可以表示为:

通过【1】预测后续的【2345】,假如【2345】都是准的话,下一个预测的词就是【6】了,这样就提高了3倍预测效率。

说的深刻一点。传统方法的问题(预测下一个token):

训练阶段:token-by-token生成,是一种局部感知的训练方法,难以学习长距离的依赖关系。

推理阶段:逐个token生成,推理速度较慢

MTP方法(一次预测多个token):

  • 训练阶段:通过预测后续多步的token,迫使模型学到更长的token依赖关系,从而更好理解上下文,避免陷入局部决策的学习模式。同时一次预测多个后续token,可大大提高样本的利用效率,相当于一次预估可生成后续多个<predict, label>样本,能收集到多个loss来更新模型,有助于模型加速收敛。
  • 推理阶段:并行预估多个token,可提升推理速度。

怎么样实现MTP(how)

原始版MTP

MTP最早可以追溯到Google在18年发表在NIPS上的工作,18年是Transformer诞生年,还没有大模型,但那时提出MTP的原理更现在的MTP相差不大。

直观的示意图如下:

可以看到,模型在做词语接龙时,把前文进行了编码,然后并行预测了后面几个词。

原始论文的示意图如下:

原始论文示意为用“I saw a dog ride”去同时预测后续的“in”“the”“bus”。

Meta改进版

原始版MTP有个什么问题呢?因为那时候当前LLM的decoder架构还不受到重视,因此meta结合当前LLM的架构,重新设计了更符合大模型的MTP。

结合前面那个中文预测的示意图,可以理解为:

除了将模型结构更具体化成transformer的block外,还保留了在训练时的前后依赖关系,业界称为“因果关系”。

Meta GPU批次并行预测(batch)

大模型所谓的“因果关系”具体过程如下:

第一步:当输入第一个词时,同时预测后续4个词,即为图中的粉红色[2,3,4,5]。示意图如下:

第二步:当输入第一、二个词时,同时预测后续4个词,即为图中的粉红色[3,4,5,6]。示意图如下:

也就是在预测[3,4,5,6]时,输入的是[1,2],而不是单单[2],但实际操作时,因为第一步预测时,已经输入了[1],而且[1]已经在GPU中缓存起来了,所以实际操作时,仅再补充输入[2]就行了,所以有些示意图就简单画的输入[2],我们要理解它是有用到[1]的。

同理,

当输入第一、二、三个词[1,2,3]时,同时预测后续4个词,即为图中的粉红色[4,5,6,7]。示意图如下:

因为GPU在训练时,是支持批量同时训练的,多条数据组成一个batch批次,同时并行计算,因此,可以把上面几个训练画在一张图里,就变成了如下原始论文形式:

如果没有上面的铺垫,就很难看懂原始论文中的图示意思,包括DeepSeek论文中的MTP示意图。

DeepSeek改进版MTP

Meta版MTP有什么问题没呢?那就是除了next token(下一个词)比较准之外,后面的第二、第三个词,不太准。这个也很好理解。比如我们用“春天到了,又”去同时预测后续的“到了”“万物”“复苏”的三个词。我们知道,两个词语越接近,就关联性越强,也就越容易预测,反之则越远越难预测,用“春天到了,又”预测“复苏”难度太大。所以第二、第三个词基本上没法预测准,因为缺失太多中间词语,语义信息有缺失。这会导致预测第二、第三个词的神经网络没法训练到收敛。

但Meta版MTP也提到另一个重要的点,就是虽然第二、第三个词预测不太准,但训练时,它因为和shared编码网络有神经元连接,在训练阶段,可以通过梯度回传,更新shared编码网络参数,达到加速shared编码网络训练的过程。而这正是DeepSeek想要的,加快训练过程,从而节省训练的时间成本,也能节省电力开销。

添加的第二个词预测头(head2)的loss产生的梯度传递如下图所示。

奔着“加快训练过程”这个目的去的看DeepSeek的模型改进,就非常能理解他的做法。首先,目的是为了得到一个能预测next token的完整LLM大模型,我们称之为主模型。第二,通过一定的方式,使用第二、第三个词预测来加快主模型的训练速度。

完整的主模型长啥样呢?如下图。一个标准的且普通得不能再普通的大模型结构,通过用词语t1,去预测生成T2,和真实标签t2比对,计算交叉熵损失函数,然后反向梯度回传,更新整个模型。

那如果是领导要求你改一下模型结构,去辅助预测后续词语token,还能反向更新整个模型参数,你会从那里搭线出去?

改进分析

我们知道,图中那个output head接收的transformer block处理后的向量,专门预测t2的,不可能强制让他变成预测t3,也就是不能从图中output head之后接额外的网络结构。那如果从L个(L=32)transformer block中间引线出来,比如第30个transformer block中间引线出来,预测后续词语token,那第31、第32个transformer block因为没有连接后续词语token的预测,无法梯度回传到第31、第32个transformer block,他两个block的参数就无法得到更新。

自然而然,我们能想到的,就是从最后一个block搭线出去。如下图:

这样后续词语token的预测loss,能梯度回传到所有transformer block,就能最大程度覆盖主模型的所有神经元,除了output head专门用来预测t2的结构外。

搞定一个搭线问题后,我们解决第二个问题,应该引入什么样的网络结构来预测后续token?我们最初分析了,本身后续第二、第三个词基本上没法预测准,我们就简化处理,同时参照了meta MTP那种因果关系,实际上用的是[t1,t2]去预测[t3].最简单的方式,就是再用一个transformer block专门去预测[t3],请注意,用1个,而不是L=32个。

因此,设计的示意图就如下:

当然有个小细节就是,transformer block只接受一个token的向量,我们刚才的设计草稿,让transformer block输入了两个token的向量(一个是红色箭头,一个是t2),因此需要合并一下,如何合并,就是添加一个线性层,将两个向量压缩融合成一个向量,在送进transformer block。2个向量融合成1个向量如下图:

因此,我们添加的辅助预测后续词语的网络结构就设计出炉了。

图中红框1就是向量融合,红框2就是1个标准的transformer block,输出的output就是预测t3、t4等后续词语。

同时为了进一步压缩模型参数量,我们用相同的embedding层,用来把文字词语编码成向量,也就是embedding layer是共享的。同时,output head也可以共享。只要output head输入的向量不同,他就可以用来预测t3,t4。

因此,我们把他级联起来,可以得到如下一个图。

再次提醒,新加的辅助模块用来预测[t3,t4]的transformer block是1个,而不是L=32个。

DeepSeek GPU批次并行预测(batch)

参照3.2.1中meta MTP的并行“因果关系”训练的具体过程,可以把一个batch中的多条记录,画在一张图上,就成了如下所示:

美化一下,调整一下排版,就成了DeepSeek论文中的样子。

这样分析下来,仿佛我如果在DeepSeek工作的话,我也能提出这种结构上的优化的错觉,没有任何难度,哈哈哈哈,当事后诸葛亮就是爽。

DeepSeek MTP优缺点

  • 缺点:根据之前的分析,MTP原始的优势:加速推理,在DeepSeek这种模型结构下不适用,从模型结构上也可以看出,预测[t3]时,[t2]仅仅经过了1个transformer block,肯定对信息的提取程度是不够的。所以理论上这套模型架构就无法准确预测[t3,t4,t5,t6],所以论文里面也提到,训练完模型做推理时,基本上还是预测下一个词,丢掉了预测后续多个词的辅助模型结构,也就是仅仅保留了main model。反过来说,如果[t3,t4,t5,t6]能一次性预测准,按照中国人的调性,牛逼得吹得老高了,而他们没有提这点,而是用的“directly discard”,肯定也是因为不准。
    看看论文中的表述:MTP in Inference. Our MTP strategy mainly aims to improve the performance of the main model, so during inference, we can directly discard the MTP modules and the main model can function independently and normally.
  • 优点1:meta MTP有提到通过后续词语的loss,辅助主模型的梯度更新,这个优点在DeepSeek模型架构上,得到最大程度的保留。首先后续词语的loss能通过梯度回传,覆盖main model的所有transformer block,能辅助他们加快收敛。其次output head也是共享的,理论上也能接收到后续词语的loss影响,而且embedding layer也是共享的,所以整个main model的所有部件,都能受到后续词语的loss影响,最大程度的加快了main model的收敛。

优点2:因为main model的所有部件,都参与到了后续多个词语的训练,理论上这样的模型,多少也有点远程的规划能力,就是说第一个词语时,大概也有点知道第3,4,5个词了,所以也会稍微比只知道第二个词的模型聪明一点,这点DeepSeek做了实验。也有结果对比。会稍微好点,但不多。

什么时候做MTP(when)

经过刚才的详细分析,知道DeepSeek的MTP预测后续多个词语不准,但是可以加速模型收敛,所以在模型急需收敛的预训练阶段,加入这项技术是最合适的,在后训练以及微调时,因为语料也不是很大了,模型急需收敛的矛盾不突出,另外它的第二个优点:提升模型长程推理能力,这个效果并不太显著,属于锦上添花。所以结论就是:在预训练阶段做MTP最合适。

个人的思考和改进(my suggestion)

DeepSeek的MTP有优点但也称不上完美,还可以进一步改进,个人认为可以从两个方面。第一,我们知道,两个单词之间的距离越远,相关性越差,预测也就越不准。那在计算loss时,需要设置一个衰减因子来调节后续词语loss的权重。DeepSeek这里简单设置成一个平均值λ,个人认为这里的衰减因子应该设置成一个随距离呈指数衰减的形式更合理,更接近实际文本之间的相关性,参照GAE对未来奖励的估计那种的设计。

这样,强调离得越近,就应该越准,越远,就不要求多准了。可能会更合适一点。

第二,模型结构上的优化也是有些改进工作可以做。

下回接着分析和改进DeepSeek。请持续关注我。谢谢。

参考文献

  1. https://zhuanlan.zhihu.com/p/18056041194?utm_campaign=shareopn&utm_medium=social&utm_psn=1875842954712723456&utm_source=wechat_session&utm_id=0
  2. [2404.19737] Better & Faster Large Language Models via Multi-token Prediction
  3. https://proceedings.neurips.cc/paper_files/paper/2018/file/c4127b9194fe8562c64dc0f5bf2c93bc-Paper.pdf
标题“51单片机通过MPU6050-DMP获取姿态角例程”解析 “51单片机通过MPU6050-DMP获取姿态角例程”是一个基于51系列单片机(一种常见的8位微控制器)的程序示例,用于读取MPU6050传感器的数据,并通过其内置的数字运动处理器(DMP)计算设备的姿态角(如倾斜角度、旋转角度等)。MPU6050是一款集成三轴加速度计和三轴陀螺仪的六自由度传感器,广泛应用于运动控制和姿态检测领域。该例程利用MPU6050的DMP功能,由DMP处理复杂的运动学算法,例如姿态融合,将加速度计和陀螺仪的数据进行整合,从而提供稳定且实时的姿态估计,减轻主控MCU的计算负担。最终,姿态角数据通过LCD1602显示屏以字符形式可视化展示,为用户提供直观的反馈。 从标签“51单片机 6050”可知,该项目主要涉及51单片机和MPU6050传感器这两个关键硬件组件。51单片机基于8051内核,因编程简单、成本低而被广泛应用;MPU6050作为惯性测量单元(IMU),可测量设备的线性和角速度。文件名“51-DMP-NET”可能表示这是一个与51单片机及DMP相关的网络资源或代码库,其中可能包含C语言等适合51单片机的编程语言的源代码、配置文件、用户手册、示例程序,以及可能的调试工具或IDE项目文件。 实现该项目需以下步骤:首先是硬件连接,将51单片机与MPU6050通过I2C接口正确连接,同时将LCD1602连接到51单片机的串行数据线和控制线上;接着是初始化设置,配置51单片机的I/O端口,初始化I2C通信协议,设置MPU6050的工作模式和数据输出速率;然后是DMP配置,启用MPU6050的DMP功能,加载预编译的DMP固件,并设置DMP输出数据的中断;之后是数据读取,通过中断服务程序从DMP接收姿态角数据,数据通常以四元数或欧拉角形式呈现;再接着是数据显示,将姿态角数据转换为可读的度数格
MathorCup高校数学建模挑战赛是一项旨在提升学生数学应用、创新和团队协作能力的年度竞赛。参赛团队需在规定时间内解决实际问题,运用数学建模方法进行分析并提出解决方案。2021年第十一届比赛的D题就是一个典型例子。 MATLAB是解决这类问题的常用工具。它是一款强大的数值计算和编程软件,广泛应用于数学建模、数据分析和科学计算。MATLAB拥有丰富的函数库,涵盖线性代数、统计分析、优化算法、信号处理等多种数学操作,方便参赛者构建模型和实现算法。 在提供的文件列表中,有几个关键文件: d题论文(1).docx:这可能是参赛队伍对D题的解答报告,详细记录了他们对问题的理解、建模过程、求解方法和结果分析。 D_1.m、ratio.m、importfile.m、Untitled.m、changf.m、pailiezuhe.m、huitu.m:这些是MATLAB源代码文件,每个文件可能对应一个特定的计算步骤或功能。例如: D_1.m 可能是主要的建模代码; ratio.m 可能用于计算某种比例或比率; importfile.m 可能用于导入数据; Untitled.m 可能是未命名的脚本,包含临时或测试代码; changf.m 可能涉及函数变换; pailiezuhe.m 可能与矩阵的排列组合相关; huitu.m 可能用于绘制回路图或流程图。 matlab111.mat:这是一个MATLAB数据文件,存储了变量或矩阵等数据,可能用于后续计算或分析。 D-date.mat:这个文件可能包含与D题相关的特定日期数据,或是模拟过程中用到的时间序列数据。 从这些文件可以推测,参赛队伍可能利用MATLAB完成了数据预处理、模型构建、数值模拟和结果可视化等一系列工作。然而,具体的建模细节和解决方案需要查看解压后的文件内容才能深入了解。 在数学建模过程中,团队需深入理解问题本质,选择合适的数学模
以下是关于三种绘制云图或等高线图算法的介绍: 一、点距离反比插值算法 该算法的核心思想是基于已知数据点的值,计算未知点的值。它认为未知点的值与周围已知点的值相关,且这种关系与距离呈反比。即距离未知点越近的已知点,对未知点值的影响越大。具体来说,先确定未知点周围若干个已知数据点,计算这些已知点到未知点的距离,然后根据距离的倒数对已知点的值进行加权求和,最终得到未知点的值。这种方法简单直观,适用于数据点分布相对均匀的情况,能较好地反映数据在空间上的变化趋势。 二、双线性插值算法 这种算法主要用于处理二维数据的插值问题。它首先将数据点所在的区域划分为一个个小的矩形单元。当需要计算某个未知点的值时,先找到该点所在的矩形单元,然后利用矩形单元四个顶点的已知值进行插值计算。具体过程是先在矩形单元的一对对边上分别进行线性插值,得到两个中间值,再对这两个中间值进行线性插值,最终得到未知点的值。双线性插值能够较为平滑地过渡数据值,特别适合处理图像缩放、地理数据等二维场景中的插值问题,能有效避免插值结果出现明显的突变。 三、面距离反比 + 双线性插值算法 这是一种结合了面距离反比和双线性插值两种方法的算法。它既考虑了数据点所在平面区域对未知点值的影响,又利用了双线性插值的平滑特性。在计算未知点的值时,先根据面距离反比的思想,确定与未知点所在平面区域相关的已知数据点集合,这些点对该平面区域的值有较大影响。然后在这些已知点构成的区域内,采用双线性插值的方法进行进一步的插值计算。这种方法综合了两种算法的优点,既能够较好地反映数据在空间上的整体分布情况,又能保证插值结果的平滑性,适用于对插值精度和数据平滑性要求较高的复杂场景。
内容概要:本文详细介绍并展示了基于Java技术实现的微信小程序外卖点餐系统的设计与实现。该系统旨在通过现代信息技术手段,提升外卖点餐管理的效率和用户体验。系统涵盖管理员、外卖员、餐厅和用户四个角色,提供了包括菜品管理、订单管理、外卖员管理、用户管理等功能模块。后台采用SSM框架(Spring + Spring MVC + MyBatis)进行开发,前端使用微信小程序,数据库采用MySQL,确保系统的稳定性和安全性。系统设计遵循有效性、高可靠性、高安全性、先进性和采用标准技术的原则,以满足不同用户的需求。此外,文章还进行了详细的可行性分析和技术选型,确保系统开发的合理性与可行性。 适用人群:计算机科学与技术专业的学生、从事Java开发的技术人员、对微信小程序开发感兴趣的开发者。 使用场景及目标:①为中小型餐饮企业提供低成本、高效的外卖管理解决方案;②提升外卖点餐的用户体验,实现便捷的点餐、支付和评价功能;③帮助传统餐饮企业通过数字化工具重构消费场景,实现线上线下一体化运营。 其他说明:该系统通过详细的系统分析、设计和实现,确保了系统的稳定性和易用性。系统不仅具备丰富的功能,还注重用户体验和数据安全。通过本项目的开发,作者不仅掌握了微信小程序和Java开发技术,还提升了独立解决问题的能力。系统未来仍需进一步优化和完善,特别是在功能模块的细化和用户体验
Retinex理论是计算机视觉和图像处理领域中一种重要的图像增强技术,由生理学家Walter S. McCann和James G. Gilchrist在20世纪70年代提出,旨在模拟人类视觉系统对光照变化的鲁棒性。该理论将图像视为亮度和色度的函数,分别对应局部强度和颜色信息。其核心思想是将图像分解为反射分量(物体自身颜色)和光照分量(环境光影响),通过分离并独立调整这两个分量来增强图像对比度和细节。 在Matlab中实现Retinex算法通常包括以下步骤:首先对输入图像进行预处理,如灰度化或色彩空间转换(例如从RGB到Lab或YCbCr),具体取决于图像特性;然后应用Retinex理论,通常涉及对图像进行高斯滤波以平滑图像,并计算局部对比度。可以采用多尺度Retinex(MSR)或单尺度Retinex(SSR)方法,其中MSR使用不同尺度的高斯滤波器估计光照分量,以获得更平滑的结果;接着对分离后的反射分量进行对比度拉伸或其他对比度增强处理,以提升图像视觉效果;最后将调整后的反射分量与原始光照分量重新组合,生成增强后的图像。如果存在“retinex.txt”文件,其中可能包含实现这些步骤的Matlab代码。通过阅读和理解代码,可以学习如何在实际项目中应用Retinex算法,代码通常会涉及定义图像处理函数、调用Matlab内置图像处理工具箱函数以及设置参数以适应不同图像。 在研究和应用Retinex算法时,需要注意以下关键点:一是参数选择,算法性能依赖于高斯滤波器尺度、对比度拉伸范围等参数,需根据具体应用调整;二是运算复杂性,由于涉及多尺度处理,算法计算复杂度较高,在实时或资源受限环境中需优化或寻找高效实现方式;三是噪声处理,Retinex算法可能放大噪声较大的图像中的噪声,因此实际应用中可能需要结合去噪方法,如中值滤波或非局部均值滤波。通过深入理解和应用Retinex算法,不
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值