Arganzheng's Blog

stay hungry, stay foolish

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

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

第三篇末尾那张对照表说:Llama 相对 GPT-2 只改了五处——LayerNorm 换成 RMSNorm、位置表换成 RoPE、GELU 两矩阵 FFN 换成 SwiGLU 三矩阵、K/V 投影变窄(GQA)、去掉所有 bias。第二段从这里开始:先讲每一处为什么改(各解决什么问题、代价是什么),再把改完的结构拆到能数出每一个参数的粒度。这一篇之后你会被问到这样的问题:这个模型有多少参数?一张 80 GB 的卡放得下吗?某个 GEMM 的 \(m, k, n\) 是多少?为什么 Llama 的 FFN 中间维度是 14336 这样一个看起来不整的数?这些问题的答案全部藏在一个几十行的 config.json 里,不需要下载权重,也不需要运行代码。 本篇要建立的...

Transformer 与 LLM(04):手搓 GPT(下)——nanoGPT train.py 与训一个会续写的模型

Building GPT by Hand, Part 2: train.py Line by Line, Then Train One on Shakespeare

上一篇的 model.py 定义了一个 GPT,但它的权重是随机数,输出是乱码。让它变成一个”会写东西”的模型,还差三样:数据(一段文本怎么变成模型能吃的整数数组)、训练循环(第二篇那一步”取 batch → 前向 → loss → 反向 → 更新”怎么写成能跑几十万步、能断点续训、能多卡的代码)、一次实际的训练(看着 loss 从 4.17 掉到 1.66、输出从乱码变成像莎士比亚台词的东西)。nanoGPT 的 train.py(336 行)加 prepare.py(68 行)就是这三样。 这一篇把 train.py 按块过完,然后在一台 MacBook 上用莎士比亚全集训 2000 步(7 分钟),再把层数改成 2 和 8 各训一次——这是你第一次亲手改模型...

Transformer 与 LLM(03):手搓 GPT(上)——nanoGPT model.py 逐行解析

Building GPT by Hand, Part 1: Every Line of nanoGPT's model.py

前两篇画了 Transformer 的静态结构和 token 流过它的两条动态线。图看懂了,能不能写出来?这一篇的答案是 Andrej Karpathy 的 nanoGPT:model.py 一个文件、330 行、6 个类,完整定义了 GPT-2,能加载 OpenAI 的原版权重并给出和 HuggingFace 一样的输出。它是目前最好的”从图到代码”的范本——没有多余的抽象,每一行都对应前两篇的某个方框或某一步。 本篇把这 330 行逐行过一遍:每段代码解释三件事——它对应结构图的哪个部分(第一篇)、在训练 / 推理的哪一步执行(第二篇)、以及那些”为什么这么写”(为什么 Q、K、V 合成一个矩阵、为什么 mask 叫 bias、为什么 c_proj 的初始化要...

Transformer 与 LLM(02):一个 token 的旅程——训练侧与推理侧

The Dynamic View: What Happens to a Token During Training and During Inference

上一篇把 Transformer 的每个方框打开看了一遍,但那是一张静止的图。同一台机器在两种场合下的运转方式很不一样:训练时一句话的几千个 token 一起进去、几千个 loss 一起出来、梯度沿原路返回、几十亿参数各挪一小步;推理时先把用户的问题一次算完,然后一个字一个字往外吐,每吐一个字只算一个 token。不搞清这两条动态线,就解释不了几件天天碰到的事:为什么训练一次前向能同时算 \(T\) 个位置的预测、为什么推理”第一个字慢、后面快”、KV cache 到底缓存了什么、为什么训练长上下文时”激活值”比参数本身还占显存。 这一篇用一个 2 层、8 维、16 个词的玩具 GPT 把两条线走通,每一步打印形状和数字;再用 512 个 token 的模型实测 ...

Transformer 与 LLM(01):Transformer 长什么样——从一句话到下一个 token

The Static View: Every Box in a Decoder-only Transformer, Computed by Hand

2017 年之后,几乎所有你听说过的大模型——GPT、Llama、Qwen、DeepSeek、Claude、Gemini——用的都是同一种结构:Transformer。它取代了在它之前统治序列建模十年的循环网络(L3 第六篇讲了为什么),之后八年结构上只做了修补,没有被替换。所以”看懂一个大模型的内部”这件事,其实只需要看懂一种结构。 这一篇讲静态线:把一个 decoder-only Transformer 里的每一个方框打开,说清它是什么、为什么要有它、里面的数怎么算。全篇用一个 4 维、3 个 token 的玩具例子把每一步手算出来,再用 GPT-2 small(1.24 亿参数,2019 年)的真实数字对照——真实模型只是把 4 换成 768、把 3 换成 ...

Transformer 与 LLM:结构、实现与算量(总纲)

Transformers and LLMs: Architecture, Implementation and Arithmetic

内容简介 《Transformer 与 LLM:结构、实现与算量》是一组共十三篇的系列文章,讲今天所有大语言模型共用的那一种结构。它分三段:先讲清结构与实现——Transformer 里每个方框是什么、为什么必须在那里、一个 token 在训练和推理时怎么流过它们,然后用 nanoGPT 的 300 行代码把它写出来、训出来;再讲结构的演进——从 GPT-2 到 Llama、DeepSeek,归一化、位置编码、FFN、attention 的 K/V、专家层、训练目标各改成了什么样、为什么;最后算账——这样的结构每一步算多少、读多少、存多少,数值格式、量化、投机解码、LoRA、多模态各怎么改变这些数字。同一张成本表的训练侧——tokenizer 与词表、算力怎么分给...

深度学习基础(07):系列总结与通关自测

Deep Learning Foundations: Series Recap and Final Self-Test

六篇正文回答了一个问题:一个几十层甚至上百层的网络,为什么能训、什么时候不能训、训不动的时候该看哪个数字。前四篇是训练动力学——第一篇建立梯度,第二篇讲梯度为什么会坏、怎么修,第三篇讲怎么用梯度更新参数,第四篇讲什么时候该停;后两篇是结构史——卷积这条线留下了残差、归一化与”堆同样的块”,循环这条线留下了 attention。六篇合起来,是 Transformer 每一个部件的来历,也是读任何一份预训练技术报告时”初始化、归一化、优化器、稳定性”那几段的公式出处。 本文不讲新内容,做三件事:把六篇压成一张表与六段回顾,把贯穿六篇的几条线拎出来,然后给一套三段式的通关自测——判断与计算、跨篇综合、面试题。各篇末尾的自测检验的是”这一篇读懂了没有”,这里检验的是”六篇...

深度学习基础(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;深度是为了感受野(receptive field,一个输出位置能看到输入的范围),而深了就训不动,ResNet 用残差解决了它;数据足够多时约束成了负担,ViT 把图切成 patch、当成 token 送...

深度学习基础(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);显式正则化手段各自在...

×