周末闲聊的时候,老婆问我最近在忙什么。我说在读一些关于大模型的论文,她就问”那你给我解释一下什么是 Transformer 吧”。我想了想,觉得这个问题挺有意思,值得认真想想怎么说。
从一个问题开始
我拿了三句话给她看:
- A cat didn’t cross the road because it was tired.
- A cat didn’t cross the road because it was rainy.
- A cat didn’t cross the road because it was wet.
“这三句话里,最后的 ‘it’ 分别指代什么?”
她很快说出来了:”第一句是猫累了,第二句是下雨了,第三句……那个’wet’呢,可能是猫湿了,也可能是路湿了,还是需要更多信息才能知道吧?”
“对。这就是我要说的问题。”
她说:”哦,那就是要理解上下文才能知道。”
“对,就是这样。现在问题来了,一个神经网络怎么做到这一点呢?”
为什么 RNN 最开始也这样想
最早的神经网络处理句子就是一个一个词读的,像在传话一样,读到最后一个词的时候,还要记住最开始读的是什么。这就是 RNN(Recurrent Neural Network)的想法——每读一个词,都会产生一个”状态”,这个状态会被传到下一个词,下一个词又会产生新的状态……
这个想法其实还可以,对很多短句子管用。但问题是,这些状态像电话传话一样,越往后传越容易变形。比如说你要理解最后那个 “it”,你需要记住前面的”cat”、”didn’t cross”、”because”、”tired”……一个一个传下来,信息会逐渐丢失。
我对老婆说:”想象一下,你在玩传话游戏,一个人跟一个人接力传,最后传到最后一个人的时候,可能已经变成另一个样子了。”
她笑着说:”是啊,我们家族群里传消息就是这样。”
这正是 RNN 的问题——句子越长,这个”传话”的链条越长,重要信息就越容易被遗忘或扭曲。句子越长,这个”传话”的链条就越长,重要信息就越容易被遗忘。几十个词的句子,传到最后基本上就”忘了”前面是什么。
那 Transformer 怎么办呢
后来有个大胆的想法:与其让每个词一个一个地”传话”,不如让所有的词同时看到彼此。
我给老婆画了个简单的图(虽然我画得不好):
1 | |
我说:”Transformer 的核心想法就是,当我们要理解’it’的时候,它不需要一个一个地从’A’传信息过来,而是直接’看’所有的词,然后自己决定哪些词对理解’it’最重要。”
这个”自己决定”就叫做注意力机制(Attention)。系统对每个词计算一个权重——”it”最应该注意哪些词。在我们这个例子里,当理解第一句的”it”时,系统会意识到应该多注意”cat”和”tired”;到了第二句,它又会意识到应该注意”rainy”这个形容词。
老婆说:”那这样不是计算量特别大吗?”
我说:”对,这正是 Transformer 的代价。但问题是,你必须要理解长句子和复杂上下文,这个代价就得付。而且后来大家发现,这个代价值得,因为你能处理更长的句子,也能更准确地理解意思。”
这个设计的深层考量
后来我跟她解释,这不只是一个”看”的问题,背后有更深的设计。
注意力机制其实是一个”查询-匹配”过程。当处理”it”时,系统会问”对于理解’it’,哪些词最重要”,然后对所有词做一个打分——比如给”cat”高分,给”the”低分。这个打分是动态的,取决于当前的任务。所以同一个词”it”在不同句子里,会自动关注不同的前置词。
另一个关键点是,Transformer 不是一次性决定的,而是多头的。系统同时用多个”注意力头”来看这个问题——有的头可能专注于”主语和谓语的关系”,有的头专注于”时态和动作”,有的头专注于”修饰词”。这样每个词就能被从多个角度理解,最后再综合这些视角。
还有一个细节是位置编码。因为 Transformer 是同时看所有词,所以它并不自然地知道”哪个词在第三位,哪个词在第八位”。所以系统需要给每个词加上一个位置标记,才能保留词序信息。
老婆问:”这是不是说,Transformer 其实比 RNN 慢?”
我说:”从计算的角度,确实。RNN 一个词一个词处理,计算量是线性的;Transformer 要同时比较所有词对,计算量是平方级的。但关键在于,RNN 虽然快,但它的’记忆’不可靠,越远的词越容易被遗忘,这就限制了它能处理的句子长度。Transformer 虽然慢一点,但它能更稳定地保留所有信息。”
“为什么这么重要呢?” 她追问。
我说:”因为在很多任务里,理解真实需要的不是速度,而是准确度。翻译一句话、写一篇文章、分析一段代码——这些都需要你同时理解前后的信息。RNN 在这些任务上的表现就不够好。”
为什么这打开了大模型时代
在 Transformer 之前,大多数人觉得”用神经网络来做自然语言处理,基本的上限就是这样了”——模型很容易 overfitting,处理长文本的能力差,训练效果不稳定。
但 Transformer 改变了一切。因为它的这个”同时看所有词”的设计,所以:
-
它能处理更长的上下文。虽然理论上存在长度限制(后来大家在这方面也做了不少优化),但比 RNN 长得多。这意味着模型可以理解一整个段落、一整篇文章的连贯性。
-
它可以并行计算。RNN 必须一个词一个词地处理,很难并行化。Transformer 可以同时处理所有词,所以在 GPU 上特别高效。这让大模型的训练成为可能。
-
它的表示能力更强。因为每个词都能”看到”其他所有词,模型学到的表示(representation)就更丰富、更准确。
正是因为这三点,所以当 Transformer 架构出现后,大家发现”如果我拿足够多的数据和计算力来训练一个 Transformer,它能学会做很多事情”。GPT、BERT、这些大模型都是基于这个洞察构建的。
她说:”那现在的 ChatGPT 就是一个特别大的 Transformer?”
我说:”差不多。简化来说,ChatGPT 就是一个特别深、参数特别多的 Transformer,用互联网上几乎所有的文本数据来训练。然后,当你问它一个问题的时候,它利用这个’同时看所有词’的能力,来生成一个回答。”
“那它为什么有时候还是会出错或’忘记’前面的话呢?”
我笑了。”因为即使 Transformer 再聪明,它也有限制。首先是上下文长度——目前的 ChatGPT 能看到的历史消息是有限的,太长的对话它就真的’看不到’了。其次是知识更新——它的训练数据是固定的,所以对最新发生的事情,它可能不知道。还有一个是幻觉问题——有时候模型会非常自信地生成一个听起来合理但其实是错的答案。”
“这些是 Transformer 设计本身的限制吗?”
我说:”有一部分是。但更多时候,这些限制来自于’我们还没有想到更好的办法’。各个研究团队现在都在想办法解决这些问题——有的人在做更长的上下文,有的人在做外部知识检索,有的人在做额外的验证机制。Transformer 本身不是终点,而是一个新的起点。”