DeepSeek-V4知识点讲解记录

文章目录

  • [[ X_l](#[ X_l)
  • [[ X_l](#[ X_l)
  • [[ A_lX_l](#[ A_lX_l)
  • [[ C_lF_l(A_lX_l)](#[ C_lF_l(A_lX_l))
  • [[ B_lX_l](#[ B_lX_l)
  • [[ \text{下一层多通道残差状态}](#[ \text{下一层多通道残差状态})
    • [1. 先用最朴素的优化器理解](#1. 先用最朴素的优化器理解)
    • [2. AdamW 好在哪里?](#2. AdamW 好在哪里?)
    • [3. Muon 好在哪里?](#3. Muon 好在哪里?)
    • [4. 什么叫把更新矩阵"正交化"?](#4. 什么叫把更新矩阵“正交化”?)
    • [5. 为什么这会更稳定、更快?](#5. 为什么这会更稳定、更快?)
    • [6. 和 AdamW 的差异可以这么看](#6. 和 AdamW 的差异可以这么看)
    • [7. Hybrid Newton-Schulz 是不是唯一重点?](#7. Hybrid Newton-Schulz 是不是唯一重点?)
      • 第一,动量
      • [第二,Nesterov trick](#第二,Nesterov trick)
      • [第三,Newton-Schulz 正交化](#第三,Newton-Schulz 正交化)
      • [第四,RMS 重缩放](#第四,RMS 重缩放)
      • 第五,权重衰减
    • [8. 为什么不用精确 SVD,而用 Newton-Schulz?](#8. 为什么不用精确 SVD,而用 Newton-Schulz?)
  • [[ M_k](#[ M_k)
    • [9. 一句话回答"好在哪里"](#9. 一句话回答“好在哪里”)

你可以把这里的 Hyper-Connections 理解成:把原来"单条残差通道"扩展成"多条并行残差通道",然后每一层都先从这些通道里混出一个输入,经过 Transformer 子层,再把输出分配回这些通道。论文说它把 residual stream 从 (\mathbb{R}^d) 扩展到 (\mathbb{R}^{n_{\mathrm{hc}}\times d}),并引入输入映射 (A_l)、残差变换 (B_l)、输出映射 (C_l) 三个线性映射。

先看普通残差连接

在最常见的 Transformer 层里,残差大概是:

x_{l+1}=x_l+F_l(x_l)

这里:

x_l \\in \\mathbb{R}\^d

表示第 (l) 层输入的隐藏向量,维度是 (d)。比如 (d=4096),那它就是一个长度 4096 的向量。

F_l(\\cdot)

表示第 (l) 层的主体计算,比如 Attention 层或者 MoE/FFN 层。它吃进去一个 (d) 维向量,也输出一个 (d) 维向量。

所以普通残差就是:

\\text{新状态}=\\text{旧状态}+\\text{本层加工后的结果}

也就是:

x_{l+1}=x_l+F_l(x_l)

它只有一条残差流。可以想象成一根管道:

text 复制代码
x_l ────────────────┐
                    + ──> x_{l+1}
x_l -> F_l(x_l) ────┘

标准 Hyper-Connections 不再只有一条残差流。它把残差状态扩展成 (n_{\mathrm{hc}}) 条残差流:

X_l = \[x_{l,1};\\ldots;x_{l,n_{\\mathrm{hc}}}\]\^T \\in \\mathbb{R}\^{n_{\\mathrm{hc}}\\times d}

这句话的意思是:

[

X_l

\begin{bmatrix}

x_{l,1}

x_{l,2}

\vdots

x_{l,n_{\mathrm{hc}}}

\end{bmatrix}

]

其中每一个 (x_{l,i}) 都是一个 (d) 维向量:

x_{l,i}\\in\\mathbb{R}\^d

所以如果 (n_{\mathrm{hc}}=4),那 (X_l) 就是:

[

X_l

\begin{bmatrix}

\text{第 1 条残差通道,长度 }d

\text{第 2 条残差通道,长度 }d

\text{第 3 条残差通道,长度 }d

\text{第 4 条残差通道,长度 }d

\end{bmatrix}

]

也就是说,普通残差是一个向量:

x_l\\in\\mathbb{R}\^d

而 HC 的残差状态是一个矩阵:

X_l\\in\\mathbb{R}\^{n_{\\mathrm{hc}}\\times d}


现在看公式:

X_{l+1}=B_lX_l+C_lF_l(A_lX_l) \\tag{1}

这个公式可以拆成三步看。

第一步:(A_lX_l)

A_l \\in \\mathbb{R}\^{1\\times n_{\\mathrm{hc}}}

它是一个行向量,比如 (n_{\mathrm{hc}}=3) 时:

A_l= \\begin{bmatrix} a_1 \& a_2 \& a_3 \\end{bmatrix}

而:

X_l= \\begin{bmatrix} x_{l,1} x_{l,2} x_{l,3} \\end{bmatrix} \\in \\mathbb{R}\^{3\\times d}

所以:

[

A_lX_l

\begin{bmatrix}

a_1 & a_2 & a_3

\end{bmatrix}

\begin{bmatrix}

x_{l,1}

x_{l,2}

x_{l,3}

\end{bmatrix}

]

结果是:

A_lX_l=a_1x_{l,1}+a_2x_{l,2}+a_3x_{l,3}

它的形状是:

A_lX_l\\in\\mathbb{R}\^d

也就是说,(A_l) 的作用是:从多条残差通道里混合出一个真正送进第 (l) 层的输入。

可以理解成:

text 复制代码
x_{l,1} ──┐
x_{l,2} ──┼── 加权混合 A_l ──> A_l X_l ──> F_l
x_{l,3} ──┘

第二步:(F_l(A_lX_l))

这一步就是正常 Transformer 子层计算。

F_l(A_lX_l)\\in\\mathbb{R}\^d

因为论文里说 (F_l) 的输入和输出形状都是 (\mathbb{R}^d)。

也就是说:

A_lX_l

是送进 Attention 或 MoE 层的输入;

F_l(A_lX_l)

是这一层加工后的输出。

这一步和普通残差里的 (F_l(x_l)) 很像,只不过普通残差直接把 (x_l) 送进去,而 HC 是先从多条残差通道里混出一个输入再送进去。


第三步:(C_lF_l(A_lX_l))

C_l\\in\\mathbb{R}\^{n_{\\mathrm{hc}}\\times 1}

比如 (n_{\mathrm{hc}}=3) 时:

C_l= \\begin{bmatrix} c_1 c_2 c_3 \\end{bmatrix}

而:

F_l(A_lX_l)\\in\\mathbb{R}\^d

所以:

[

C_lF_l(A_lX_l)

\begin{bmatrix}

c_1

c_2

c_3

\end{bmatrix}

F_l(A_lX_l)

]

结果是:

\\begin{bmatrix} c_1F_l(A_lX_l) c_2F_l(A_lX_l) c_3F_l(A_lX_l) \\end{bmatrix} \\in\\mathbb{R}\^{3\\times d}

也就是说,(C_l) 的作用是:把这一层的输出重新分配到多条残差通道里。

如果 (c_1) 大,说明第 1 条残差通道更多接收当前层输出;如果 (c_2) 小,说明第 2 条通道少接收一些。


第四步:(B_lX_l)

B_l\\in\\mathbb{R}\^{n_{\\mathrm{hc}}\\times n_{\\mathrm{hc}}}

比如 (n_{\mathrm{hc}}=3) 时:

B_l= \\begin{bmatrix} b_{11} \& b_{12} \& b_{13} b_{21} \& b_{22} \& b_{23} b_{31} \& b_{32} \& b_{33} \\end{bmatrix}

它乘上:

X_l= \\begin{bmatrix} x_{l,1} x_{l,2} x_{l,3} \\end{bmatrix}

得到:

[

B_lX_l

\begin{bmatrix}

b_{11}x_{l,1}+b_{12}x_{l,2}+b_{13}x_{l,3}

b_{21}x_{l,1}+b_{22}x_{l,2}+b_{23}x_{l,3}

b_{31}x_{l,1}+b_{32}x_{l,2}+b_{33}x_{l,3}

\end{bmatrix}

]

也就是说,(B_l) 的作用是:让旧的多条残差通道之间互相混合,形成下一层的旧状态部分。

普通残差里的旧状态部分是:

x_l

HC 里的旧状态部分变成了:

B_lX_l

所以 (B_l) 可以理解成"残差通道之间的混合矩阵"。


把三步合起来:

X_{l+1}=B_lX_l+C_lF_l(A_lX_l)

含义就是:

[

\text{下一层多通道残差状态}

\text{旧多通道残差状态的混合}

\text{当前层输出分配到多通道后的结果}

]

更直观地写:

text 复制代码
多条旧残差通道 X_l
        │
        ├── B_l 混合旧通道 ───────────────┐
        │                                 │
        └── A_l 混出一个输入 -> F_l -> C_l 分配回多通道
                                          │
                          相加得到 X_{l+1}

所以,普通残差和 HC 的对比是:

类型 公式 含义
普通残差 (\displaystyle x_{l+1}=x_l+F_l(x_l)) 一条残差流,旧状态直接加当前层输出
HC (\displaystyle X_{l+1}=B_lX_l+C_lF_l(A_lX_l)) 多条残差流,先混合输入,经过层,再分配输出,同时旧残差流之间也可混合

最关键的区别是:普通残差只有一个 (x_l),而 HC 有一个矩阵 (X_l),里面装着 (n_{\mathrm{hc}}) 条残差通道。论文强调,实际送进层里的 (A_lX_l) 仍然是 (d) 维,所以内部层 (F_l) 不需要改结构;只是外面的残差连接变丰富了。


一个很简单的类比:

普通残差像是:

text 复制代码
主干道上的车流继续往前走,同时旁边工厂加工一批货,再并回主干道。

HC 像是:

text 复制代码
有多条平行主干道。
每一层先从多条路上抽取一部分车流,混成一股,送进工厂加工。
加工完之后,再按比例分配回多条路。
同时,多条旧路本身也可以互相分流、换道。

其中:

A_l

负责"从多条路抽取、混成一股";

F_l

负责"工厂加工";

C_l

负责"加工结果分配回多条路";

B_l

负责"旧车流在多条路之间换道"。


一句话总结:

普通残差是 (x_l) 这一个状态往前传;标准 HC 是 (X_l) 这一组状态往前传。(A_l) 把多条状态混成层输入,(F_l) 做层计算,(C_l) 把层输出分配回多条状态,(B_l) 则控制旧状态之间如何继续传播和混合。

是的,你抓到了关键:Muon 和普通 SGD/AdamW 的最大不同,主要就在它会对"更新矩阵"做 Newton-Schulz 近似正交化。其他部分,比如算梯度、动量、权重衰减、学习率缩放,确实和常见优化器的框架很像。

DeepSeek-V4 论文里也说,他们用 Muon 是因为它带来更快收敛和更好的训练稳定性;大多数模块用 Muon,但 embedding、prediction head、mHC 的静态偏置/门控因子、RMSNorm 权重仍保留 AdamW。


1. 先用最朴素的优化器理解

训练模型时,参数是一个矩阵:

W \\in \\mathbb{R}\^{n\\times m}

比如某个线性层的权重矩阵。

普通梯度下降大概是:

W_t = W_{t-1} - \\eta G_t

其中:

G_t = \\nabla_W L_t(W_{t-1})

就是当前 loss 对 (W) 的梯度。

直觉是:

梯度 (G_t) 告诉我们:往哪个方向改 (W),loss 会下降。

但是问题是,原始梯度矩阵可能很"不均衡":有些方向特别大,有些方向特别小,有些行/列之间高度相关。直接拿它更新,可能导致训练抖动、某些方向更新过猛、某些方向学得很慢。


2. AdamW 好在哪里?

AdamW 可以先粗略理解为:它给每个参数元素单独调学习率

普通 SGD 是:

W_t = W_{t-1} - \\eta G_t

所有参数都用同一个全局学习率 (\eta)。

AdamW 会维护两个东西:

m_t

梯度的一阶动量,也就是"最近梯度方向的平均"。

v_t

梯度平方的平均,也就是"这个参数过去梯度有多大"。

然后大概更新为:

W_t = W_{t-1} - \\eta \\frac{m_t}{\\sqrt{v_t}+\\epsilon}

不用纠结细节,重点是:

如果某个参数历史梯度经常很大,AdamW 会自动把它的步子缩小;如果某个参数历史梯度比较小,它相对会走大一点。

所以 AdamW 的优势是 逐元素自适应缩放

但它也有一个局限:它主要是按元素处理,比较像"每个格子单独调节"。对于矩阵参数来说,它不太直接考虑"这个矩阵作为整体的几何结构"。


3. Muon 好在哪里?

Muon 的核心想法是:对于矩阵参数 (W),不要只把梯度当成一堆独立数字,而要把它当成一个矩阵整体处理。

论文算法里关键步骤是:

O'_t = \\mathrm{HybridNewtonSchulz}(\\mu M_t + G_t)

然后:

O_t = O'_t \\cdot \\sqrt{\\max(n,m)} \\cdot \\gamma

最后:

W_t = W_{t-1}\\cdot(1-\\eta\\lambda)-\\eta O_t

这里 (O_t) 才是真正拿去更新参数的方向。

也就是说,Muon 不是直接用:

G_t

或者动量后的:

M_t

去更新,而是先把更新方向送进:

\\mathrm{HybridNewtonSchulz}(\\cdot)

做一次"矩阵正交化/白化式处理"。


4. 什么叫把更新矩阵"正交化"?

论文后面说,对于一个矩阵 (M),假设它的 SVD 是:

M = U\\Sigma V\^T

Newton-Schulz 迭代的目标是把 (M) 近似正交化为:

UV\^T

也就是把中间的奇异值矩阵:

\\Sigma

基本去掉,只保留方向结构:

U V\^T

直观理解:

M = U\\Sigma V\^T

里面:

  • (U,V):表示方向;
  • (\Sigma):表示每个方向上的强度大小。

如果某些奇异值特别大,说明某些方向更新特别猛;如果某些奇异值特别小,说明某些方向几乎不动。

Muon 的正交化大概是在说:

我相信这个矩阵更新的"方向"有用,但不希望它在某些方向上过度放大、在某些方向上过度缩小。

所以我把它处理成一个更均衡的矩阵更新方向。


5. 为什么这会更稳定、更快?

你可以把普通梯度矩阵想成一个"变形很严重的推力"。

比如某次更新里,梯度矩阵在某个方向上强度是 100,在另一个方向上强度是 0.01。直接更新会导致:

text 复制代码
强方向:一步迈太猛,容易震荡
弱方向:几乎不动,学得很慢

AdamW 会做逐元素缩放,但它不一定能很好处理矩阵整体的方向相关性。

Muon 通过近似正交化,让更新矩阵的不同方向更均衡。直觉效果是:

text 复制代码
不要让一个方向主导整个矩阵更新;
让矩阵参数在多个方向上更均匀、更稳定地前进。

所以它可能带来:

  1. 更快收敛:有效方向不被病态尺度拖慢;
  2. 更稳定训练:避免某些矩阵方向更新过大;
  3. 更适合大矩阵权重:比如 Attention、MLP、MoE 里的线性权重矩阵。

这也是为什么 DeepSeek-V4 不是所有参数都用 Muon,而是"多数模块"用 Muon,一些非矩阵型或特殊参数继续用 AdamW。


6. 和 AdamW 的差异可以这么看

优化器 核心处理对象 主要想解决什么
SGD 整个梯度直接走 简单,但容易受梯度尺度影响
Momentum SGD 梯度方向做滑动平均 减少抖动,利用历史方向
AdamW 每个参数元素自适应缩放 不同参数梯度尺度不同的问题
Muon 对矩阵更新方向做近似正交化 矩阵整体方向不均衡、病态尺度问题

AdamW 像是:

每个参数格子自己调步长。

Muon 像是:

先看整个权重矩阵的更新方向,把这个矩阵更新方向整理得更"端正"、更均衡,再更新。


7. Hybrid Newton-Schulz 是不是唯一重点?

可以说它是 Muon 在这篇论文里最关键、最不普通的部分

不过完整 Muon 还有几个配套点:

第一,动量

M_t=\\mu M_{t-1}+G_t

这个和普通 momentum 类似,用来平滑梯度方向。

第二,Nesterov trick

算法里是:

\\mathrm{HybridNewtonSchulz}(\\mu M_t+G_t)

它不是只用当前动量 (M_t),而是用一个类似 Nesterov 的 lookahead 方向,让更新更有前瞻性。

第三,Newton-Schulz 正交化

这是最核心差异。

第四,RMS 重缩放

O_t = O'_t\\cdot \\sqrt{\\max(n,m)}\\cdot\\gamma

正交化之后,更新矩阵的尺度会变,所以要重新缩放到合适大小。论文说这样可以复用 AdamW 的超参数。

第五,权重衰减

W_t = W_{t-1}\\cdot(1-\\eta\\lambda)-\\eta O_t

这和 AdamW 的 decoupled weight decay 类似,防止权重无限变大。

所以你可以这么记:

Muon = Momentum/Nesterov + 矩阵更新正交化 + 重缩放 + AdamW 式权重衰减。

真正让它区别于你朴素理解的优化器的,是"矩阵更新正交化"。


8. 为什么不用精确 SVD,而用 Newton-Schulz?

如果目标是:

M=U\\Sigma V\^T

然后取:

UV\^T

最直接的方法是做 SVD。

但 SVD 对大模型训练来说太贵了。每个 step、每个大矩阵都做 SVD,基本不可接受。

Newton-Schulz 的好处是:它用矩阵乘法迭代来近似这个正交化过程。

论文里的迭代是:

[

M_k

aM_{k-1}

b(M_{k-1}M_{k-1}^T)M_{k-1}

c(M_{k-1}M_{k-1}T)2M_{k-1}

]

它本质上是在用多项式迭代把奇异值推向 1。DeepSeek-V4 用 10 步 hybrid Newton-Schulz:前 8 步用一组系数快速靠近,后 2 步用另一组系数稳定到 1 附近。

所以它是:

text 复制代码
想要 SVD 正交化的效果,
但不用真的做昂贵 SVD,
而是用几次矩阵乘法近似实现。

9. 一句话回答"好在哪里"

Muon 好在:它把大模型里的矩阵参数更新方向做了近似正交化,让不同矩阵方向的更新更均衡,从而可能更快收敛、更稳定训练。

你现在的理解可以改成:

普通优化器主要处理"梯度往哪里走"和"步长多大";AdamW 进一步给每个参数元素自适应步长;Muon 则把权重矩阵作为整体,在更新前把矩阵方向整理成更接近正交、尺度更均衡的更新方向。它真正特殊的地方就是 Hybrid Newton-Schulz 近似正交化,其他步骤是为了让这个更新方向更平滑、更可控、更适配大模型训练。

相关推荐
Python私教1 小时前
如意Agent对话持久化与滚动记忆引擎设计:让AI记住你们聊过的每一句话
人工智能
这张生成的图像能检测吗1 小时前
(论文速读)SPR-YOLO:面向模糊场景的轻量级交通流检测算法
人工智能·yolo·计算机视觉·目标追踪
独隅1 小时前
Anaconda 配置 Keras 环境的详细流程指南
人工智能·深度学习·keras
恋猫de小郭1 小时前
AI 时代开源协议将消亡,malus 讽刺性展示了这一点
前端·人工智能·ai编程
数字化顾问1 小时前
(97页PPT)麦肯锡战略规划制定方法及模板制品(附下载方式)
人工智能·物联网
Kiyra1 小时前
我是怎么把一个普通 AI 聊天项目改造成工程化 Agent Runtime 的
人工智能
PythonFun1 小时前
WPS AI隐藏玩法!自定义指令让办公效率起飞
人工智能·wps
weixin_417197052 小时前
王府井来了个新店员:穿机械骨骼,不会请假,还会表演节目
人工智能·机器人
lisw052 小时前
【计算机科学技术/AI领域】名词释义:词元(token)!
人工智能·机器学习·软件工程