📚 本文是《Transformer 由浅入深》系列第 1 篇 · 阶段一「建立直觉」
如果你只听说过 GPT、Claude 这些名字,却一直没搞懂它们底下那个反复被提到的 Transformer 到底是什么,这个系列就是写给你的。
我们不从公式开始,而是从一个更朴素的问题入手:在 Transformer 出现之前,人们是怎么处理语言的?他们卡在了哪里? 想清楚这件事,你就会明白 2017 年那篇《Attention Is All You Need》为什么会成为分水岭——因为它不是又一次小修小补,而是把整个思路掀翻重来。
打个比方:很多技术进步是"把马车的轮子换得更好",而 Transformer 是"干脆不用马了,改开汽车"。它不是在旧路上跑得更快,而是直接换了一条路。要体会这一点有多关键,我们得先看看旧那条路到底堵在哪。
本篇目标
读完这一篇,你应该能回答三个问题:
- 什么叫"序列建模",它为什么难?
- Transformer 之前的主力方案(RNN / LSTM)是怎么工作的,又栽在哪两个坑里?
- Transformer 用一句话概括是怎么绕开这两个坑的?
全程没有公式,只有比喻和图景。如果中间有哪句话你没看懂,别急着往下翻——大概率不是你的问题,而是我比喻没打到位,你可以先停下来,在脑子里把那个画面想象出来再继续。
阅读前提
你只需要知道两件事:
- 神经网络大致是"输入一堆数字、经过一层层计算、输出一堆数字"的东西;
- 一个词可以被表示成一串数字(叫"向量",vector),意思相近的词,数字也相近。
就这些。其余概念我们边走边讲。
关于第二点再多说一句,因为它后面很重要。你可以把"把词变成一串数字"想象成给每个词在一张巨大的地图上标一个坐标:意思相近的词,坐标也挨得近。比如"猫"和"狗"会落在地图上靠近"动物"的那片区域,而"开心"和"愉快"会挤在另一个角落。模型之所以能"理解"语言,靠的就是在这张数字地图上做各种计算。你现在不用关心这张地图怎么画出来的,只要记住:对模型来说,词不是字符,而是一组坐标。
1. 什么是"序列建模"
语言是有顺序的。“猫追狗"和"狗追猫”,用的字一模一样,意思却相反——区别全在顺序里。所以任何想理解语言的模型,第一关就是处理一串有先后关系的东西。这类问题统称序列建模(sequence modeling)。
其实"顺序很重要"这件事在生活里到处都是。手机解锁密码 1234 和 4321 是两回事;一段旋律,音符顺序一打乱就成了噪音;做菜的步骤,“先放油再放菜"和"先放菜再放油"结果天差地别。语言只是其中一种特别复杂的"有顺序的东西”,而序列建模研究的,正是怎么让机器读懂这种顺序背后的规律。
我们先把语言切成一个个小单位,叫 token(你可以暂时粗略地理解成"词"或"字")。于是一句话就变成一串 token:
[我] [今天] [很] [开心]
序列建模的任务,常见的有两种形态:
- 续写:给你前面几个 token,预测下一个最可能是什么。(“我今天很__” → “开心”)
- 转换:给你一整串 token,产出另一串。(中文句子 → 英文句子,这就是机器翻译)
你每天用的输入法,其实就是一个朴素的"续写"玩家:你打了"我今天很",它跳出来的候选词里大概率有"开心"“累"“忙”,而不会是"冰箱”。它凭什么猜?就凭前面那几个词给的上下文。GPT 做的事情,本质上和这个一模一样,只不过它"猜下一个词"的本事被放大了千万倍。
这两件事有个共同的硬要求:预测当前这个词,必须依赖前面(有时还有后面)的一大片上下文。“开心"之所以合理,是因为前面有"我今天很”。模型必须有办法记住并利用前文。
一句话:序列建模 = 在"顺序"和"上下文"都很重要的前提下,处理一串 token。难点全在"怎么把相关的上下文有效地带到当前位置"。
2. RNN / LSTM:用"记忆"处理序列
Transformer 之前,处理序列的当家方法是 RNN(循环神经网络,Recurrent Neural Network)。
它的思路非常符合直觉:像读书一样,从左到右一个词一个词地读,边读边在脑子里维护一份"笔记"。
想象你在听一个朋友讲一件很长的事。你不可能把他说的每个字都原样背下来,而是边听边在心里不断更新一个"目前为止他到底在说啥"的印象。听到新内容,你就把它和已有的印象揉一揉,刷新成一个新印象。RNN 干的就是这件事,分毫不差。
这份"笔记"有个术语叫隐藏状态(hidden state)。你可以把它想象成一根接力棒:
笔记₀ → 笔记₁ → 笔记₂ → 笔记₃
│ │ │ │
[我] ─┘ [今天]─┘ [很] ─┘ [开心]─┘
每读到一个新词,模型就把"手里的旧笔记"和"当前这个词"揉到一起,更新成一份新笔记,再传给下一步。读到最后,这份笔记理论上就浓缩了整句话的信息。
这里要特别留意"接力棒"这个比喻的两个特征,因为后面两个痛点全藏在里面:第一,笔记是一份,容量有限,新内容进来就得挤掉一点旧内容;第二,棒子必须一棒一棒地传,第三棒的人必须等第二棒跑到才能起跑。记住这两点,你几乎可以自己推导出后面的坑。
朴素 RNN 有个老毛病:笔记传着传着就忘了开头(技术上叫"梯度消失",信息在反复传递中被冲淡)。这就像传话游戏:一句话经过十几个人的嘴,传到最后往往面目全非——不是谁故意改,而是每传一次都难免走样一点,累积起来就崩了。
于是人们发明了 LSTM 和 GRU,给这根接力棒加了几道"闸门",让它能更主动地决定记住什么、忘掉什么。你可以把这些闸门理解成笔记本上的一个"重点标记笔":遇到重要的内容(比如句子的主语),就重重画个圈,提醒后面的自己"这个别忘";遇到无关紧要的语气词,就让它自然淡去。这确实缓解了遗忘,LSTM 也因此统治了序列建模很多年。
但无论怎么加闸门,RNN 这套"接力棒"的根本结构没变——还是一份笔记、还是一棒一棒传。而正是这个结构,藏着两个绕不过去的硬伤。
3. 痛点一:长距离依赖
先看第一个。请读这句话:
我养的那只去年从老家带过来、特别黏人的猫,昨天竟然自己学会了开门,它真是太聪明了。
句末的"它"指的是谁?是"猫"。可"猫"和"它"之间隔了一长串修饰语。对 RNN 来说,“猫"这个信息必须沿着接力棒一站一站地传,中间经过十几个词,每传一次都被新内容稀释一点。等传到"它"那里,关于"猫"的记忆可能已经模糊得不成样子。
再用传话游戏体会一次:如果"猫"这个词是排在队首的第一个人喊出来的,而"它"是排在队尾的人,中间隔着十几个人的转述,等消息传到队尾,“猫"早就被沿途的"去年"“老家"“黏人"“开门"这些新词淹没了。队伍越长,队首的声音越听不清——这不是哪个人不努力,而是这种"排队传话"的方式本身就有上限。
这就是长距离依赖(long-range dependency)问题:两个相关的词在句子里离得越远,RNN 越难把它们关联起来。 LSTM 的闸门能让记忆衰减得慢一些(相当于让每个传话的人都尽量大声复述重点),但"信息必须一步步顺着传"这个前提没变——路径越长,损耗越大,这是结构决定的。
而语言里,远距离的关联恰恰无处不在:代词指代、主谓一致、段落呼应……举几个例子你就有感觉了:“那个我昨天在书店遇到、还借了我一把伞的人,今天又来了”——“来了"的主语在十几个字之外;一篇小说开头埋的伏笔,可能到结尾才呼应。人类读起来毫不费力,因为我们可以随时"回头看一眼”,而 RNN 没有回头看的能力,它只有手里那份越传越糊的笔记。你可以这样体会差距:让你读完一整页字之后,只凭脑子里一句话的印象去回答细节问题,而不准翻回去看——这正是 RNN 的处境,它被迫"读后即忘”,而我们随时能翻页核对。这是个致命的痛点。
4. 痛点二:无法并行
第二个痛点更要命,因为它卡的是速度。
回看那张接力棒的图:要算"笔记₂”,你必须先有"笔记₁”;要算"笔记₁”,得先有"笔记₀”。 每一步都依赖上一步的结果。这意味着整句话只能严格地、一个词一个词地串行计算,前一个没算完,后一个动都不能动。
这就像 100 米接力赛:再快的第二棒选手,也必须站在原地干等第一棒把棒子递到手里,他不能提前起跑。哪怕你雇了八个世界冠军,这场比赛的总时间也是四个人时间的相加,而不是其中最快那个人的时间。RNN 处理一句话就是这样,长度多少就得跑多少棒,一棒都省不掉。
这在今天是无法接受的。现代 AI 的算力主力是 GPU,而 GPU 最擅长的就是同时做成千上万次计算(并行)。这里也打个比方:CPU 像一个数学博士,单兵作战能力极强,但同一时刻只能算一道题;GPU 则像一万个小学生,每个人只会算简单的加减乘除,但他们能一起开工。如果你的任务能拆成一万道互不相干的简单计算,GPU 就快得离谱;可一旦这些计算必须排队、后一道要等前一道的答案,那一万个小学生里就只有一个在干活,剩下 9999 个全在围观。RNN 的串行结构,正是逼着 GPU 进入这种"一个干、一群看"的尴尬局面——再强的 GPU 也只能干瞪眼。
训练大模型要喂海量文本。如果每句话内部都必须串行处理,训练时间会长到无法想象。“无法并行"直接堵死了把模型和数据规模做大的路。 而我们后来都知道了,“做大"恰恰是通往强大语言模型的关键——今天这些让人惊艳的大模型,几乎都是靠"更多数据 + 更大模型 + 更强算力"硬堆出来的,而这条路的入场券,就是"能并行”。
5. 一句话概括 Transformer 的解法
现在,两个痛点摆在桌面上:
- 长距离依赖——信息顺着接力棒传,越远越糊;
- 无法并行——必须一步接一步,喂不饱 GPU。
注意,这两个问题其实同根同源:都来自"循环"这个结构,来自"信息必须沿着序列一步步流动"这个假设。换句话说,只要你还在玩"排队传话 + 接力跑"的游戏,这两个毛病就甩不掉——它们是这套玩法的一体两面。
Transformer 的解法干脆利落——那就把"循环"整个扔掉。
这一步在当时是反直觉的。大家都觉得"处理顺序,当然要顺着顺序来”,就像读书当然要从左读到右。Transformer 偏不,它说:我可以把整句话一次性摊在桌面上,让每个词同时和所有词打交道。
它换上一种叫注意力(attention)的机制。一句话概括它的核心思想:
让句子里的每一个词,都能"直接"看到其他所有词,并自己决定该重点关注谁。
换个画面:RNN 像是蒙着眼睛排队传话,每个人只能听到前一个人的转述;而 Transformer 像是把所有人请进一个会议室,围成一圈,谁都能直接看到谁的脸。“它"想知道自己指代谁,不用再问旁边的人层层打听,而是直接抬头扫一圈全场,一眼锁定"猫”。
体会一下这句话同时干掉了两个痛点:
- 没有了距离:“它"想找"猫”,不用再沿接力棒走十几步——它可以一步直达,直接看向句子里的任何一个词。再远的依赖,距离都是 1。开会的时候,坐在你对面的人和坐在你隔壁的人,你扭头看到他们花的力气是一样的,跟距离无关。
- 没有了串行:既然每个词都是独立地"环顾全场",那所有词的计算彼此不依赖,完全可以同时进行——GPU 的千手齐动,终于派上用场。这就好比从"接力赛"变成了"所有人同时起跑的百米赛",一声枪响,全场一起冲。一句话里有几百个词,就让几百个小学生同时开工,GPU 终于不再有谁闲着。
这就是为什么那篇论文敢叫《Attention Is All You Need》(注意力就是你所需要的全部)。听起来狂,但它确实只靠注意力,就重写了序列建模的游戏规则。
当然,“让每个词直接看到所有词"说起来轻巧,具体怎么实现?谁看谁、看多少、怎么算——这些正是后面几篇要一层层拆开的。这里你只要先把那个"会议室"的画面刻在脑子里,后面的内容都会挂在这个画面上。
常见疑问与易错点
问:既然 Transformer 这么好,那 RNN/LSTM 是不是已经彻底没用、被淘汰了? 答:不是。在自然语言这种又长又讲究远距离关联的任务上,Transformer 几乎全面胜出。但 RNN 这类结构在一些场景里依然有它的位置,比如序列很短、对内存和算力很敏感的小设备,或者某些实时流式处理的任务。而且近两年也出现了一些"想把 RNN 的长处和 Transformer 的长处结合起来"的新结构。所以更准确的说法是:在大模型这条主线上,Transformer 成了绝对主角,但"循环"的思想并没有完全消失。
问:LSTM 不是已经加了闸门、能记得更久了吗?为什么还说它有长距离依赖问题? 答:闸门确实让 LSTM 比朴素 RNN 记得久很多,这是实打实的进步。但闸门改的是"记忆衰减得多快”,没改"信息必须一站一站顺着传"这个根本前提。就像传话游戏里你让每个人都尽量大声、尽量准确地复述,确实能传得更远一点,可只要还是一个传一个,队伍足够长时,队首的话终究会失真。它把问题缓解到了很小,但没有从结构上消除。 Transformer 的"一步直达"才是从根上绕开了这个问题。
问:Transformer 把"循环"扔了,那它到底靠什么知道词的先后顺序?“猫追狗"和"狗追猫"它还能分清吗? 答:这是个特别好、也特别容易被忽略的问题。注意力机制本身确实不带顺序信息——把所有词摊在桌上同时看,天然就丢掉了"谁在前谁在后”。所以 Transformer 必须用一个额外的手段单独把位置信息补回去,这个手段叫位置编码(positional encoding)。你可以先理解成:给每个词额外贴一个"座位号",告诉模型"我是第几个"。这部分我们专门留到本系列第 5 篇细讲,这里你只要知道:顺序没被忘,是用另一种方式补上的。
问:既然每个词都能直接看到所有词,那句子很长的时候,计算量会不会爆炸? 答:你的直觉非常准。“每个词都要和所有词两两打交道”,意味着计算量大致随句子长度的平方增长——10 个词是 100 次,1000 个词就是 100 万次。这正是 Transformer 真实存在的代价,也是为什么早期模型能处理的文本长度有限制。学术界和工业界为此发明了大量优化方案(更省的注意力算法、更长的上下文窗口等)。这部分属于"进阶话题",我们放到本系列最后一篇(第 10 篇)再聊。简单说:Transformer 用"算得多"换来了"传得准、跑得快",而这笔买卖在有 GPU 的时代非常划算。
问:文中说的 token,到底是"字"还是"词"?为什么不直接按词来切? 答:本篇为了好懂,把 token 粗略说成"词"或"字",但真实情况介于两者之间。实际系统里用的是一种叫子词(subword)的切法,会把常见词整个保留、把生僻长词拆成几块(比如把一个很长的英文单词拆成词根 + 后缀)。这样做是为了在"词表别太大"和"别出现完全不认识的词"之间取得平衡。你现在完全不必纠结细节,把 token 理解成"模型眼里的一个最小处理单位"就够了,后面用到时我们再展开。
问:注意力(attention)是不是就是说模型像人一样"集中注意力"?这个比喻靠谱吗? 答:方向上靠谱,但别太当真。说它"注意",是因为它确实会对不同的词分配不同的"关注权重"——和当前任务相关的词权重高,无关的词权重低,这点和人的注意力很像。但它内部其实是一套明确的数学计算,没有任何"主观意识"。把"注意力"当成一个形象的外号就好,真正的机制是怎么算出这些权重的,正是下一篇要拆的核心。打个比方:它更像一个会自动调节音量的调音台,把相关词的声音调大、无关词的声音调小,而不是一个会"走神"或"专注"的人脑。
小结 & 下一篇预告
这一篇我们没碰任何公式,只想让你记住一条主线:
- 语言是有顺序、重上下文的,处理它叫序列建模;
- 老方案 RNN/LSTM 像接力棒一样串行传递记忆,栽在两个结构性痛点上:长距离依赖(远了就忘)和无法并行(喂不饱 GPU);
- Transformer 用注意力取代循环,让每个词直接环顾全场——既缩短了距离,又解放了并行。
如果你只想带走一个画面,那就是这个:RNN 是蒙眼排队传话,Transformer 是开圆桌会议。 前者的所有毛病,都来自"排队";后者的所有威力,都来自"同时看见彼此"。
那么,这个神奇的"注意力"到底是什么?它凭什么知道一个词该"关注"谁?下一篇,我们用一个逛图书馆的比喻,把 attention 最核心的三个概念——Query、Key、Value——讲到你会心一笑,全程依然不上公式。
📖 系列目录
- 为什么需要 Transformer?(本篇)
- 注意力到底在"注意"什么?
- Self-Attention 的数学
- 多头注意力
- 位置信息从哪来?位置编码
- 一个 Transformer Block 的全貌
- Encoder-Decoder 完整架构
- 从 Transformer 到 GPT 与 BERT
- 训练与生成
- 效率与现代变体