T
traeai
登录
返回首页
科学空间

DeepSeek V4的tid2eid是怎么来的?

7.5Score
DeepSeek V4的tid2eid是怎么来的?

TL;DR · AI 摘要

文章探讨了DeepSeek V4模型中tid2eid映射表的生成机制。

核心要点

  • DeepSeek V4采用hash routing替代first_k_dense策略
  • tid2eid通过预定义的映射表为每个token分配expert
  • hash routing能有效提升MoE模型的负载均衡能力

结构提纲

按章节快速跳转。

  1. 介绍DeepSeek V4模型中tid2eid映射表的重要性。

  2. 说明MoE模型在前几层难以实现负载均衡的问题。

  3. 对比DeepSeek V3和V4采用的不同策略。

  4. 解释hash routing如何通过tid2eid映射表分配expert。

  5. 探讨tid2eid映射表的具体生成方法。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • DeepSeek V4的tid2eid机制
    • 问题背景
      • MoE模型负载均衡困难
    • 解决方案演变
      • 从first_k_dense到hash routing
    • hash routing机制
      • tid2eid映射表

金句 / Highlights

值得收藏与分享的关键句。

#深度学习#模型架构#MoE
打开原文

DeepSeek V4的tid2eid是怎么来的? - 科学空间|Scientific Spaces

Image 1: MobileSideBar

SEARCH

MENU

CATEGORIES

NEWPOSTS

COMMENTS

USERLOGIN

科学空间|Scientific Spaces

渴望成为一个小飞侠

  • ![Image 2 欢迎订阅](https://spaces.ac.cn/feed)
  • ![Image 3 个性邮箱](https://spaces.ac.cn/archives/119)
  • ![Image 4 天象信息](https://spaces.ac.cn/ac.html)
  • ![Image 5 观测ISS](https://spaces.ac.cn/archives/41)
  • ![Image 6 LaTeX](https://spaces.ac.cn/latex.html)
  • ![Image 7 关于博主](https://spaces.ac.cn/me.html)

欢迎访问“科学空间”,这里将与您共同探讨自然科学,回味人生百态;也期待大家的分享~

首页信息时代 DeepSeek V4的tid2eid是怎么来的?

15 May

[DeepSeek V4的tid2eid是怎么来的?](https://spaces.ac.cn/archives/11750)

By 苏剑林 | 2026-05-15 | 165位读者 | :

训过MoE的同学都知道,如果把整个模型的MLP部分都换成MoE,那么靠近Embedding的前几层MoE往往很难实现负载均衡。对此,DeepSeek V3,包括我们的Kimi K2,采取的应对策略是“first_k_dense”——顾名思义,就是前 k$k$层不用MoE而用常规的Dense型GLU。到了DeepSeek V4,这个策略改成了“fist_k_hash”。

这里的“hash”指的是“Hash Routing”,提出自《Hash Layers For Large Sparse Models》,它通过一张事先确定的映射表tid2eid来为每个Token分配Expert。本文来探讨一下如何生成这个tid2eid。

问题背景[#](https://spaces.ac.cn/archives/11750#%E9%97%AE%E9%A2%98%E8%83%8C%E6%99%AF)

首先要指出的是,对于前几层MoE,如果用笔者在《MoE环游记:6、最优分配促均衡》《MoE环游记:7、动态激活极简解》所提的Quantile Balancing,其实已经能较大程度上缓解它们的不均衡问题。

至于V4采用Hash Routing,可以说是同一问题在不同方向的尝试,其想法是对于前几层MoE来说,上下文信息并不多,所以基于它的输入向量来选Expert,跟直接基于没有任何上下文信息的Token Id来选,也许并无太大区别。既然如此,不如干脆基于Token Id来预先写死前几层每个Token该激活的Expert,这便是“tid2eid (Token Id to Expert Id)”的由来。

那怎么生成tid2eid这个表格呢?完全随机可以吗?看上去不大行,因为每个Token的出现频率并不一样,完全随机的话反而会导致不均衡。DeepSeek并没有公布这个表格的生成细节,我们只能按照自己的思路去猜测一下。

数学描述[#](https://spaces.ac.cn/archives/11750#%E6%95%B0%E5%AD%A6%E6%8F%8F%E8%BF%B0)

假设一共有 m$m$个不同的Token,第 i$i$个Token的出现频率是 p i$p_{i}$,不失一般性,假设它们已经按从大到小排列,即 p i≥p i+1$p_{i} \geq p_{i + 1}$。我们用 x i,j∈{0,1}$x_{i , j} \in \left{\right. 0 , 1 \left.\right}$表示Token i$i$是否应该激活Expert j$j$(0$0$表示不激活,1$1$表示激活),共有 n$n$个Expert,每个Token选 k$k$个Expert,那么我们实际上要求解方程组

x i,j∈{0,1},∑j=1 n x i,j=k,∑i=1 m p i x i,j≈k n(1)

$$ (\text{1}) x_{i , j} \in \left{\right. 0 , 1 \left.\right} , \sum_{j = 1}^{n} x_{i , j} = k , \sum_{i = 1}^{m} p_{i} x_{i , j} \approx \frac{k}{n} $$

注意最后一个等式我们用了约等于≈$\approx$,这是因为如果改为=$=$,方程组严格来讲未必有解。所以我们保留≈$\approx$的记号,其含义是两端应该尽可能接近。也可以考虑写成优化形式

min x i,j∈{0,1}∑j=1 n(∑i=1 m p i x i,j−k n)s.t.∑j=1 n x i,j=k(2)

$$ (\text{2}) \underset{x_{i , j} \in \left{\right. 0 , 1 \left.\right}}{min} \sum_{j = 1}^{n} \left(\right. \sum_{i = 1}^{m} p_{i} x_{i , j} - \frac{k}{n} \left.\right) \text{s}.\text{t}. \sum_{j = 1}^{n} x_{i , j} = k $$

该问题的一个比较朴素的解法是贪心算法:

按频率从高到低逐Token处理,先统计各Expert的已分配负载,然后选择负载最轻的 k$k$个Expert作为当前Token的激活Expert,随后更新Expert的负载分布。

参考实现[#](https://spaces.ac.cn/archives/11750#%E5%8F%82%E8%80%83%E5%AE%9E%E7%8E%B0)

贪心算法虽然原理上是贪心的,但它大多数情况下都能得到一个近乎最优的解,一个参考实现如下:

python
import numpy as np

# 模拟分布
m, n, k = 80000, 128, 4
p = 1 / (10 + np.arange(m))
p /= p.sum()

# 贪心处理
x, f = np.zeros((m, k), dtype='int32'), np.zeros(n)
for i in range(m):
    j = f.argsort()[:k]
    f[j] += p[i] / k
    x[i] = j

# 评估均衡
max_vio, min_vio = f.max() * n - 1, f.min() * n - 1

注意,该代码没有任何随机的地方,原则上是一个确定性的算法。那如果我们前几层想要不同的tid2eid呢?可以考虑加入一些随机性,比如

python
range(m)

换成

python
np.random.permutation(m)

,即不按照频率从高到低的顺序执行,这样依然能够得到可用的解,只不过均衡性相对差点。我们可以重复跑多次,然后挑max_vio最低的几个解。

延伸拓展[#](https://spaces.ac.cn/archives/11750#%E5%BB%B6%E4%BC%B8%E6%8B%93%E5%B1%95)

现在我们考虑一种极端的情况:p 1≫k/n$p_{1} \gg k / n$,即某个Token的频率已经远超均衡水平,此时无论tid2eid怎么编排,都不可能实现负载均衡。换句话说,只根据单个Token Id来决策,是无论如何也均衡不了的。这种情况下又该如何应对呢?

答案很简单,换一种依赖于更多输入信息的Hash方法。前面我们只根据当前Token Id来决策,实际上每个Token都处于某个序列中,它是有上下文的,如果说之前的做法是“1-gram to expert”,现在我们可以考虑跟它前面的Token一起,组成“2-gram to expert”、“3-gram to expert”等等。

以2-gram (a,b)$\left(\right. a , b \left.\right)$为例,一种朴素的Hash方式是:选大于 m$m$的质数 q$q$,计算(a q+b)mod n$\left(\right. a q + b \left.\right) mod n$作为激活的Expert,用不同的质数重复 k$k$次就得到 k$k$个Expert。由于增加了gram数,输入的组合数大大增加,然后映射到有限的 n$n$个数中,每个数大概率都能被“塞满”,所以只要Hash函数不是特别糟糕,那么结果几乎就是均衡的。

因此,它的优点是不用考虑频率,也不用事先记忆一个tid2eid。至于缺点,就是Hash函数的计算会稍微复杂一些了,而且同一个Token可能会选到重复的Expert,但这些都并不是特别严重的问题。

文章小结[#](https://spaces.ac.cn/archives/11750#%E6%96%87%E7%AB%A0%E5%B0%8F%E7%BB%93)

本文简单梳理了DeepSeek V4中的Hash Routing的基本思想,并重点探讨了它的tid2eid映射表的构造原理。

_转载到请包括本文地址:[https://spaces.ac.cn/archives/11750](https://spaces.ac.cn/archives/11750 "DeepSeek V4的tid2eid是怎么来的?")_

_更详细的转载事宜请参考:_[《科学空间FAQ》](https://spaces.ac.cn/archives/6508#%E6%96%87%E7%AB%A0%E5%A6%82%E4%BD%95%E8%BD%AC%E8%BD%BD/%E5%BC%95%E7%94%A8 "《科学空间FAQ》")

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎[分享](https://spaces.ac.cn/archives/11750#share)/[打赏](https://spaces.ac.cn/archives/11750#pay)本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

打赏

Image 8: 科学空间

微信打赏

Image 9: 科学空间

支付宝打赏

因为网站后台对打赏并无记录,因此欢迎在打赏时候备注留言。

你还可以**点击这里**或在下方评论区留言来告知你的建议或需求。

如果您需要引用本文,请参考:

苏剑林. (May. 15, 2026). 《DeepSeek V4的tid2eid是怎么来的? 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/11750

@online{kexuefm-11750,

title={DeepSeek V4的tid2eid是怎么来的?},

author={苏剑林},

year={2026},

month={May},

url={\url{https://spaces.ac.cn/archives/11750}},

}

分类:信息时代 标签:模型, 函数, 分析, moe抢沙发

<[直接以FID为Loss:从梯度计算到流式训练](https://spaces.ac.cn/archives/11738 "直接以FID为Loss:从梯度计算到流式训练") | >

你也许还对下面的内容感兴趣

  • [Attention Residuals 回忆录](https://spaces.ac.cn/archives/11664 "Attention Residuals 回忆录")
  • [MoE环游记:7、动态激活极简解](https://spaces.ac.cn/archives/11626 "MoE环游记:7、动态激活极简解")
  • [MoE环游记:6、最优分配促均衡](https://spaces.ac.cn/archives/11619 "MoE环游记:6、最优分配促均衡")
  • [低精度Attention可能存在有偏的舍入误差](https://spaces.ac.cn/archives/11371 "低精度Attention可能存在有偏的舍入误差")
  • [为什么Adam的Update RMS是0.2?](https://spaces.ac.cn/archives/11267 "为什么Adam的Update RMS是0.2?")
  • [ReLU/GeLU/Swish的一个恒等式](https://spaces.ac.cn/archives/11233 "ReLU/GeLU/Swish的一个恒等式")
  • [等值振荡定理:最优多项式逼近的充要条件](https://spaces.ac.cn/archives/10972 "等值振荡定理:最优多项式逼近的充要条件")
  • [MoE环游记:5、均匀分布的反思](https://spaces.ac.cn/archives/10945 "MoE环游记:5、均匀分布的反思")
  • [SVD的导数](https://spaces.ac.cn/archives/10878 "SVD的导数")
  • [通过梯度近似寻找Normalization的替代品](https://spaces.ac.cn/archives/10831 "通过梯度近似寻找Normalization的替代品")

发表你的看法

取消回复

你的大名

电子邮箱

个人网站(选填)

  1. 可以使用LaTeX代码,点击“预览效果”可查看效果;
  1. 可以通过点击评论楼层编号来引用该楼层;
  1. 网站可能会有点卡,如非确认评论失败,请不要重复点击提交

内容速览

智能搜索

支持整句搜索!网站自动使用结巴分词进行分词,并结合ngrams排序算法给出合理的搜索结果。

热门标签

生成模型attention优化模型语言模型梯度矩阵网站概率优化器转载微分方程分析天象深度学习积分python几何扩散力学无监督节日生活文本生成数论

随机文章

最近评论

  • TtuHamg: 苏老师,你好!想请问下cold diffusion中,$\boldsymbol{\mathca...
  • Weining Ren: 感谢老师,我明白了!
  • shuaichao233: 我疑惑的就是这个问题,目前我们单卡的bs 只能设置成1,不知道小bs的效果还准不准
  • Weining Ren: 非常感谢老师!
  • 孙培钦: 我觉得这卡关键还是在你bs得达到一定的大小, 虽然说是解耦了batch-size 和计算FID...
  • sk: 请教个问题,反对称矩阵的分解 B=P Λ P−1$B = P \Lambda P^{- 1}$是根据 https://e...
  • 苏剑林: 你的意思是,原本能跑起来,用FD Loss后就跑不起来了?FD Loss确实要多占一些显存,只...
  • 苏剑林: “要保留比较大的特征值对应的特征向量”跟“只保留muon的头部特征值对应的特征向量,会有一定问...
  • 苏剑林: DeltaNet的递归公式是: $$\boldsymbol{S}_t = \boldsymbo...
  • 苏剑林: graph?不研究

友情链接

![Image 10: 署名-非商业用途-保持一致](http://creativecommons.org/licenses/by-nc-nd/2.5/cn/) 本站采用创作共用版权协议,要求署名、非商业用途和保持一致。转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议。

© 2009-2026 Scientific Spaces. All rights reserved. Theme by laogui. Powered by Typecho. 备案号: [粤ICP备09093259号-1/2](https://beian.miit.gov.cn/ "粤ICP备09093259号")。

AI 可能会生成不准确的信息,请核实重要内容

DeepSeek V4的tid2eid是怎么来的? | 科学空间 | traeai