本文是笔者10篇技术笔记的“总纲性串联”。文中涉及具体数值演算、完整代码实现及详尽对比表格处,将标注(详见笔记X),建议配合原笔记阅读,效果最佳。引言:为什么你的知识是散的?绝大多数人学大模型,陷入了一个误区:把“架构”、“训练”、“推理”当成三门独立的课。但在工业界,它们是连环套:不懂 Attention 的显存占用(笔记六),你就不知道为什么预训练要用 3D 并行;不懂 KV Cache 的存储逻辑(笔记三),你就理解不了“推测解码”(笔记十)为什么能加速;不懂 FFN 作为记忆网络(笔记三)的局限性,你就不知道为什么 RAG(检索增强)比纯微调更靠谱。本文的任务,就是把这根链条焊死。我们先从“数据在模型里到底经历了什么”讲起。第一幕:模型架构的“底层物理”与“已知Bug”(深度原理篇)1. 输入嵌入(Embedding):从“文字”变成“坐标”模型不认识中文。输入必须转化为向量。操作:查表(Embedding Matrix),形状[vocab_size, d_model]。输出:一句话[seq_len, d_model]的浮点数矩阵。关键细节:为什么必须加 Positional Encoding(笔记二)?因为 Attention 操作是置换不变性(Permutation Invariant)的,即打乱顺序,Attention 计算出的结果完全一样。不加上位置信息,模型会把“我打你”和“你打我”当成同一个数学表达。(具体 Sin/Cos 或 RoPE 的实现差异,详见笔记二)2. 自注意力(QKV)的“数学真相”上一版我把它比作“图书馆找书”,这很形象,但没有触及本质。注意力的本质是“加权求和”。设输入矩阵为X(维度[L, D],L为序列长度,D为隐藏维度),我们学习三个权重矩阵W_Q、W_K、W_V(维度均为[D, D]):Q = X · W_Q ([L, D]) K = X · W_K ([L, D]) V = X · W_V ([L, D])核心公式:Attention(Q, K, V) = softmax(Q·K^T / √d_k) · V深度剖析:Q·K^T的结果是[L, L]的矩阵。这个矩阵的含义是“序列中每个词与其他所有词的得分”。为什么要除以 √d_k(缩放)?当维度 D 很大时,点积结果数值会很大,导致 Softmax 的梯度集中在极小区域(梯度消失)。除以根号维度的目的是把方差拉回到 1。因果掩码(Causal Mask,笔记三):在解码器(Decoder)中,当前词是看不到未来词的。所以在 Q·K^T 的结果矩阵中,上三角部分全部赋值为负无穷(-inf),Softmax 之后这些位置就变成 0。这就是“自回归”的物理实现。(关于多头注意力如何切分、拼接的具体维度变换,详见笔记一、笔记三)3. FFN(前馈网络):被90%的人忽视的“记忆主体”大多数人只盯着 Attention,但 LLM 中 2/3 的参数都藏在 FFN 里。结构:Linear(隐藏层 - 4倍隐藏层) - 激活函数(GeLU/SwiGLU) - Linear(4倍隐藏层 - 隐藏层)。本质:它是键值(Key-Value)记忆网络。第一层线性层将输入升维,相当于在“高维空间”中搜索记忆;激活函数做“门控”筛选;第二层线性层将结果压缩回原维度。工程痛点(笔记三提到):FFN 占用了巨大的显存带宽。在推理时,Flash Attention 解决了一部分显存问题,但 FFN 的权重加载依然是推理延迟的主要来源。4. 归一化(Normalization)与残差连接(Residual)的“定海神针”作用Pre-LN vs Post-LN(笔记三):早期 Transformer 用 Post-LN(残差后归一化),大模型训练极不稳定,容易梯度爆炸。现代 LLM(如 LLaMA)全换成 Pre-LN(先归一化,再进 Attention/FFN,最后加残差)。这保证了梯度的范数始终被控制在稳定范围内。残差连接:提供了“梯度高速公路”。即使底层的梯度极小,通过残差支路也能直接传回输入层,解决了“信号衰减”(耳聋)问题。5. 注意力“病理学”:工程陷阱与真相(核心干货,详见笔记三)这是你必须死记硬背的两个工程现象,否则将来 Debug 会崩溃:现象 A:注意力“下沉”(Attention Sink)在推理大模型时,无论上下文多长,第一个 Token(通常是“开始符”或“BOS”)的注意力权重总是异常高。但研究发现,这个高权重对最终的语义输出贡献极低(输出为 0)。工程对策:既然它无意义且占显存,KV Cache(笔记三)是否可以丢掉第一个 Token?窗口注意力(Sliding Window Attention)就是基于此洞察设计的——保留最近几个 Token,丢掉遥远但权重虚假的“沉没 Token”,显存占用大幅下降,且精度几乎无损。现象 B:KV Cache 的显存墙生成第 t 个 Token 时,需要存储前 t-1 个