Arganzheng's Blog

stay hungry, stay foolish

Transformer 与 LLM(04):位置编码与长上下文

Positional Encoding and Long Context: RoPE Wavelengths, Extrapolation and Cost

前三篇把一个 Transformer 拆成了参数量、算量、访存量和 KV cache 四个数字。这些数字里有一个变量一直被当作常数处理:上下文长度 \(s\)。第二篇算 prefill 时取 \(s = 8192\),第三篇算 KV cache 时取 \(s = 131072\),但都没有回答两个问题:模型凭什么知道一个 token 在第几个位置?以及,一个模型能处理的上下文长度到底由什么决定? 这两个问题在结构上由同一个部件回答——位置编码。它在参数量表里几乎不占位置(RoPE 一个参数都没有),在算量表里也可以忽略(一次逐元素乘加),却决定了”上下文长度”这个对 Infra 成本最敏感的维度的上限。上下文长度同时进入 KV cache 的一次项和 attent...

Transformer 与 LLM(03):Attention 变体与 KV cache

Attention Variants and the KV Cache: Deriving MHA, GQA, MQA and MLA

上一篇把一次前向拆成了”权重项”和”上下文项”两部分:权重项每 token 每参数 2 FLOPs,与上下文长度无关;上下文项只来自 attention,随序列长度 \(s\) 线性增长(decode)或平方增长(prefill)。这一篇专门讲 attention,因为它是 Transformer 里唯一成本随上下文增长的部分,也是过去几年结构改动最集中的地方。 MHA、MQA、GQA、MLA 四种结构,做的是同一件事的不同取舍: 减少每个 token 的 KV cache 字节数,同时尽量不损失质量。 顺着这条线,本篇要回答总纲里提出的问题: DeepSeek-V3 有 128 个 attention head、61 层,KV cache 却...

Transformer 与 LLM(02):前向的算量与访存量

FLOPs, Bytes and Roofline: Prefill versus Decode

上一篇把一个 decoder-only Transformer 拆到了能数出每一个参数的粒度。结论可以压缩成一个公式: \[N \approx L \cdot \left[ d \cdot (d + 2 d_{kv} + d) + 3 \cdot d \cdot d_{ff} \right] + 2 \cdot V \cdot d\] 其中 \(d_{kv} = n_{kv} \cdot d_{head}\)。代入 Llama-3-8B(\(d = 4096\),\(L = 32\),\(n_{kv} = 8\),\(d_{head} = 128\),\(d_{ff} = 14336\),\(V = 128256\)):每层 attention 41.94M、F...

Transformer 与 LLM(01):Transformer 解剖与参数量

Transformer Anatomy and Parameter Count: From config.json to 8.03B

做推理系统、训练基础设施或 kernel 的工程师,迟早会被问到这样的问题:这个模型有多少参数?一张 80 GB 的卡放得下吗?某个 GEMM 的 \(m, k, n\) 是多少?为什么 Llama 的 FFN 中间维度是 14336 这样一个看起来不整的数?这些问题的答案全部藏在一个几十行的 config.json 里,不需要下载权重,也不需要运行代码。 本篇要建立的是整个系列的分析对象:一个 decoder-only Transformer 里到底有哪些矩阵、每个矩阵的形状由哪个超参数决定、把它们加起来等于多少。它不讲 attention 为什么有效,也不讲训练方法,只把结构拆到能数出每一个参数的粒度。全篇的核心问题是: 给你任意一个模型的 confi...

Transformer 与 LLM:结构、算量与数值(总纲)

Transformers and LLMs for Infrastructure Engineers: Architecture, Arithmetic and Numerics

内容简介 《Transformer 与 LLM:结构、算量与数值》是一组共八篇的系列文章,面向不训练模型、但要为模型搭建训练与推理系统的工程师,以及想知道自己的模型在硬件上”花多少钱”的算法工程师。它讲大语言模型的成本结构:每一层做多少次乘加、读多少字节、存多少状态,这些数字由哪些超参数决定,以及各种结构上和数值上的改动如何改变这些数字。同一张成本表的训练侧——tokenizer 与词表、算力怎么分给参数与数据、15T token 从哪来、超参表里的数字从哪来——是紧接着的系列《预训练:从 tokenizer 到训练配方》的内容。 它回答的问题是: Infra 工程师不训练模型,但必须知道自己在优化什么:这个模型的每一步算多少、读多少、存多少? In...

深度学习基础(06):RNN——从 LSTM 到 attention 的诞生

RNN: Backpropagation Through Time, the LSTM Gate as a Residual Path, and How Attention Was Born from the seq2seq Bottleneck

Attention 不是为 Transformer 发明的。2014 年它被加到一个循环神经网络的翻译模型上,目的很具体:encoder 把整句话压进一个固定长度的向量,句子长了向量装不下,翻译质量随句长下降——attention 让 decoder 每生成一个词都回头看 encoder 的全部隐状态,绕过这个瓶颈。三年后 Vaswani 等发现,有了 attention 之后循环本身可以不要了。 所以理解 RNN 的意义在于理解 attention 解决了什么。本篇按这条线走:循环网络怎么处理序列,它的梯度在时间上怎么传播(第二篇的 Jacobian 连乘在时间维上的版本),为什么记不住 20 步之外的东西,LSTM 的门控为什么能记更远——以及那个门在数学上就...

深度学习基础(05):CNN——从 LeNet 到 ResNet,再到 ViT

CNN: Convolution as a Constrained Linear Layer, the ResNet Legacy and How ViT Turns Images into Tokens

前四篇讲训练动力学,用的网络全是 MLP。这一篇和下一篇回看 Transformer 之前的两条结构史——卷积与循环——不是为了怀旧,而是因为 Transformer 的每个部件都有来历:残差连接、归一化、”堆同样的块”来自卷积这条线;attention 来自循环那条线。理解一个部件当初解决了什么问题,才知道它今天还在解决什么、什么时候可以拿掉。 卷积网络的故事可以压缩成三句话:卷积是一个被强约束的线性层,约束带来的参数节省与归纳偏置让它在数据不多时远胜 MLP;深度是为了感受野,而深了就训不动,ResNet 用残差解决了它;数据足够多时约束成了负担,ViT 把图切成 patch、当成 token 送进标准 Transformer,只保留了卷积的一个影子——pat...

深度学习基础(04):正则化与泛化——为什么参数比样本多却不过拟合

Regularization and Generalization: Double Descent, Implicit Bias, Dropout, Weight Decay and When Overfitting Comes Back

L2 经典机器学习系列讲过经典机器学习的第一定律:模型容量超过数据量就会过拟合。一个 160 万参数的网络在 4000 个样本上训练,按这条定律应该背下每一个样本、在测试集上一败涂地。第九章的实验里它做到了前半句——训练错误率 0.0%——却没有做到后半句:测试错误率 14.5%,是所有宽度里最好的。而一个参数只有样本两倍的小网络,测试错误率 43%。 这个现象——参数越多泛化越好,越过某个点之后——在 2017 年前后被系统地记录下来(Zhang 等 2017;Belkin 等 2019),它推翻的不是”过拟合”这个概念,而是”容量”这个度量。本篇讲三件事:为什么深网络在参数远多于样本时不过拟合(隐式正则化与 double descent);显式正则化手段各自在...

深度学习基础(03):优化器——从 SGD 到 AdamW 与学习率调度

Optimizers: From SGD to AdamW, Warmup, Clipping and the Batch-Learning-Rate Scaling Rule

打开任何一份 LLM 技术报告的训练配置,会看到同一组数字:AdamW,\(\beta_1 = 0.9\),\(\beta_2 = 0.95\),weight decay 0.1,梯度裁剪 1.0,warmup 2000 步,cosine 衰减到峰值的 10%。这组数字从 GPT-3 到 Llama-3 几乎没变过,以至于很少有人再问它们是从哪来的。本篇把每一个数字拆开:它在公式里的位置、它解决的问题、改了会怎样、以及为什么优化器状态要占每参数 8 字节。 主线从最简单的 SGD 开始,每加一个部件就问两个问题——它改变了更新量的哪个性质、代价是什么。Momentum 改变了方向的平滑度,Adam 改变了每个参数的步长尺度,weight decay 改变了参数范数...

深度学习基础(02):训练为什么不稳定——初始化、归一化与残差

Why Deep Training Is Unstable: Variance Propagation, Initialization, Normalization and Residual Connections

上一篇的两层网络怎么训都能训。把它加深到 64 层,同样的代码会出现四种结局:loss 停在 \(\ln 10\) 一步不动;第三步变成 NaN;能动但慢得像没训;正常收敛。四种结局对应的网络只差三样东西——权重初始化的标准差、有没有归一化层、有没有残差连接——而这三样东西恰好是 1990 年代到 2016 年深度学习解决”深了就训不动”这个问题的三步。 本篇把这三步各自推到公式、算到数字、在同一个 64 层网络上测出来。推导的主线只有一条:信号的方差在层间怎么传播,梯度作为一串 Jacobian 的乘积怎么放大或缩小。三种修法各自动了这条链上的哪一环,决定了它们能修什么、修不了什么。最后落到当前 LLM 的标准配置——Pre-Norm、RMSNorm、残差、初始...

×