Muon
如果第一次听说 Muon,可以先把它理解成一种专门处理神经网络二维权重矩阵的 optimizer (Jordan et al., 2024)。它不改变模型结构、loss 或 backpropagation;forward 和 backward 仍然照常进行。改变的是 backward 之后的 optimizer step:算出的梯度最终怎样变成权重更新。 但梯度本身还没有完整回答“应该走哪一步”。它能用一阶近似比较不同更新谁更可能降低 loss,却没有规定多大的更新才算同样大。对向量参数,我们常把 Euclidean norm 当作默认尺度;对 linear layer 的矩阵 \(W\),还可以直接关心它作为映射 \(y=Wx\) 时,一步更新最多会让输出特征改变多少。选择不同的尺度,就会设计出不同的 optimizer。 因此本文不从背诵 Muon 的流程开始,而是假设我们正在自己设计…
Infra: PagedAttention
生成新 token 时,attention 要读取此前 token 的 key 和 value。在 causal attention 中,过去 token 的 KV 不会因为后面新增了 token 而改变,因此可以保存在显存里反复使用,这就是 KV cache。Prefill 处理 prompt 并建立 cache;随后 decode 逐 token 生成,cache 随之增长。 Serving 要同时处理许多请求,而每个请求会生成多长,事先并不知道。一种朴素做法是按最大长度预留一整段连续空间,避免 cache 增长时放不下。但这些还没存入 KV 的空间也被占住了,无法交给其他请求。 假设一个请求已缓存 3 个 token,最终只需缓存 5 个,却一开始就分配了 8 个 slot;一个 slot 表示存放一个 token 的 KV 所需的空间。按 CSE 291 讲义 (Jain et…
Infra: Data Parallel
参考了 (Hashimoto & Liang, 2026; Tazi et al., 2025)。 最拿衣服的 DP,大概就是每张卡存一份相同的模型,分别处理不同的数据,算出自己的 gradient,然后通过 All-Reduce 得到平均梯度。这样每张卡用同样的梯度更新参数,模型就能保持一致。但如果等整个 backward 结束才开始通信,通信就没法和这次 backward 的计算重叠。 一个简单的优化是:某些参数的梯度算好之后,就 async 地触发它们的 All-Reduce,同时继续计算其他梯度。不过,每个小 tensor 都单独通信会比较零散,所以可以把多个参数的梯度放进一个 bucket,等这个 bucket 的梯度都就绪后再一起通信。PyTorch DDP 已经实现了这套机制。 如果自己实现,可以用…
Attention
参考了 (Purshow, 2026; Weng, 2023; 苏剑林, 2024)。 Multi-Head Attention (MHA) (Vaswani et al., 2023) 大概就是把 QKV 分成多组: 为了压缩 KV cache,Multi-Query Attention (MQA) (Shazeer, 2019) 让 \(K\) 和 \(V\) 合并成一个 head。但是这样可能导致压缩过猛,所以 Grouped-Query Attention (GQA) (Ainslie et al., 2023) 将 head 分成 \(g\) 组,每组 share 同一个 \(W_k\) 和 \(W_v\)。 Multi-Head Latent Attention (MLA) (DeepSeek-AI et al., 2024) 尝试将 QKV 低秩压缩。 首先将 \(X\)…
Infra: Tensor Parallel
对于 Column-wise TP: 反向传播的时候,令 \(Y_i=XW_i\): 对于 Row-wise TP: 反向传播的时候,令求和结果为 \(Y\): 对于一个 MLP 我们可以将 \(W_1\) 做 Column-wise 拆分,\(W_2\) 做 Row-wise 拆分,这样子做完 \(XW_1\) 之后不需要做 All-Gather,反向传播过完 \(W_2\) 之后也不需要 All-Gather 完整梯度。 对于 attention,考虑到 Megatron (Shoeybi et al., 2020) 里没有考虑 number of attention heads 大于 TP 的情况(代码位置),我们也只讨论这一点 对于 MHA 就非常好做了,对于 我们将 \(W_o\) 进行 Row-wise 切分。然后每张卡单独计算一定量的 heads,这样子天然是一个…
Infra: Collective Operations
Auto Regressive
主要参考了 (Ermon, 2023; Grover, 2018; He, 2024)。 正常情况下,auto regressive 是 但其实 \(x_i\) 不一定依赖全部的 \(x_{1}\sim x_{i-1}\),可能就是一个子集 \(\mathcal{P}_i\)。那么其实我们可以搞一个 DAG,然后 \(j\in \mathcal{P}_i\) 那么 \(j\) 做 \(i\) 的 parent。这样 就是 Bayesian Networks (Kyburg Jr, 1991; Peal, 1985)。 Fully Visible Sigmoid Belief Network (FVSBN) (Frey et al., 1995) 把每个像素看成 \(0\) 或 \(1\)(黑白)然后跑 Logistic regression: Neural Autoregressive…
Diffusion
生成模型需要做到一件有些特殊的事:面对同样的条件,它应该能给出许多不同、又都合理的结果。例如“一只坐在窗边的猫”可以对应不同的毛色、姿态和光照。训练数据提供了这些可能结果的例子,我们希望模型学到它们的分布。 Flow 和 diffusion models 从容易采样的 noise 出发,逐步改变样本。理解这个过程,需要把生成时怎样走、训练时怎样知道往哪里走联系起来。下面先从一个简单的分布变换理解生成,再构造能够训练这种变换的监督信号。 记真实数据为 \(z\sim p_{\mathrm{data}}\),初始 noise 为 \(\epsilon\sim p_0=\mathcal N(0,I)\)。我们希望学到一个生成过程,把不同的 \(\epsilon\) 变成不同的样本,使输出整体接近 \(p_{\mathrm{data}}\)。 本文统一使用生成方向的时间:\(t=0\) 是…
Transfusion
论文:(Zhou et al., 2024) 大概就是用一个 Transfusion 去同时做生成和理解两件事情: Attention mask 大概是这样,就是文字看到前面的,然后图片互相都能看到。
Vector Quantized-Variational Autoencoder (VQ-VAE)
文章:(van den Oord et al., 2017);苏神博客:(苏剑林, 2019)。 先把 \(x\in \mathbb{R}^{H\times W\times 3}\) 降采样成 \(z\in \mathbb{R}^{h\times w\times d}\)。然后维护 embedding codebook \(e\in\mathbb{R}^{K\times d}\)。找到每个 \(z_{ij}\) 的最近邻 \(\hat{z}_{ij}\) 进入 decoder。 我们希望的 loss 是 \(\left\|x-\mathrm{Decoder}(\hat{z})\right\|_2^2\),但是需要解决两个问题: 对于第一个问题,文章提出了一种叫 Straight-Through Estimator 的方法,参考的是 (Bengio et al., 2013)。本质上其实是在…