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. 解决PyCharm提示Error: Please select a valid Python interpreter

    前言 Pycharm运行Python3.7.8的程序时发现源程序运行报错(非语法错误) Error:please select a valid Python interpreter 解决 第一步:打开 ...

  2. 软件测试_Fiddler抓包工具

    多数资料摘抄至 https://www.cnblogs.com/miantest/p/7289694.html 一.在 macOS 下如何安装 (https://www.telerik.com/fid ...

  3. 生产环境swarm集群规划和管理

    swarm集群角色 swarm集群中有两种角色,manager node和 worker ndoe. manager的功能: 维护集群状态 任务调度 为swarm集群提供HTTP API 可以创建只有 ...

  4. String类的三种常见构造方法

    1.根据构造方法创建字符串对象 1.public String() 创建一个空字符串,里面不包含任何内容 2.public String(char[] chs) 创建一个字符数组,将其拼接成字符串对象 ...

  5. MongoDB导出/导入操作

    1.从测试环境数据库导出数据 2.导入数据到本地数据库 mongoimport --host localhost --port 27017 --username root --password 123 ...

  6. 🎀Mybatis-Plus中的MetaObjectHandler

    简介 MetaObjectHandler 是一个非常有用的组件,用于处理实体对象中的字段填充逻辑,比如自动填充创建时间.更新时间.创建人.修改人等字段. 组件介绍 MetaObjectHandler ...

  7. windows10 激活教程

    1.环境 适用对象:VL版本的windows OEM版本请使用文末工具激活 1.1查询自己电脑版本 [win+R]->输入[slmgr /dlv]->查看[产品密钥通道] slmgr /d ...

  8. sonarqube+gitlab+jenkins+maven集成搭建(三)

    安装JENKINS 关闭防火墙[root@localhost ~]# systemctl stop firewalld[root@localhost ~]# systemctl disable fir ...

  9. K8s新手系列之Pod中容器的镜像拉取策略

    概述 在 Kubernetes(K8s)里,容器镜像拉取策略(ImagePullPolicy)决定了 K8s 在创建或重启 Pod 时,如何处理容器镜像的拉取操作.这一策略能够确保使用的镜像始终是最新 ...

  10. 勒索病毒分析-2024wdb-re2

    检查相关信息 可以看到病毒存在VMProtect虚拟壳 简单脱壳 首先我在x64debug中运行一次,发现没有中断退出,证明大概率没有反调试,但是有crc检测,所以尽量不下int3断点(脱壳时). 一 ...