很多人第一次看到 ChatGPT 的输出时,第一反应是*“这不是魔法吗”*。它怎么知道我在问什么?它怎么能写出看起来这么合理的文字?
这种神秘感会阻碍理解。事实上,大语言模型的底层原理并不神秘——它建立在一系列非常朴素的想法之上。只要你能理解 向量 是什么,剩下的部分就是几个直觉的堆叠。
这篇文章的目标不是讲清楚数学,而是让你在脑子里建立一张”地图”:词是怎么被计算机理解的?注意力机制到底在做什么?为什么 Transformer 这么有效?
真正理解一件事,就是能用最朴素的语言把它讲明白。
Richard Feynman
词是怎么变成数字的
计算机不理解”苹果”这两个字,它只认识数字。所以要让计算机处理语言,第一步就是把词变成数字。最原始的做法是 one-hot 编码:给每个词一个唯一的 ID。
但这种方法有一个致命问题:它没法表达词与词之间的关系。在 one-hot 编码里,“国王”和”王后”的距离,跟”国王”和”香蕉”的距离是一样的——这显然不合理。
于是人们发明了词向量(word embedding)。每个词被表示为一个几百维的向量,向量之间的距离反映了语义的相似度。一个经典的例子:
# 那个著名的向量运算
vec("国王") - vec("男人") + vec("女人") ≈ vec("王后")
# 余弦相似度:两个词在语义空间中的"夹角"
def similarity(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
similarity(vec_king, vec_queen) # → 0.73
similarity(vec_king, vec_banana) # → 0.11
到这一步,语言的”几何结构”第一次浮现了。但还不够——一个词在不同上下文里有不同的含义。“打”在”打球”和”打酱油”里完全不是一回事。
注意力:模型学会了「看上下文」
2017 年的论文 Attention Is All You Need 提出了一个关键想法:让每个词的表示动态地根据上下文中的其他词来调整。这个机制就是自注意力(self-attention)。
打个比方,想象你在读这句话:
- “那只猫在阳光下睡觉,它看起来非常惬意。”
- 当你读到”它”的时候,大脑会自动把”它”和前面的”猫”联系起来。
- 这个”联系”的过程,在 Transformer 里就是注意力。
具体是怎么实现的
每个词会生成三个向量:Query(我在找什么)、Key(我是什么)、Value(我携带什么信息)。用 Query 去和其他词的 Key 做匹配,匹配分数高的,就把它的 Value 加权吸收过来。
这段话浓缩了 Transformer 的核心。如果你读到这里还没晕,那就掌握了 80%。剩下的 20% 是工程细节——多头、位置编码、归一化——都是为了让这个核心跑得更稳、更快。
为什么这个架构这么有效
我觉得有三个原因:
- 并行性。RNN 必须一个词一个词地处理,Transformer 可以同时看整句话。这让大规模训练变得可能。
- 长距离依赖。任何两个词之间的距离都是 1 步,而不是 RNN 里的 n 步。
- 可扩展性。加参数、加数据、加算力,性能就线性提升——这就是所谓的 Scaling Law。
这也是为什么我们今天能有 GPT-4、Claude 这样的模型。不是因为某个天才算法突破,而是一个朴素的架构被推到了极致。
下一篇,我会写写”涌现能力”是怎么回事——为什么模型规模到了某个临界点,突然就会做推理、会写代码、甚至会”理解”幽默。