1. Transformer 是什么
这是什么:Transformer(变换器) = 2017 年论文《Attention Is All You Need》提出的神经网络结构,今天所有大模型的"发动机"——GPT、DeepSeek 背后跑的都是它。
为什么用:LLM 教程 告诉你大模型会"文字接龙",但没说接龙是谁在转。想知道 Prompt 底下模型内部到底在算什么,必须拆开 Transformer 看一眼——这也是读懂一切 AI 论文与应用的第一把钥匙。
如何用:本章只用 NumPy 感受全篇的地基——两个向量的点积就能衡量"相似度"。后面五章再一层层把手搓的组件拼成一个迷你 Transformer。
本栈全程只用 NumPy 手搓,不装 PyTorch:每个公式都能复制粘贴 30 秒内跑完。真实大模型 = 这里的算式 + 用海量数据训练出来的权重。
老思路:一个词一个词往前读
Transformer 之前,语言模型的主流是循环神经网络(RNN,Recurrent Neural Network):把句子按顺序逐词读进网络,读到第 5 个词时,前 4 个词的信息都压缩在同一个"记忆向量"里。
问题出在两点:一是记忆会"稀释"——读到句尾时开头的信息早被冲淡;二是逐词串行,长句子就得排队等,训练起来慢。这两点正好卡住了后来"读整本书、写长文"的需求。
新思路:让每个词一眼看全所有词
论文标题就是答案:注意力(Attention)够了。让句子里每个词同时"看"整个句子,直接用点积(dot product)给"该看谁多少眼"打分——点积是线性代数里衡量两个向量方向是否一致的标准工具,越一致值越大:
import numpy as np
cat = np.array([9, 1, 0]) # "猫"的词向量(示意)
tabby = np.array([8, 2, 0]) # "狸花猫"的词向量(示意)
rocket = np.array([0, 1, 9]) # "火箭"的词向量(示意)
def similarity(a, b): # 余弦相似度:方向越一致,值越接近 1
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
print(np.round(similarity(cat, tabby), 3)) # 猫 vs 狸花猫
print(np.round(similarity(cat, rocket), 3)) # 猫 vs 火箭
你会看到:
0.991
0.012
| 代码 | 作用 |
|---|---|
np.array([9, 1, 0]) |
假装的"词向量":真实模型的向量是几十维到几千维 |
np.dot(a, b) |
点积:对应元素相乘再相加,衡量两向量的"重合度" |
np.linalg.norm(a) |
向量长度,用来归一化,免得长向量占便宜 |
np.round(x, 3) |
保留 3 位小数,只为了好看 |
记忆口诀:循环逐词慢如牛,注意力一眼全收;点积打分定亲疏,RNN 退役 Transformer 上。
两种玩法:GPT 与 BERT
同一个 Transformer 图纸,装两种用法:
- 解码器(Decoder):遮住后面的词,一个一个往后猜——GPT、DeepSeek 这类生成模型的玩法
- 编码器(Encoder):把整句话一起读进去做理解——BERT 这类理解模型的玩法
后面的章节怎么拆:第 2 章 文字变向量;第 3 章 注意力的 Q/K/V 主菜;第 4 章 多头与残差补齐一层;第 5 章 解决词的顺序问题;第 6 章 补齐编码器玩法 BERT;第 7 章 把所有组件串成迷你 Transformer。
动手改
- 把三行注释里的"猫 / 狸花猫 / 火箭"换成你自己拟的两组词向量,看相似度怎么变
- 把
rocket改成[9, 1, 0],想想为什么"火箭"瞬间和"猫"很像 - 给每个向量多加一维再算,体会"维度高一点、区分度就好一点"的感觉
下一章:从文字到向量,把"猫吃鱼了"变成一堆数字 🐸