生成模型架构
1 Transformer 基础
| 文件 | 核心内容 |
|---|---|
Transformer.md |
整体架构 / Self-Attention / FFN / Cross-Attention / 残差与归一化 / 位置编码 / 数据流 / Shape 推导 / 三种架构权衡 |
- 手推 Multi-Head Attention 的完整 Shape 变化
- 解释 Encoder-only / Decoder-only / Encoder-Decoder 的适用场景
- 说清楚 Cross-Attention 如何把文字注入图像生成过程
2 LLM 架构深化
从 Transformer 出发,补全工程落地和现代 LLM 的具体设计选择。
2.1 注意力机制优化
文件:attention-variants.md(待写)
| 话题 | 学习重点 |
|---|---|
| Flash Attention | IO-aware 计算:为什么重新排列计算顺序能省显存,Tiling 的直觉 |
| GQA / MQA | Group Query Attention:KV 头数 ≠ Q 头数,减少 KV Cache,LLaMA 3 用的就是这个 |
| Sliding Window Attention | Mistral 的局部注意力,如何处理超长序列 |
| Sparse Attention | BigBird / Longformer 的稀疏模式,\(O(L)\) vs \(O(L^2)\) |
面试高频: Flash Attention 为什么快?GQA 和 MHA 的参数量差异?
2.2 位置编码深化
文件:positional-encoding.md(待写)
| 话题 | 学习重点 |
|---|---|
| Sinusoidal | 原理 + 为什么相邻位置更相似 + 超长序列的退化问题 |
| 可学习位置编码 | BERT 的方案,训练长度之外的外推问题 |
| RoPE | 旋转矩阵推导 + 相对位置的数学性质 + YaRN / LongRoPE 的外推方法 |
| ALiBi | 直接在 Attention 分数上加线性偏置,无需改变向量 |
面试高频: RoPE 如何做到只依赖相对位置?如何把上下文扩展到 128k?
2.3 归一化与训练稳定性
文件:normalization.md(待写)
| 话题 | 学习重点 |
|---|---|
| LayerNorm vs BatchNorm | 归一化维度的本质区别,NLP 选 LN 的原因 |
| Pre-Norm vs Post-Norm | 梯度流动的差异,Pre-Norm 为何不需要 Warmup |
| RMSNorm | 去掉均值中心化,只保留缩放,LLaMA 用的方案,更省计算 |
2.4 FFN 变体与 MoE
文件:ffn-moe.md(待写)
| 话题 | 学习重点 |
|---|---|
| SwiGLU | \(x \cdot \text{Swish}(W_1 x) \odot W_2 x\),门控机制代替固定激活,LLaMA 默认配置 |
| Mixture of Experts | 每个 token 只激活 K 个专家,参数量大但计算量不变,Mixtral / GPT-4 的核心 |
| MoE 路由机制 | Top-K 路由 + 负载均衡 Loss,如何防止所有 token 都选同一个专家 |
面试高频: MoE 的参数量和计算量分别是怎么算的?
2.5 KV Cache 与推理优化
文件:kv-cache.md(待写)
| 话题 | 学习重点 |
|---|---|
| KV Cache 原理 | 自回归生成中为什么可以缓存,节省了哪些重复计算 |
| 显存占用分析 | Cache 大小 = \(2 \times B \times L \times H \times d_k \times \text{层数}\),如何估算 |
| Paged Attention | vLLM 的核心:把 KV Cache 按页管理,支持动态长度 |
| Speculative Decoding | 用小模型草稿 + 大模型验证,提升吞吐量 |
3 文生图核心组件
3.1 VAE(变分自编码器)
| 话题 | 学习重点 |
|---|---|
| 为什么要压缩到潜空间 | \(512\times512\) 像素直接做 Attention 的计算量,Latent Diffusion 的动机 |
| Encoder / Decoder 结构 | 下采样 8 倍:\(512\times512\times3 \to 64\times64\times4\) |
| KL 散度正则项 | 为什么不用普通 AE,隐变量需要满足什么分布 |
| VQ-VAE | 离散潜空间变体,DALL-E 1 / AudioCodec 的基础 |
在 SD 里的位置: 图像 → VAE Encoder → 潜变量(扩散/去噪在这里进行)→ VAE Decoder → 图像
3.2 扩散过程(DDPM)
| 话题 | 学习重点 |
|---|---|
| 前向过程 | 马尔可夫链加噪,$q(x_t |
| 反向过程 | 网络预测噪声 \(\epsilon_\theta\),贝叶斯反转的直觉 |
| 训练目标 | 简化的 MSE Loss,为什么预测 \(\epsilon\) 比预测 \(x_0\) 更稳定 |
| DDIM | 从随机采样到确定性采样,加速推理步数从 1000→20 |
| CFG(无分类器引导) | 条件生成 + 无条件生成的线性插值,\(w\) 参数控制文字对图像的控制强度 |
在 SD 里的位置: 纯噪声 \(z_T\) → 去噪网络(UNet/DiT)× \(T\) 步 → 清晰潜变量 \(z_0\)
3.3 文本编码器(CLIP / T5)
文件:text-encoder.md
| 话题 | 学习重点 |
|---|---|
| CLIP 对比训练 | 图文对的相似度最大化,训练目标和 InfoNCE Loss |
| CLIP 文本塔结构 | Encoder-only,输出 shape [seq_len, 768],作为 Cross-Attention 的 K/V |
| T5-XXL | 只用 Encoder 侧,输出 [seq_len, 4096],更强的长句语义理解 |
| SDXL 的双编码器 | CLIP-L + OpenCLIP-G 拼接,[seq_len, 2048] |
| FLUX / SD3 | T5-XXL + CLIP-L 同时使用,两者特征如何融合 |
在 SD 里的位置: Prompt → 文本编码器 → [L_text, D_text] → Cross-Attention 的 K/V
3.4 去噪网络架构(UNet vs DiT)
文件:denoising-network.md
| 话题 | 学习重点 |
|---|---|
| UNet 结构 | 编解码对称 + Skip Connection,ResBlock + Self-Attention + Cross-Attention 的位置 |
| 时间步条件注入 | \(t\) 经过 Sinusoidal 编码后,通过 AdaLN 注入每个 Block |
| DiT(Diffusion Transformer) | 用 Transformer 块替代 UNet,Patch Embedding 把图像切成序列 |
| MM-DiT(FLUX / SD3) | 文字和图像 token 在同一个注意力层里互相看,双流架构 |
| ControlNet | 在 UNet/DiT 的基础上加旁路控制,Canny / Depth / Pose 条件如何注入 |
模块四:系统串联
把所有组件拼起来,理解完整的训练和推理流程。
4.1 Stable Diffusion 完整架构
文件:stable-diffusion.md
从一张图说清楚:Prompt → CLIP/T5 → KV;噪声 → VAE 潜空间 → UNet(Cross-Attention)→ 去噪 → VAE Decoder → 图像。每个箭头对应一个模块,每个模块的 shape 是什么。
4.2 进阶话题
| 话题 | 文件 |
|---|---|
| LoRA:低秩适配的数学原理 | lora.md |
| ControlNet:旁路控制的结构设计 | controlnet.md |
| Flash Attention 实现细节 | 归入 attention-variants.md |
| LLM 对齐:RLHF / DPO | alignment.md |
| 长上下文:YaRN / LongRoPE | 归入 positional-encoding.md |
推荐学习顺序
Transformer.md (✅)
↓
diffusion.md ←── 理解扩散过程主线
↓
vae.md ←── 理解为什么在潜空间操作
↓
text-encoder.md ←── 理解文字如何变成 K/V 向量
↓
denoising-network.md ←── UNet 和 DiT 的架构差异
↓
stable-diffusion.md ←── 全链路串联,复盘每个 shape
↓
attention-variants.md ←── 回头补 LLM 工程细节
kv-cache.md
ffn-moe.md
学习策略 每个文件的目标:直觉先行 → 公式推导 → Shape 手算 → 在文生图/LLM 里的具体落点。遇到陌生公式先问"它在做什么",再问"它的 shape 是什么"。