transformer架构以及与RNN的对比

一、背景概述

今天简要介绍一下transformer架构,其实在transformer出来之前呢,更流行的是RNN循环神经网络。但是为什么RNN会被取代呢?这离不开RNN结构上造成的致命缺点。

一是,RNN是"线性"传递"知识"的,也就是说在RNN里是从左到右(正向)地进行推理,第 N 步必须等第 N-1 步计算完才能开始,无法利用 GPU 的并行计算能力,导致模型训练速度极其缓慢。

二是,我们知道RNN某个时间步的输出不仅取决于当前时间的输入还取决于上一个时间步的输入状态(上文)。但是因为距离越长的话,后面的对前面"知识"的学习能力越弱。

这个问题对于RNN的结构几乎是无解的。那么如何解决?Google 在论文《Attention is All You Need》里提出了 Transformer。transformer应运而生,它抛弃了循环结构,专注self attention自注意力。这个机制简单来说就是让序列中的每个 token 都能直接关注 序列中任意其他位置的 token,计算出这个token和其他位置的相关程度,然后根据关联性加权聚合其他位置的信息。

二、详细组件

1.1Multi-Head Attention (多头注意力)

这是 Self-Attention 的升级版,是 Transformer 最经典的改进之一。

  • 原理:它不是只用一组 Q,K,V 去计算注意力,而是将输入投影到多个不同的子空间(即多个"头"),每个头独立计算注意力,最后拼接起来。
  • 厉害之处:捕捉多维度的语义关系。

这就好比让模型同时拥有多双眼睛,每双眼睛看不同的细节,最后汇总成一个全面的理解。你可以把它理解成一个记忆库。

1.2Positional Encoding (位置编码)

Transformer 是并行处理的,不像 RNN 那样按顺序处理,因此它天然没有顺序概念。

  • 原理:在输入序列中加入正弦/余弦函数生成的向量(或可学习的嵌入向量),告诉模型每个词在句子中的位置。
  • 厉害之处:赋予模型理解词顺序的能力。

没有它,"猫追狗"和"狗追猫"会被模型视为完全相同的集合。位置编码让模型知道"猫"在前,"狗"在后,从而区分动作的方向。

1.3前馈神经网络(FFN)

FFN:通常由两层全连接层组成(中间有一个非线性激活函数,如 ReLU 或 GELU)。它的作用是对注意力提取的特征进行非线性变换和特征增强,相当于一个独立的"特征处理器"。

Layer Norm:对每一层的输出进行标准化。

厉害之处: 解决梯度消失问题,加速收敛,稳定训练。如果没有 Layer Norm,深层网络很难训练。

FFN 配合残差连接(Residual Connection),使得模型可以堆叠得非常深(如 LLM 有几十上百层),而不会导致性能退化。

1.4 Residual Connections (残差连接)

厉害之处:允许信息无损流动,构建超深网络。

它解决了"深度网络退化"问题,让模型可以轻易堆叠到 6 层、12 层甚至 96 层以上,这对于大语言模型(LLM)的学习能力至关重要。

1.5 Masked Self-Attention (掩码自注意力)

在 Encoder-Decoder 架构(如翻译任务)或 Decoder-only 架构(如 GPT)中非常关键。

原理:在计算注意力时,强制模型只能看到当前位置之前的词,不能看到未来的词。

这使得模型可以进行自回归生成(Next Token Prediction),即像人类说话一样,根据上文预测下文,而不是"偷看"答案。这是 GPT 系列模型能够写文章、写代码的基础。

三、原理与亮点

1.1原理区别

想象你在读一句话:"因为他很饿,所以他去吃了饭。"

  • 传统方法(RNN):读到第二个"他"时,必须通过长长的链条一步步回溯到第一个"他",信息容易丢失(梯度消失)。
  • 自注意力机制:当处理第二个"他"时,模型可以直接"看"到第一个"他",并计算两者之间的关联强度。无论它们相距多远,都能瞬间建立联系。

1.2注意力如何计算

每个输入的词(Token)都会被映射成三个向量:

Query (Q):查询向量。代表当前词"想要寻找什么"。

Key (K):键向量。代表当前词"能被什么匹配"。

Value (V):值向量。代表当前词实际包含的"内容信息"。

这三个向量是怎么得到的呢?是输入的x经过embedding层后,分别与W_Q 、W_K、 W_V矩阵运算得到。

复制代码
# 假设输入 X 是 (序列长度 N, embedding 维度 d_model)
# W_Q, W_K, W_V 都是可训练参数矩阵,形状 (d_model, d_k)

Q = X @ W_Q     # 形状 (N, d_k),每个 token 都有自己的 Query 向量
K = X @ W_K     # 形状 (N, d_k),每个 token 都有自己的 Key 向量
V = X @ W_V     # 形状 (N, d_v),每个 token 都有自己的 Value 向量

那么这里a哥有个问题想问看到这里的读者们,既然Q、K、V都是一个输入x"产生"的,为什么不直接让三个都等于输入x呢?其实这里包含这"自注意力"的含义以及调教模型的细节:自己注意自己就决定了三个QKV都是来自同一个x,输入x既是提问者,也是被查询者,还是提供答案者。这里a哥给一个好记的口诀:它的 Query代表:"我想找什么信息?"Key 代表:"我有什么特征可以被匹配?"Value 代表:"我实际包含的内容是什么?"我们需要用当前的词(Query)去"询问"整个句子中的其他词(Keys),并从中提取相关信息(Values)。接着回答为什么需要将x与三个矩阵相乘。如果不这样处理模型就没法学到「该从什么角度提问」「该用什么标签匹配」「该返回什么内容」这种细致的差异。

就像是把x投影到三维的x轴y轴z轴,将它们分为三个部分则是为了解耦"查找"、"匹配"和"获取"这三个步骤。

1.3注意力公式:

复制代码
softmax(Q · K^T / √d_k) · V

四、三种架构

有Encoder-only、Decoder-only 和 Encoder-Decoder 三种架构。

下面分别简单介绍:

  • Encoder-only(以 BERT 为代表):每个 token 可以双向关注序列中所有其他 token(没有掩码遮蔽)。这种双向理解能力让 Encoder 非常擅长理解任务,比如文本分类、语义相似度计算。预训练任务是 MLM(掩码语言模型)和NSP。

  • Decoder-only(以 GPT等为代表):使用掩码,每个 token 只能关注它前面的 token,不能提前看到后面的内容。这种单向设计天然适合文本生成,预训练任务是预测下一个 token。

  • Encoder-Decoder(以 T5、BART 为代表):Encoder 双向理解输入,Decoder 单向生成输出。Decoder 通过 Cross-Attention 读取 Encoder 的输出。后面会介绍在self-Attention上提升的Cross-Attention。

那么留个疑问,现在市面上的大模型大多是上面三种的哪个架构呢?为什么?