Transformer 零基础入门:像「察言观色」的超级助手
摘要:本文用最通俗的大白话,配合图书馆找书、聚会找人等生活例子,把 Transformer 的核心原理讲清楚。你会弄懂它靠「查询、键、值」三个关键零件工作、如何用位置编码给词排座位、又怎么由编码器负责读、解码器负责写,最后用一个翻译「我喜欢猫」的小例子把整个过程串起来,并解答几个常见疑问。
一听到 Transformer,很多人第一反应就是「这玩意儿肯定特别难」。其实别怕,它没那么神秘。简单说,Transformer 就像一个特别会「察言观色」的超级助手,能看懂一句话里每个词之间的关系,然后帮你翻译、写文章、回答问题。这篇文章会用最通俗的大白话,配合图书馆找书、聚会找人这些生活里的例子,把 Transformer 的核心思想一点点讲明白。你会弄懂它靠哪三个关键零件工作、怎么给词排座位、又怎么一个负责读一个负责写,最后还会用一个翻译「我喜欢猫」的小例子,把整个过程串起来。看完你会发现,原来 Transformer 也没那么高不可攀。
1. 先别慌,Transformer 没那么神秘
很多朋友一听到 Transformer 就头大,觉得这是特别高深的东西。其实你把它想成一个「超级翻译官」就行。它最拿手的事情,就是看懂一句话里每个词之间的关系,然后帮你把这句话翻译成另一种语言,或者帮你把一句话补完整。
打个比方:你给朋友发微信说「我今天吃了苹果」,Transformer 看到这句话,它会琢磨「苹果」和「吃」有关系,「我」和「吃」也有关系。它把每个词都放在整个句子的环境里去看,而不是一个词一个词孤立地看。这就是它厉害的地方。
再举个例子:你问它「小明把球踢给了小红」,它不光知道「小明」和「小红」都是人,还知道「踢」这个动作是「小明」发出的,而「球」是「小红」接到的。它能把一句话里谁干了什么、谁收到了什么,都理得清清楚楚。这种「把每个词放到整句话里一起看」的本事,就是它和以前那些老模型最大的区别。
而且 Transformer 不只是会翻译。你让它写一段话、总结一篇文章、回答一个问题,它都能干。因为它本质上学的,就是「词和词之间怎么搭配才合理」。只要掌握了这个规律,它就能举一反三,干很多不同的活儿。所以你可以把它当成一个特别聪明、特别会理解语言的「万能助手」。
2. 一句话概括 Transformer 在干嘛
Transformer 的核心任务,就是看懂上下文。什么叫上下文?就是一句话里,每个词和它周围的词是怎么搭配的。
再打个比方:你听到「苹果」这个词,如果前面说「我咬了一口」,那这个苹果是水果;如果前面说「我买了一部」,那这个苹果是手机。Transformer 就是靠看周围的词,来判断「苹果」在这里到底是什么意思。
再比如「银行」这个词。你说「我去银行取钱」,那它知道这是存钱取钱的地方;你说「河边的银行」,那它知道这是河岸的意思。同一个词,放在不同的句子里,意思完全不一样。Transformer 最擅长的,就是根据周围的词,猜出这个词当下到底想表达什么。
所以你可以把 Transformer 理解成一个特别会「察言观色」的助手,它看一句话的时候,不是只看单个词,而是把整句话连起来看,谁和谁关系近,谁对谁影响大,它心里都有数。就像你听朋友说话,不会只抠某一个字眼,而是结合前后文去理解他真正想表达的意思,Transformer 也是这么干的。
3. 三个关键零件:查询、键、值
Transformer 内部有个很核心的机制,叫「自注意力」。听起来玄乎,其实你可以把它想成在图书馆里找书。
你心里想找一本「怎么做蛋糕」的书,这个「想法」就是查询。图书馆里每本书的标签,比如「烘焙」「菜谱」「生活」,就是键。而每本书真正的内容,就是值。
你的查询会跟每一本书的键去比对,看看哪本书跟你的需求最匹配。匹配度高的,你就多翻翻;匹配度低的,你就略过。最后你手里拿到的,就是那些跟你需求最相关的书的内容,也就是值。
在 Transformer 里也一样:句子里的每个词都会发出一个「查询」,去跟其他词的「键」比对,算出谁跟谁关系最紧密,然后按这个紧密程度去「取」对应的「值」。这样一来,每个词都能从整句话里吸收到它最需要的信息。
咱们再打个比方,帮你想得更明白。假设你在一个热闹的聚会上,想找一个人聊「最近看的电影」。你心里带着这个「话题」去扫视全场,看到聊球赛的人,你觉得不对路,略过;看到聊美食的人,也不太对,略过;终于看到有人在聊电影,你眼睛一亮,凑过去聊得特别起劲。这里的「话题」就是查询,每个人的「兴趣标签」就是键,而他们聊的具体内容就是值。Transformer 里的每个词,就是这么在整句话里「找人聊天」的。
为了帮你把这三个概念记得更牢,咱们把它们在三个场景里的对应关系放到一张表里,一眼就能看明白:
| 场景 | 查询 | 键 | 值 |
|---|---|---|---|
| 图书馆找书 | 你想找「怎么做蛋糕」的想法 | 每本书的标签,比如「烘焙」「菜谱」 | 每本书真正的内容 |
| 聚会找人 | 你想聊「最近看的电影」这个话题 | 每个人的兴趣标签 | 大家聊的具体内容 |
| Transformer 自注意力 | 每个词发出的「查询」 | 其他词的「键」 | 按匹配程度取回的「值」 |
光看概念可能还有点抽象,咱们直接上代码。下面用 NumPy 写一个最简单的自注意力计算,把「查询、键、值」这三步一步步拆开,每一步都加了注释,你照着跑一遍就懂了。
import numpy as np
假设一句话里有 3 个词,每个词用一个 4 维向量表示
行数 = 词的数量,列数 = 每个词的维度
X = np.array([
[1.0, 0.0, 1.0, 0.0], # 词 1
[0.0, 1.0, 0.0, 1.0], # 词 2
[1.0, 1.0, 0.0, 0.0] # 词 3
])
随机初始化三组权重,用来把原始词向量变成查询、键、值
这里把维度从 4 压缩到 3,方便观察
W_q = np.random.randn(4, 3) # 生成查询的权重
W_k = np.random.randn(4, 3) # 生成键的权重
W_v = np.random.randn(4, 3) # 生成值的权重
第一步:算出每个词的查询、键、值
查询 = 这个词想找什么;键 = 这个词能提供什么;值 = 这个词真正的内容
Q = X @ W_q # 查询矩阵
K = X @ W_k # 键矩阵
V = X @ W_v # 值矩阵
第二步:计算注意力分数
用每个词的查询去和所有词的键做点积,分数越高说明越匹配
scores = Q @ K.T
第三步:把分数缩一缩,再转成概率(让所有分数加起来等于 1)
除以 sqrt(3) 是为了防止分数太大,softmax 让每个词对别的词的关注度更均衡
d_k = K.shape[1]
scores = scores / np.sqrt(d_k)
weights = np.exp(scores) / np.sum(np.exp(scores), axis=1, keepdims=True)
第四步:按关注度加权求和,得到每个词融合上下文后的新表示
每个词都从整句话里吸收了它最需要的信息
output = weights @ V
print("注意力权重:")
print(weights)
print("输出向量:")
print(output)
跑完这段代码,你会看到每个词都拿到一个「融合了整句话信息」的新向量。这就是自注意力最核心的一步:每个词先发出查询,去和其他词的键比对,算出谁跟谁关系近,再按这个亲近程度去取对应的值。代码里的每一步,正好对应咱们前面讲的图书馆找书和聚会找人的例子。
上面用 NumPy 手写了一遍,能帮你把每一步的原理看得清清楚楚。不过在实际项目里,大家更常用 PyTorch 这类深度学习框架,因为它自带张量运算和自动求导,写起来更简洁,还能直接扔到 GPU 上加速。下面就用 PyTorch 把同样的事情再做一遍,你对比着看,会发现思路完全一样,只是写法更「框架化」了。
import torch
import torch.nn.functional as F
假设一句话里有 3 个词,每个词用一个 4 维向量表示
行数 = 词的数量,列数 = 每个词的维度
X = torch.tensor([
[1.0, 0.0, 1.0, 0.0], # 词 1
[0.0, 1.0, 0.0, 1.0], # 词 2
[1.0, 1.0, 0.0, 0.0] # 词 3
])
随机初始化三组权重,把原始词向量变成查询、键、值
这里把维度从 4 压缩到 3,方便观察
W_q = torch.randn(4, 3) # 生成查询的权重
W_k = torch.randn(4, 3) # 生成键的权重
W_v = torch.randn(4, 3) # 生成值的权重
第一步:算出每个词的查询、键、值
查询 = 这个词想找什么;键 = 这个词能提供什么;值 = 这个词真正的内容
Q = X @ W_q # 查询矩阵
K = X @ W_k # 键矩阵
V = X @ W_v # 值矩阵
第二步:计算注意力分数
用每个词的查询去和所有词的键做点积,分数越高说明越匹配
scores = Q @ K.T
第三步:把分数缩一缩,再转成概率(让所有分数加起来等于 1)
除以 sqrt(3) 是为了防止分数太大,softmax 让每个词对别的词的关注度更均衡
d_k = K.shape[1]
scores = scores / (d_k ** 0.5)
weights = F.softmax(scores, dim=-1)
第四步:按关注度加权求和,得到每个词融合上下文后的新表示
每个词都从整句话里吸收了它最需要的信息
output = weights @ V
print("注意力权重:")
print(weights)
print("输出向量:")
print(output)
跑完这段代码,你会得到和 NumPy 版本几乎一模一样的输出结构:每个词都拿到一个「融合了整句话信息」的新向量。区别主要在三点:第一,PyTorch 用 torch.tensor 存数据,而 NumPy 用 np.array;第二,softmax 不用自己手写公式,直接调 F.softmax 就行;第三,PyTorch 的张量能自动记录计算过程,方便后面做梯度回传,这是训练神经网络时最关键的一步。所以你可以把 NumPy 版本当成「原理说明书」,把 PyTorch 版本当成「工程实现」,两者配合着看,自注意力这块就彻底拿下了。
4. 位置信息也很重要:给词排座位
Transformer 还有一个特点,它不像人一样天生知道词的先后顺序。你说「我打你」和「你打我」,词都一样,但意思完全相反。所以 Transformer 得靠一个叫「位置编码」的东西,给每个词发一个「座位号」。
打个比方:一群小朋友排队做游戏,如果不给他们编号,老师喊「小红」的时候,大家都不知道是哪个小红。位置编码就是给每个词发一个号码牌,告诉 Transformer「我是第几个位置上的词」。这样它才知道「我打你」和「你打我」不是一回事。
再举个例子:「猫追老鼠」和「老鼠追猫」,用的词一模一样,只是顺序换了,意思就完全反过来了。如果没有位置信息,Transformer 看到这两句话,会觉得它们是一回事,那就闹大笑话了。所以位置编码特别重要,它就像给每个词贴上一个「第几位」的标签,让 Transformer 知道谁先谁后。
而且位置编码不光告诉 Transformer 顺序,还能让它知道词和词之间隔了多远。比如「小明昨天在公园里开心地喂了一只猫」,Transformer 知道「小明」和「猫」虽然隔了好几个词,但它们之间是有关系的。有了位置信息,它就能更好地判断哪些词离得近、关系紧,哪些词离得远、关系松。
5. 编码器和解码器:一个负责读,一个负责写
Transformer 整体上分两大部分:编码器和解码器。
编码器负责「读」。它把输入的句子从头到尾看一遍,理解每个词的意思和它们之间的关系,然后整理成一份「笔记」。
解码器负责「写」。它拿着编码器整理好的笔记,一个字一个字地往外蹦,生成新的内容。比如翻译任务里,编码器读中文,解码器写英文。
打个比方:编码器像一个认真做笔记的学生,把老师讲的重点都记下来;解码器像一个照着笔记写作文的学生,把笔记里的内容用自己的话写出来。
再打个比方,帮你记得更牢。编码器就像一个「阅读理解高手」,你给它一篇文章,它看完之后,能抓住重点,总结出一份提纲。解码器就像一个「写作高手」,你给它一份提纲,它能照着提纲,把内容重新写成一篇文章。一个负责「读懂」,一个负责「写出来」,两个人配合,就能完成翻译、写文章、对话这些任务。
而且你可能会问:那是不是所有任务都需要这两个部分?其实不一定。有的任务只需要「读懂」,比如判断一篇文章是好评还是差评,那就只用编码器就够了。有的任务只需要「写出来」,比如让你接着一句话往下编故事,那就只用解码器。所以 Transformer 可以灵活搭配,按需使用。
为了帮你把这两个部分的分工记得更牢,咱们把它们在输入、输出、主要任务和典型应用场景上的区别放到一张表里,一眼就能看明白:
| 对比项 | 编码器 | 解码器 |
|---|---|---|
| 输入 | 原始句子,比如中文「我喜欢猫」 | 编码器整理好的「笔记」 |
| 输出 | 一份理解后的「笔记」 | 生成的新内容,比如英文「I like cats」 |
| 主要任务 | 负责「读」,理解每个词的意思和它们之间的关系 | 负责「写」,一个字一个字地往外蹦,生成新内容 |
| 典型应用场景 | 判断文章是好评还是差评、给文章分类 | 接着一句话往下编故事、写文章、对话 |
6. 举个完整的例子:翻译「我喜欢猫」
咱们把上面这些串起来,看看 Transformer 翻译「我喜欢猫」这句话时,到底干了啥。
第一步,它给「我」「喜欢」「猫」这三个词分别发座位号,知道顺序是「我」在前,「猫」在后。
第二步,它用自注意力机制,让每个词都看看其他词。「喜欢」会注意到「我」是动作的发出者,「猫」是动作的对象。这样一来,「喜欢」就知道自己是在描述「我」对「猫」的一种感情。
第三步,编码器把这些理解整理成一份笔记,交给解码器。
第四步,解码器照着笔记,先写出「I」,再写出「like」,最后写出「cats」。一个完整的英文句子就出来了。
整个过程就像你请了一个特别细心的翻译,他不是逐字硬翻,而是先弄懂整句话的意思,再用地道的说法表达出来。
7. 为什么 Transformer 这么火?
Transformer 之所以火,是因为它有两个特别大的优点。
第一个优点是能并行处理。以前的一些模型得一个字一个字地按顺序读,速度慢。Transformer 可以同时看整句话的所有词,就像你一眼能扫完一整行字,而不是一个字一个字地念,所以训练速度快很多。
第二个优点是擅长抓长距离关系。比如一句话里,开头提到的内容,可能到结尾才用上。Transformer 的自注意力机制能让开头和结尾的词直接「对上话」,不管隔多远都能建立联系。这就好比你在一个超长的群里聊天,哪怕有人最早发了一条消息,你也能随时翻回去回复他。
正因为这两个优点,Transformer 成了现在很多大模型的地基,像我们平时用的一些智能对话、翻译、写文章的工具,背后都有它的影子。
为了帮你更直观地看清 Transformer 的优势,咱们把它和以前常用的 RNN 放到一张表里,从几个关键维度对比一下:
| 对比项 | Transformer | RNN |
|---|---|---|
| 并行处理 | 能同时看整句话的所有词,像一眼扫完整行字 | 只能一个字一个字按顺序读,没法并行 |
| 长距离依赖 | 自注意力能让开头和结尾的词直接「对上话」,隔多远都能建立联系 | 念到后面,前面念过的东西容易记不清,长句子容易「忘事」 |
| 训练速度 | 可以并行计算,训练速度快很多 | 必须一步步按顺序算,速度慢 |
| 适用场景 | 翻译、写文章、对话、分类等大多数任务都能胜任,是大模型的地基 | 适合处理较短、顺序性强的序列,比如简单的时间序列预测 |
8. 最后用一句话总结
Transformer 就是一个特别会「察言观色」的模型,它通过给每个词发座位号、让词与词之间互相「打招呼」来理解整句话的意思,然后靠编码器读懂、解码器写出来,完成翻译、写作、对话等各种任务。
下次再听到 Transformer,你只要记住:它就是一个特别会看上下文、特别会抓重点的超级助手,就够了。
9. 常见问题解答
看完上面这些,你可能还有一些小疑问。别急,咱们挑几个大家最常问的问题,用大白话再聊一聊。
问题一:Transformer 和 RNN 有什么区别?
简单说,RNN 就像一个只能一个字一个字往下念的人,念到后面,前面念过的东西可能就记不太清了,而且速度慢。Transformer 则像一眼能扫完整行字的人,能同时看到整句话里所有的词,谁和谁关系近,它一下子就能看出来,速度还快。这也是为什么现在很多大模型都爱用 Transformer。
问题二:为什么 Transformer 需要位置编码?
因为 Transformer 天生不知道词的先后顺序。你说「我打你」和「你打我」,词都一样,意思却完全相反。位置编码就是给每个词发一个「座位号」,告诉它自己是第几个位置上的词。这样它才知道谁先谁后,不会把两句话当成一回事。
问题三:Transformer 能处理多长的句子?
理论上它能处理的长度没有硬性上限,但句子越长,它要同时看的词就越多,算起来越费劲,也越占内存。所以实际使用时会有一个「窗口」限制,就像你一次能记住的聊天记录条数是有限的。超出窗口的内容,它可能就顾不上了。
问题四:Transformer 会取代所有其他模型吗?
不会。Transformer 确实很厉害,成了很多大模型的地基,但它也不是万能的。有些任务用更简单的模型反而更快、更省资源。而且现在也有不少新模型在借鉴它的思路,同时想办法补它的短板。所以更准确的说法是:Transformer 让很多任务变得更好做,但并不是所有场景都非它不可。
更多推荐

所有评论(0)