Deepseek系列博客目录

Model 核心 Date
DeepSeekLLM 探究LLM Scalling Law 2024.01
DeepSeekMath 提出GRPO 2024.04
DeepSeek-V2 DeepSeekMoE, Multi-Head Latent Attention (MLA) 2024.06
DeepSeek-V3 新版DeepSeekMoE, MTP, 混合精度训练 2024.12
DeepSeek-R1 GRPO应用 2025.01

MoE

一、MoE简介

在Transformer模型的上下文中,MoE由两个主要元素组成:

使用稀疏MoE层代替密集前馈网络(FFN)层。 MoE层具有一定数量的“专家”(例如8个),其中每个专家是一个神经网络。在实践中,专家是FFN,但它们也可以是更复杂的网络,甚至是MoE本身,比如分层MoE。

一种网关网络或路由器,用于确定将哪些令牌发送给哪个专家。 例如,在下图中,令牌“More”被发送到第二个专家,令牌“Parameters”被发送到第一个网络。正如我们稍后将探讨的那样,我们可以向多个专家发送令牌。如何将令牌路由给专家是使用MoE时的一个重大决策:路由器由学习到的参数组成,并与网络的其余部分同时进行预训练。

1. 专家层

  • 专家层用于 替换传统的 FFN(前馈神经网络)结构
  • 每个“专家”实际上是一个 独立的小型 FFN
  • 例如,如果有 8 个专家,那么模型可以根据输入数据动态选择其中的一部分来进行计算,而不是每次都用全部参数。

2. 路由层

  • 决定输入 token 发送到哪个专家 进行处理的模块。
  • 也就是说,在每次推理时,只会使用部分参数,而不是整个模型的全部计算单元。
  • 需要注意的是,路由层每次只选择 top-K 个专家进行激活,而不是所有专家一起工作,这样可以提升计算效率。

3. 负载均衡

  • 需要确保所有专家网络的负载均衡,避免只有某几个专家总是被激活,而其他专家几乎不工作。
  • 如果总是激活固定的少数专家,那么模型最终会变成一个普通的密集(Dense)网络,失去 MoE 的优势。
  • 解决方案是引入辅助损失函数,鼓励模型更均匀地选择不同的专家进行计算,从而提升计算资源利用率

二、MoE存在的挑战

尽管与密集模型相比,MoE提供了高效的预训练和更快的推理等优点,但它们也带来了挑战:

训练:MoE可以显著提高预训练的计算效率,但它们在微调过程中一直难以泛化,导致过度拟合。

推理:虽然MoE可能有许多参数,但在推理过程中只使用其中的一些参数。与具有相同数量参数的密集模型相比,这导致更快的推理。但是,所有参数都需要加载到RAM中,因此对内存的要求很高。例如,给定一个MoE(如Mixtral 8x7 B),我们需要有足够的VRAM来容纳密集的47 参数模型。

Note: 为什么是47B参数而不是8 x 7B = 56B?这是因为在MoE模型中,只有FFN层被视为单独的专家,其余的模型参数是共享的。同时,假设每个token只使用两个专家,推理速度(FLOPs)就像使用12B模型(而不是14B模型),因为它尽管需要计算2x7B矩阵乘法,但有一些层是共享的。

三、 DeepSeekMoE 的改进

1.结构

相较于传统 MoE,DeepSeekMoE 引入了共享专家,并做出了以下优化:

1️⃣ 更精细的专家划分,实现更高的专业化

  • 例如 67B 模型中有 256 个路由专家,每次推理时 激活 8 个专家,相比 QwenMoE 模型更加精细化。

2️⃣ 共享专家减少冗余

  • 共享专家可以让多个 token 复用相同的计算单元,减少整体计算成本,提高计算效率。

3️⃣ 计算路由权重时从 softmax 变为 sigmoid(v3)

  • 这可能是为了避免 softmax 的极端权重分布(即部分专家被高度偏向),让更多专家能够均衡参与计算。

4️⃣ 不需要额外的 loss 进行负载均衡,而是通过偏置权重 b_i进行微调 (v3)

  • 计算量更小,但 效果更好,偏置权重仅用于计算路由,不会影响最终输出的加权求和计算。

2. 数学公式解析

(1) 最终隐藏状态计算

\[h'_t = u_t + \sum_{i=1}^{N_s} \text{FFN}^{(s)}(u_t) + \sum_{i=1}^{N_r} g_{i,t} \text{FFN}^{(r)}_i (u_t)
\]
  • $h'_t $:新的隐藏状态
  • $ u_t $:原始输入
  • $ N_s $:共享专家的个数
  • $ \text{FFN}^{(s)}(u_t) $:共享专家处理后的输出
  • $ N_r $:路由专家的个数
  • $ g_{i,t} \text{FFN}^{(r)}_i (u_t) $:选定专家的加权输出

改进点

  • 共享专家 $ \text{FFN}^{(s)} $ 提供基础特征
  • 路由专家 $ \text{FFN}^{(r)} $ 通过 $ g_{i,t} $ 的权重选择特定专家
  • 这种结构比传统 MoE 计算更稳定,并提高了通用性。

(2) 计算路由权重 $ g_{i,t} $(公式 13)

\[g_{i,t} = \frac{g'_{i,t}}{\sum_{j=1}^{N_r} g'_{j,t}}
\]
  • 归一化专家权重,确保所有专家的贡献总和为 1。

(3) 选择 Top-K 专家 (v2)

\[g'_{i,t} =
\begin{cases}
s_{i,t}, & s_{i,t} \in \text{Topk}(\{s_{j,t} | 1 \leq j \leq N_r \}, K_r) \\
0, & \text{otherwise}
\end{cases}
\]
  • 只激活 Top-K 个专家,其余专家权重设为 0。
  • $ s_{i,t} $ 是 token 对专家的分数。

(4) 计算专家分数 $ s_{i,t} $

\[s_{i,t} = \text{Softmax}(u_t^T e_i) ----- v2
\]
\[s_{i,t} = \text{Sigmoid}(u_t^T e_i) ----- v3
\]
  • 通过 sigmoid 计算专家选择分数。
  • 这里 $ u_t^T e_i $ 代表 token 与专家的匹配度。

(5) 偏置权重优化 (v3)

\[g'_{i,t} =
\begin{cases}
s_{i,t} + b_i, & s_{i,t} + b_j \in \text{Topk}(\{s_{j,t} + b_j | 1 \leq j \leq N_r \}, K_r) \\
0, & \text{otherwise}
\end{cases}
\]
  • 增加了偏置项 $ b_i $,用于优化负载均衡,减少额外 loss 的需求。

MLA

DeepSeek-v2的更多相关文章

  1. 如何搭建自己的SPRING INITIALIZR server

    这两天在慕课学Spring boot ,用idea通过spring initializr新建项目 即使用代理连不上.无奈. 参考了 GitHub - spring-io/initializr: A w ...

  2. Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结

    Atitit. 破解  拦截 绕过 网站 手机 短信 验证码  方式 v2 attilax 总结 1. 验证码的前世今生11.1. 第一代验证码 图片验证码11.2. 第二代验证码  用户操作 ,比如 ...

  3. [Android]Android端ORM框架——RapidORM(v2.1)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...

  4. [Android]Android端ORM框架——RapidORM(v2.0)

    以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...

  5. JuCheap V2.0响应式后台管理系统模板正式发布beta版本

    JuCheap V1.* 查看地址: http://blog.csdn.net/allenwdj/article/details/49155339 经过半年的努力,JuCheap后台通用响应式管理后台 ...

  6. Atitit. 项目文档目录大纲 总集合  v2

    Atitit. 项目文档目录大纲 总集合  v2 -----Atitti.原有项目源码的架构,框架,配置与环境说明 v3 q511 -----Atitit.开发环境 与 工具 以及技术框架 以及 注意 ...

  7. python gettitle v2.0

    #!/usr/bin/env python # coding=utf-8 import threading import requests import Queue import sys import ...

  8. ".NET Compact Framework v2.0 could not be found."

    参考: http://blog.csdn.net/godcyx/article/details/7348431 问题原因: That's a known issue where VS can't di ...

  9. ASP.NET Identity V2

    Microsoft.AspNet.Identity是微软在MVC 5.0中新引入的一种membership框架,和之前ASP.NET传统的membership以及WebPage所带来的SimpleMe ...

  10. Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx

    Atitit.自然语言处理--摘要算法---圣经章节旧约39卷概览bible overview v2 qa1.docx 1. 摘要算法的大概流程2 2. 旧约圣经 (39卷)2 2.1. 与古兰经的对 ...

随机推荐

  1. Golang 入门 : 文件名、关键字与标识符

    Go 的源文件以 .go 为后缀名存储在计算机中,这些文件名均由小写字母组成,如 scanner.go .如果文件名由多个部分组成,则使用下划线 _ 对它们进行分隔,如 scanner_test.go ...

  2. 如何写自己的springboot starter?自动装配原理是什么?

    如何写自己的springboot starter?自动装配原理是什么? 官方文档地址:https://docs.spring.io/spring-boot/docs/2.6.13/reference/ ...

  3. K8S基本概念和组件

    特点 便携性 无论公有云.私有云.混合云还是多云架构都全面支持 可扩展 模块化.可插拔.可挂载.可组合,支持各种形式的扩展 自修复 自保持应用状态.自重启.自复制.自缩放,声明式语法 组件 etcd ...

  4. JVM堆内存(heap)详解

    JAVA堆内存管理是影响性能主要因素之一.堆内存溢出是JAVA项目非常常见的故障,在解决该问题之前,必须先了解下JAVA堆内存是怎么工作的.先看下JAVA堆内存是如何划分的,如图:Java堆内存又溢出 ...

  5. oracle中查看锁表,ORACLE中查看当前系统中锁表情况

    1.ORACLE中查看当前系统中锁表情况 select * from v$locked_object 2.可以通过查询v$locked_object拿到sid和objectid,然后用sid和v$se ...

  6. 10 卷积神经网络CNN原理

    1. 全连接层 前文中我们讨论的几乎都是全连接层,也就是在层间,每个神经元都与前一层的所有神经元相连接,如图: 也就是每层的每个feature,都与前一层所有features相关联,是前一层所有fea ...

  7. 【Legged gym】关于Legged gym用到的roll_out_storages的batch的解析和一些PPO算法层面.config文件里参数的说明

    1. 前言 一方面便于日后自己的温故学习,另一方面也便于大家的学习和交流. 如有不对之处,欢迎评论区指出错误,你我共同进步学习! 2. 正文 2.1 yield 最开始发现于:rollout_stor ...

  8. Unity Shader模板测试-描边

    Unity Shader模板测试描边效果,常用于 rpg 项目中主角被遮挡的情况,将被遮挡的部分的轮廓描边绘制出来,这样可以在任何情况都能知道主角在哪里.(还有另外一种就是使用X光效果,但这种效果不需 ...

  9. 『Plotly实战指南』--面积图绘制与应用

    在数据可视化领域,面积图是一种强大而直观的工具,它通过填充线条与坐标轴之间的区域来量化数据大小, 从而帮助我们清晰地展示数据的总量.趋势变化以及不同类别之间的对比. 无论是分析随时间变化的累积量,还是 ...

  10. 详细介绍MessageQueueSelector

    一.MessageQueueSelector 详解 MessageQueueSelector 是 RocketMQ 提供的一个接口,用于自定义消息发送时的队列选择策略. 通过实现该接口, 开发者可以控 ...