把 Block 堆起来配上输入输出,就是完整模型。本篇拆三种架构之争 + 参数量从哪来。 教学性模拟--模型结构图为示意,参数量按公开公式估算,非对某个具体权重表的精确统计。
同一套积木,拼法不同,能干的事就不同。点 tab 看。
Encoder 把整句读成表示(双向,看全文),Decoder 再逐词生成译文(带因果掩码,只看左边 + 看 Encoder 输出)。
适合「输入一段、输出一段」的任务:翻译、摘要。结构最重,现在只在特定任务用。
只有 Encoder,双向看全句。擅长理解:分类、抽取、句子相似度。
不擅长生成。BERT 用「掩码语言模型」(挖空填词)训练。现多用于专用理解模型。
只有 Decoder,单向看左边。靠「预测下一个词」训练,天然会生成。一个架构通吃理解和生成。
为什么赢?简单、统一、scaling 友好--堆大堆多就好,理解能力反而也涌现出来了。现代大模型几乎全选它。
Decoder-Only 全貌:embedding -> N × Block -> 输出头。拖滑块改层数。
输入向量过完 N 层 Block 后,过一个线性层(LM Head)把维度映回词表大小,再 softmax 得到「下一个词是哪个 token」的概率分布。这就是生成。
拖滑块设模型配置,实时算出参数量从哪来。这是「7B / 13B / 70B」到底怎么算出来的。
| 部位 | 公式 | 参数量 |
|---|---|---|
| Embedding | vocab × d_model | 0 |
| 每层注意力 (QKVO) | 4 × d_model² | 0 |
| 每层 FFN | 2 × d_model × d_ff | 0 |
| 全部 Block | n_layers × (attn+ffn) | 0 |
| LM Head (若不共享) | vocab × d_model | 0 |
注意力每层是 4·d_model²,FFN 是 2·d_model·d_ff = 2·d_model·(4·d_model) = 8·d_model²。所以每层里 FFN 是注意力的两倍,是参数和计算的大头。这也是第 6 篇 MoE 要把 FFN 换成「多个小 FFN 稀疏激活」的原因--它最胖,最值得优化。
| 术语 | 一句话 |
|---|---|
Encoder-Decoder | 双向编码+单向解码,适合翻译/摘要 |
Encoder-Only | 双向理解,BERT,擅长分类/抽取 |
Decoder-Only | 单向预测下一个词,GPT/Llama,现代主流 |
LM Head | 把 hidden 映回词表维度的线性层 |
7B / 13B / 70B | 参数量简写,B = billion = 10 亿 |
参数大头 | FFN(约 2/3)+ 词表嵌入(vocab 大时很重) |
骨架有了,怎么把它从随机变成有知识?损失、优化器、三阶段训练。