同一套 GPT,两条完整路线:训练更新与逐 Token 生成
沿 Hi 你! 串起 GPT 的完整计算:位置向量、LN 与 QKV、两次残差、MLP、全词表 logits、交叉熵和 AdamW,再看固定参数怎样逐 Token 生成与增量解码。用三张双语图解、两份分步动画区分参数、激活、梯度与生成上下文。
沿 Hi 你! 串起 GPT 的完整计算:位置向量、LN 与 QKV、两次残差、MLP、全词表 logits、交叉熵和 AdamW,再看固定参数怎样逐 Token 生成与增量解码。用三张双语图解、两份分步动画区分参数、激活、梯度与生成上下文。
第二十五篇写出来的模型,对着 2017 年的原论文看是解码器那一半、去掉交叉注意力;对着 nanoGPT 看,结构几乎一模一样,差别都在工程。最值得啃的是多头合并那三行:c_attn 把小矩阵并排,view + transpose 把「头」挪到前面 —— 用一个 2 头的小例子手算到底。顺带修正一个说法(q 的偏置不是白加的),算清 6N 那笔账,最后看预训练、SFT、RLHF 怎么把一个只会续写的模型变成 ChatGPT。
把第二十四篇的注意力头装进模型,再堆深、放大,val 从 2.49 一路降到 1.48。多头的参数一个没多,提升来自分工;FFN 补上唯一的非线性;残差让深网络在初始化时约等于浅网络,LayerNorm 换个方向归一化,Dropout 只扔分支、不碰主干。同一个问题问了四次 —— thou 后面接什么:原文里一次都没出现过的 r,从第一名一路跌到 0.001。
softmax(QKᵀ/√dₖ)V —— 这一篇把它的每个符号一个一个挣出来。从最笨的「求平均」开始,经过「下三角矩阵乘就是加权求和」「softmax 配 −∞ 屏蔽未来」,再到「分数由 q·k 算出来」:从求平均到注意力,代码只改了一行。encoder 和 decoder 也只差一行。最后那个 √dₖ,是第十五篇那条方差公式换了个地方用。