序言

我们平时和计算机打交道,很多时候都离不开文本,比如聊天、搜索、问答、写总结。
可是计算机其实并不真正懂“字”的意思,它看到的只是符号和数据。

于是,人们就会想:

能不能让机器像人一样去处理语言,理解一句话在说什么,甚至自己生成一段话?

围绕这个问题,就逐渐形成了一个专门的研究领域,叫做 自然语言处理(NLP)

在 NLP 的发展过程中,人们提出过很多模型来让机器更好地处理文本,比如 RNN、LSTM 和 Transformer

其中,Transformer 可以说是近些年最重要的模型之一
今天的大语言模型,比如 GPT、BERT、ChatGPT,背后都和 Transformer 有非常深的关系。

那么,Transformer 到底是什么?它为什么会出现?又为什么这么重要?
这篇文章我们就从头梳理一遍。


为什么处理文本比想象中更难?

计算机处理文本和处理图片是不一样的。
图片更多是空间上的信息,而文本天然带有顺序

比如下面两句话:

  • 我喜欢你
  • 你喜欢我

它们用到的字几乎一样,但因为顺序不同,表达的意思却完全不一样。
所以,机器在处理文本时,不仅要知道“有哪些词”,还要知道:

  • 这些词出现的顺序
  • 它们之间的上下文关系
  • 哪些词和哪些词联系更紧密

基于这个想法,早期人们提出了 RNN(循环神经网络)


RNN:最早的顺序建模方式

RNN 的核心思路很直观:

按照文本的顺序,一个词一个词地处理,并把前面读到的信息传递给后面。

比如这句话:

我今天去公司上班

RNN 的处理顺序大致就是:

我 → 今天 → 去 → 公司 → 上班

这样一来,模型在处理当前词时,就不再只是孤立地看这个词,而是会结合前面已经读过的内容一起理解。

这种方式让机器第一次真正具备了“按顺序理解文本”的能力,因此在很长一段时间里,RNN 都是自然语言处理中的重要模型。

但是,RNN 也有明显的问题:

  1. 训练速度慢,并行能力差
    因为它必须一个词一个词按顺序处理,后面的计算要等前面的计算结束之后才能开始。
  2. 长距离依赖建模困难
    当句子很长时,前面的一些重要信息在不断传递的过程中可能会逐渐减弱。
  3. 训练时容易出现梯度消失或梯度爆炸
    这也会影响模型对长文本的学习能力。

于是,人们又提出了 LSTM(长短期记忆网络)


LSTM:对 RNN 的改进

LSTM 可以看成是 RNN 的改进版。
它在 RNN 的基础上加入了记忆控制机制,可以决定:

  • 哪些信息需要保留
  • 哪些信息可以遗忘
  • 哪些信息应该传递到后面

因此,相比普通 RNN,LSTM 更擅长处理长文本,也能在一定程度上缓解长距离信息丢失的问题。

但是,LSTM 虽然改进了记忆能力,却没有解决一个根本问题

它仍然是按顺序一个词一个词往后处理的。

这就意味着,它的并行能力依然不强,训练效率依然受限。


为什么会出现 Transformer?

前面我们说到,RNN 让机器第一次能够按顺序处理文本,LSTM 又在 RNN 的基础上增强了记忆能力。
但是,它们始终没有摆脱一个核心限制:

处理方式仍然是串行的。

这会带来两个明显问题。

第一,并行能力差,训练速度慢

因为模型在处理第 2 个词时,要先等第 1 个词处理完;处理第 3 个词时,又要等第 2 个词处理完。
当数据量很大、模型很深的时候,这种串行方式会让训练效率明显下降。

第二,长文本中的远距离关系不容易捕捉

虽然 LSTM 比普通 RNN 更擅长记忆,但当句子特别长时,前面的一些关键信息在不断传递的过程中仍然可能逐渐减弱。
比如一句很长的话里,前面出现的人名、地点或者主语,到后面就不一定还能被准确关联上。

于是,人们开始思考一个新的问题:

我们可不可以不再一个词一个词慢慢传递信息,而是让句子里的每个词直接去看和自己相关的其他词呢?

基于这个想法,Transformer 出现了。

Transformer 最核心的变化是:

不再依赖循环结构,而是把注意力机制(Attention)作为核心计算方式。

需要说明的是,Attention 并不是 Transformer 首次提出的。
Transformer 真正的重要之处在于:

  • 抛弃了 RNN 的循环结构
  • Self-Attention 作为核心
  • 更适合并行训练
  • 更擅长建模长距离依赖

注意力机制到底是什么?

注意力机制可以先简单理解成一句话:

模型在处理一个词的时候,可以同时去关注句子中的其他词,并判断哪些词更重要。

生活里也有点像这样:
老师说了一整句话,当你听到某个词时,你不会只盯着这个词本身,而是会自然地联系前后文,看看它和哪些词最相关。

比如这句话:

小明没去上学,因为他发烧了。

这里的“他”指的是谁?

如果模型只能按顺序一个一个传递信息,理解起来会比较吃力;
但如果用注意力机制,当模型看到“他”这个词时,它就可以去看前面的词:

  • 是“小明”更相关?
  • 还是“上学”更相关?
  • 还是“发烧”更相关?

最后模型会发现,“他”和“小明”的关系最强,于是就更容易理解这句话。

所以,注意力机制最核心的思想就是:

不是平均地看所有词,而是有重点地关注和当前词最相关的内容。

在 Transformer 中,最关键的不是普通的注意力,而是一种作用在同一句子内部的注意力机制,也就是 Self-Attention(自注意力机制)


什么是 Self-Attention?

Self-Attention 可以简单理解成:

一句话里的每个词,在理解自己时,都会去看看这句话里的其他词。

也就是说,模型在处理某个词的时候,不会只盯着这个词本身,而是会结合整句话里和它有关的词,一起理解它的意思。

比如这句话:

我今天在公司开会。

当模型处理“开会”这个词时,它可能会去关注:

  • “我”,表示是谁在开会
  • “今天”,表示什么时候开会
  • “公司”,表示在哪里开会

这样一来,“开会”这个词在模型里的表示,就不再只是“开会”两个字本身,而是带上了整句话里的上下文信息。

所以,自注意力机制本质上可以理解成:

让每个词都能站在全句的角度,重新理解自己。


Self-Attention 到底是怎么计算的?

要理解 Self-Attention,首先要知道它的三个核心概念:

  • Query(查询向量)
  • Key(键向量)
  • Value(值向量)

1. Query、Key、Value 是什么?

Transformer 会把每个词映射成三个向量:

  • Query:我现在想找什么信息
  • Key:我身上有什么特征,适不适合被关注
  • Value:如果你关注我,我能提供什么信息

你也可以这样理解:

  • Query 是“我要找谁”
  • Key 是“我适不适合被你找到”
  • Value 是“如果你找到我,我能给你什么内容”

2. 计算过程是什么?

当模型处理某个词时,会拿这个词的 Query 去和句子中所有词的 Key 做匹配,得到一个相关性分数。

这个分数越高,说明当前词和那个词越相关。
然后,模型会把这些分数归一化,变成权重,再对所有词的 Value 做加权求和,最后得到当前词新的表示。

所以,Self-Attention 的本质就是:

先算“我该关注谁”,再按关注程度把信息加权汇总。

如果用公式表示,就是:

Attention(Q,K,V)=softmax(QKTdk)V\text{Attention}(Q, K, V)=\text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dk QKT)V

这条公式可以拆开理解。

QKTQK^TQKT 是什么?

它用来计算 Query 和 Key 之间的匹配程度,也就是每个词对其他词的关注分数。
在矩阵形式下,它得到的是一个“词与词之间相关性”的分数矩阵。

为什么要除以 dk\sqrt{d_k}dk

这里的 dkd_kdk 表示 Key 向量的维度。
之所以要除以 dk\sqrt{d_k}dk ,是因为如果向量维度太大,点积结果可能会很大,导致 softmax 后的分布过于极端,不利于训练稳定。

softmax 的作用是什么?

softmax 会把相关性分数归一化成一组权重,这些权重加起来等于 1。它表示当前词应该把多少注意力分配给其他词。

最后的 VVV 是什么作用?

最后再用这些权重对所有 Value 做加权组合,得到当前词融合上下文后的新表示。

所以,Self-Attention 的整个过程可以概括成一句话:

算相关性 → 分配权重 → 聚合信息


为什么还需要 Multi-Head Attention?

前面我们讲的 Self-Attention,可以理解成:
每个词都会去看看句子里的其他词,判断谁和自己更相关,然后把这些信息加权汇总起来。

但是,这里会出现一个新的问题:

如果只做一次注意力计算,模型是不是就只能从一个角度去理解句子?

答案是:是的。

一句话里的词和词之间,通常不只存在一种关系。
有的关系是“谁做了什么”,有的关系是“时间和动作的关系”,有的关系是“地点和事件的关系”,还有的关系是“代词指代谁”。

比如这句话:

小明今天在公司给客户发邮件,因为他要确认方案。

当模型看到“他”这个词时,它可能需要同时关注很多不同的信息:

  • “小明”是谁,解决指代关系
  • “今天”表示时间信息
  • “公司”表示地点信息
  • “确认方案”表示动作目的

如果只有一个注意力头,模型一次只能学到一种偏重点;但现实中,一个词往往需要同时从多个角度理解上下文

这就是 Multi-Head Attention(多头注意力机制) 出现的原因。


什么是 Multi-Head Attention?

Multi-Head Attention 可以理解成一句话:

让模型从多个不同角度,同时去看一句话里的关系。

它的本质大致可以分成四步:

  1. 把原来的Q、K、VQ、K、VQKV通过不同的线性变换映射到多组不同的子空间中
  2. 每一组都独立做一次 Self-Attention
  3. 每个头学习不同类型的关系
  4. 最后把这些结果拼接起来,形成更丰富的表示

也就是说,不再只有一个“观察者”在看句子,而是多个“观察者”同时在看。
有的头更关注主语和谓语的关系,有的头更关注时间和地点,有的头更关注代词指代,有的头更关注句法结构。

多头注意力的公式可以写成:

MultiHead(Q,K,V)=Concat(head1,head2,…,headh)WO\text{MultiHead}(Q,K,V)=\text{Concat}(head_1,head_2,\dots,head_h)W^OMultiHead(Q,K,V)=Concat(head1,head2,,headh)WO

多头注意力的结果,等于把第 1 个头、第 2 个头、……、第 hhh个头的结果先拼接起来,再乘一个矩阵做一次线性变换。

其中,每一个头都可以表示为:

headi=Attention(QWiQ,KWiK,VWiV)head_i=\text{Attention}(QW_i^Q,KW_i^K,VW_i^V)headi=Attention(QWiQ,KWiK,VWiV)

iii个头,其实就是做了一次普通的 Attention,只不过它不是直接拿原始的 Q,K,VQ,K,VQ,K,V去算,而是先各自乘上自己这一头专属的参数矩阵,主要就是为了把原始输入投影到不同的子空间里。

  • 每个头都有自己的一套参数矩阵
  • 同一个输入,在不同头里会被投影成不同的表示方式
  • 因此,不同头就能从不同角度学习词与词之间的关系

所以,Multi-Head Attention 的核心价值就在于:

不是只让模型看一次,而是让模型从多个角度同时理解整句话。


Transformer Block 是怎么工作的?

Transformer 并不是把很多零散模块随便拼起来的,它其实是由一个个重复堆叠的标准结构块组成的,这个标准结构块通常就叫做 Transformer Block

一个典型的 Transformer Block 一般包含四个部分:

  1. Multi-Head Self-Attention
  2. Add & Norm(残差连接 + 层归一化)
  3. Feed Forward Network(前馈神经网络)
  4. Add & Norm(残差连接 + 层归一化)

如果把它看成一个处理流程,那么它的节奏就是:

先做上下文信息融合,再做特征提炼。

具体来说:

  • Multi-Head Self-Attention 负责让每个词和整句话里的其他词建立联系,完成信息交互
  • 第一次 Add & Norm 负责保留原始输入,同时让训练更稳定
  • 前馈神经网络 负责对已经融合上下文的信息再做一次更深层的特征加工
  • 第二次 Add & Norm 继续保证信息传递顺畅,并让数值分布保持稳定

所以,一个 Transformer Block 的整体节奏可以概括为:

$ \text{Attention} \rightarrow \text{Add & Norm} \rightarrow \text{FFN} \rightarrow \text{Add & Norm} $

而且这样的 Block 不会只用一层,而是会堆很多层。
随着层数不断增加,模型对句子的理解也会越来越深入。


Transformer 里的几个关键模块

1. 残差连接(Residual Connection)

残差连接可以理解成:

把输入直接“绕一条近路”加到输出上。

某一层在完成计算后,不会只保留新的结果,而是会把原来的输入也一起加回来。
这样做的好处是,模型在学习新信息的时候,不会把旧信息完全丢掉,而是把“原来的内容”和“新学到的内容”结合起来。

通常可以表示为:

y=x+F(x)y = x + F(x)y=x+F(x)

其中:

  • xxx 表示输入
  • F(x)F(x)F(x) 表示这一层学到的新结果
  • x+F(x)x + F(x)x+F(x) 表示把原始信息和新信息加在一起

它的核心作用是:

保留原始信息,让信息传递更顺畅。

2. 层归一化(Layer Normalization)

层归一化的作用是:

把每一层输出的数据调整到更稳定的范围,让后续训练更平稳。

在神经网络训练过程中,不同层输出的数据分布可能变化很大,这会让训练变得不稳定。
层归一化就是用来缓解这个问题的。

你可以先把它理解成一种“数值整理机制”,它主要帮助模型做到:

  • 让每一层输出不要忽大忽小
  • 让后面的网络更容易继续学习
  • 让整体训练过程更稳定

3. 前馈神经网络(Feed Forward Network)

前馈神经网络的作用是:

对每个词已经融合上下文后的表示,再做一次更深入的特征加工。

注意力机制解决的是“词和词之间如何交流信息”,而前馈网络解决的是“交流完之后,如何把信息进一步加工得更好”。

所以它主要负责:

  • 对每个位置的表示单独做非线性变换
  • 提升表达能力
  • 提炼更高层次的特征

Transformer 处理一句话时会经历什么?

从整体流程上看,Transformer 在处理一句话时,大致会经历下面几个步骤。
在这里插入图片描述

1. 先把每个词变成向量

模型不能直接处理文字,所以会先把句子里的每个词转换成数字表示,也就是词向量。

2. 加入位置信息

Self-Attention 很擅长判断“谁和谁相关”,但它本身并不知道词的顺序。
所以 Transformer 会给每个词加入位置编码(Positional Encoding),让模型知道哪个词在前,哪个词在后。

3. 进入 Multi-Head Self-Attention

这一步里,每个词都会去看整句话里的其他词,判断:

  • 谁和我最相关
  • 我应该重点吸收谁的信息

然后把这些信息按权重汇总,得到新的表示。

4. 进行第一次 Add & Norm

注意力计算完成后,模型不会直接进入下一步,而是会先把原始输入和新结果加在一起,再做层归一化。
这样既能保留原始信息,也能让训练更稳定。

5. 进入前馈神经网络

接下来,模型会对已经融合上下文的信息再做一次非线性特征加工,让表示能力更强。

6. 进行第二次 Add & Norm

前馈网络之后,Transformer 会再次执行残差连接和层归一化,保证信息传递顺畅,同时保持训练稳定。

7. 多层重复

上面这一整套流程不会只做一次,而是会一层层堆叠。
随着层数增加,模型对句子的理解会越来越深入,最终就能完成文本理解、翻译、问答和生成等任务。


Encoder 和 Decoder 是什么?

原始的 Transformer 结构其实分成两大部分:

  • Encoder(编码器)
  • Decoder(解码器)

你可以先简单理解成:

  • Encoder 负责理解输入
  • Decoder 负责生成输出

比如在机器翻译任务中:

  • Encoder 会先把输入句子编码成一组带有上下文信息的表示
  • Decoder 再根据这些表示,一步一步生成目标语言

为什么 Decoder 里需要 Mask?

Decoder 在生成文本时,是一个词一个词往后生成的。
这就意味着,模型在生成当前词时,不能提前看到后面的词,否则就等于“作弊”。

所以,Decoder 中的 Self-Attention 会加入一个 Mask(掩码),把未来位置遮住。
这样模型在生成当前词时,只能看到前面的内容,而不能看到未来的信息。

这就是 Masked Self-Attention

它的作用可以概括为:

保证模型在生成当前词时,只能基于已有内容继续往后预测。


Transformer 为什么影响了 GPT 和 BERT?

Transformer 的影响非常大,后来很多经典模型其实都是基于它发展出来的。

其中:

  • BERT 主要使用的是 Transformer 的 Encoder 部分,更擅长做文本理解任务
  • GPT 主要使用的是 Transformer 的 Decoder 部分,更擅长做文本生成任务

所以可以简单理解成:

  • BERT 更像“读懂文本”
  • GPT 更像“持续往下写”

也正因为这样,Transformer 才成为后来大语言模型的重要基础。


Transformer 为什么这么重要?

Transformer 之所以如此重要,主要有几个原因。

  1. 并行能力更强

和 RNN 那种一步一步串行处理不同,Transformer 在训练阶段更适合并行计算,因此效率更高。

  1. 更擅长建模长距离依赖

一个词可以直接和句子中的其他任意词建立联系,不需要像 RNN 那样经过很长的传递路径。

  1. 可扩展性非常强

无论是做翻译、问答、分类,还是做今天的大语言模型,Transformer 都能作为统一底座不断扩展。

  1. 更适合大规模训练

Transformer 能更好地利用大规模数据和大规模参数,这也是它后来能够支撑 GPT、BERT 以及各种大模型的重要原因。

当然,Transformer 也不是没有代价。
由于 Self-Attention 需要计算词与词之间的两两关系,当序列特别长时,计算和显存开销会明显增大。


总结

回过头来看,Transformer 的核心思想其实可以概括成一句话:

不再依赖循环一步一步传递信息,而是让每个词直接和其他词建立联系。

在这个基础上,它通过:

  • Self-Attention
  • Multi-Head Attention
  • 位置编码
  • 前馈神经网络
  • 残差连接
  • 层归一化
  • Encoder / Decoder

构成了一个完整而强大的深度学习架构。

也正因为这样,Transformer 才成为后来 BERT、GPT 以及大语言模型的基础。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐