法国的首都是___
当大模型生成一个新词时,模型内部的矩阵是如何变化的?
矩阵乘法
让我们先可视化矩阵乘法。注意两个矩阵的维度是如何匹配的,我们将在下面的可视化中使用这种模式。

蓝色:数据(张量)
灰色:模型权重
Embedding (嵌入)

从嵌入层开始。假设一个词等于一个token。
输入句子:The capital of France is ___
-> [‘The’, ‘capital’, ‘of’, ‘France’, ‘is’]
-> [464, 3361, 295, 2238, 318],这是它们的Token ID
这形成了一个 [1, 5] 向量。
数据现在进入大小为 [50,000, 768] 的嵌入表进行查找:
- The = [0.316, 0.524, 0.063, …]
- capital = [0.123, 0.234, 0.345, …]
- of = [0.432, 0.543, 0.654, …]
- France = [0.543, 0.654, 0.765, …]
- is = [0.654, 0.765, 0.876, …]
-> 因此,我们获得了一个 [5, 768] 的矩阵!
我们将其填充(追加0)到长度1024,现在变为 [1024, 768]。
Transformer Block (Transformer块)

三个关键矩阵:Q, K, V。每个都是 [768, 64] * 12。
对于一个头,[1024, 768] * [768, 64] = [1024, 64]
Q 12个头 = [1024, 64] + [1024, 64] + … + [1024, 64]
= [1024, 64] * 12 = [1024, 768]
K和V是一样的。
K^T = [768, 1024]
QK^T = [1024, 1024]
Softmax(QK^T/√d) = [1024, 1024]
Attn = Softmax(QK^T/√d) * V = [1024, 768]
MLP有两层:一层使用 [768 × 3072] 扩展4倍,一层使用 [3072 × 768] 收缩
变化:[1024, 768] -> [1024, 3072] -> [1024, 768]
整个过程

提取最后一行:[768]
然后,使用原始嵌入表 [50,000, 768] 映射回Token ID,检索最终单词:Paris
模型参数
所有transformer模型都有类似的结构,只是层数(12)、d_model(768)、d_head(64)等数量不同。附录显示了著名模型的参数数量。
最新的研究旨在利用不同的注意力机制(例如MLA, NSA)减少参数总数,这不是本文的重点。
感谢阅读!🎉 🥰 🫡
附录:参数数量
注意下面的表格由AI辅助,未经过仔细的人工验证。
Llama系列

Qwen系列

DeepSeek系列

ChatGPT系列

其他
鉴于Claude和Gemini是闭源的,仅仅展示猜测并没有太大价值。Grok也是一样,Grok-3刚刚发布。让我们拭目以待!