一. Transformer的整体架构

在开始之前,我要给大家分享一份非常详细的入门学习路线思维导图,学习顺序、怎么学、看什么、要注意什么都写的非常清楚大家如果需要的话,可以添加我的小助手,让她把配套资料一起无偿分享给大家。

Transformer由Encoder (编码器)和Decoder (解码器)两个部分组成,Encoder和Decoder都包含6个block(块)。Transformer的工作流程大体如下:

第一步:获取输入句子的每一个单词的表示向量X,X由单词本身的Embedding(Embedding就是从原始数据提取出来的特征(Feature)) 和单词位置的Embedding相加得到。

第二步:将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示x)传入Encoder中,经过6个Encoder block (编码器块)后可以得到句子所有单词的编码信息矩阵C。如下图,单词向量矩阵用

X_{n\times d}

表示, n是句子中单词个数,d是表示向量的维度(论文中d=512)。每一个Encoder block (编码器块)输出的矩阵维度与输入完全一致。

第三步:将Encoder (编码器)输出的编码信息矩阵C传递到Decoder(解码器)中,Decoder(解码器) 依次会根据当前翻译过的单词1~i翻译下一个单词i+1,如下图所示。在使用的过程中,翻译到单词i+1的时候需要通过Mask (掩盖) 操作遮盖住i+1之后的单词。

上图Decoder接收了Encoder的编码矩阵C,然后首先输入一个翻译开始符"<Begin>",预测第一个单词"I";然后输入翻译开始符"<Begin>"和单词"I",预测单词"have",以此类推。

二. Transformer 的输入

Transformer中单词的输入表示x由单词本身的Embedding和单词位置Embedding(Positional Encoding)相加得到。

2.1 单词 Embedding(词嵌入层)

单词本身的Embedding有很多种方式可以获取,例如可以采用Word2Vec、Glove等算法预训练得到,也可以在Transformer中训练得到。

self.embedding = nn.Embedding(vocabulary, dim)

功能解释:

  • 作用:将离散的整数索引(单词ID)转换为连续的向量表示

  • 输入:形状为 [sequence_length] 的整数张量

  • 输出:形状为 [sequence_length, dim] 的浮点数张量(,n是序列长度,d是特征维度)

工作原理:

  • 创建一个可学习的嵌入矩阵[vocabulary, dim],例如当vocabulary=10000, dim=512时,是一个10000×512的矩阵;

  • 每个整数索引对应矩阵中的一行:

# 假设单词"apple"的ID=42apple_vector = embedding_matrix[42]  # 形状 [512]

在Transformer中的具体作用:

# 输入:src = torch.randint(0, 10000, (2, 10))# 形状:[batch_size=2, seq_len=10]src_embedded = self.embedding(src)# 输出形状变为:[2, 10, 512]# 每个整数单词ID被替换为512维的向量

可视化表现:​​​​​​​

原始输入 (单词ID):[ [ 25,  198, 3000, ... ],   # 句子1  [ 1,   42,  999,  ... ] ]  # 句子2经过嵌入层后 (向量表示):[ [ [0.2, -0.5, ..., 1.3],   # ID=25的向量    [0.8, 0.1, ..., -0.9],   # ID=198的向量    ... ],  [ [0.9, -0.2, ..., 0.4],   # ID=1的向量    [0.3, 0.7, ..., -1.2],   # ID=42的向量    ... ] ]

为什么需要词嵌入:

  • 语义表示:相似的单词会有相似的向量表示

  • 降维:将离散的ID映射到连续空间(one-hot编码需要10000维 → 嵌入只需512维)

  • 可学习:在训练过程中,这些向量会不断调整以更好地表示语义关系

2.2  位置 Embedding(位置编码)

Transformer的位置编码(Positional Encoding,PE)是模型的关键创新之一,它解决了传统序列模型(如RNN)固有的顺序处理问题。Transformer的自注意力机制本身不具备感知序列位置的能力,位置编码通过向输入嵌入添加位置信息,使模型能够理解序列中元素的顺序关系。位置编码计算之后的输出维度和词嵌入层相同,均为(

X_{n\times d}

)。

位置编码的核心作用:

  1. 注入位置信息:让模型区分不同位置的相同单词(如 "bank" 在句首vs句尾)

  2. 保持距离关系:编码相对位置和绝对位置信息

  3. 支持并行计算:避免像RNN那样依赖顺序处理

为什么需要位置编码?

  • 自注意力的位置不变性:

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

,计算过程不包含位置信息

  • 序列顺序的重要性:

  • 自然语言:"猫追狗" ≠ "狗追猫"

  • 时序数据:股价序列的顺序决定趋势替代方案对比

位置编码的实际效果

  1. 早期层作用:帮助模型建立位置感知

  2. 后期层作用:位置信息被融合到语义表示中

  3. 可视化示例

Input:    [The,   cat,   sat,   on,   mat]Embed:    [E_The, E_cat, E_sat, E_on, E_mat]Position: [P0,    P1,    P2,    P3,   P4]Final: [E_The+P0, E_cat+P1, ... E_mat+P4]

(1)正余弦位置编码(论文采用)

正余弦位置编码的计算公式:

其中:

  •  `pos` 是token在序列中的位置(从0开始)

  •  `d_model` 是模型的嵌入维度(即每个token的向量维度)

  •  `i` 是维度的索引(从0到d_model/2-1)

特点:

  • 波长几何级数:覆盖不同频率

  • 相对位置可学习:位置偏移的线性变换PE_{pos+k}可表示为PE_{pos}的线性函数

  • 泛化性强:可处理比训练时更长的序列

  • 对称性:sin/cos组合允许模型学习相对位置

代码实现:​​​​​​​

class PositionalEncoding(nn.Module):    # Sine-cosine positional coding    def __init__(self, emb_dim, max_len, freq=10000.0):        super(PositionalEncoding, self).__init__()        assert emb_dim > 0 and max_len > 0, 'emb_dim and max_len must be positive'        self.emb_dim = emb_dim        self.max_len = max_len        self.pe = torch.zeros(max_len, emb_dim)        pos = torch.arange(0, max_len).unsqueeze(1)        # pos: [max_len, 1]        div = torch.pow(freq, torch.arange(0, emb_dim, 2) / emb_dim)        # div: [ceil(emb_dim / 2)]        self.pe[:, 0::2] = torch.sin(pos / div)        # torch.sin(pos / div): [max_len, ceil(emb_dim / 2)]        self.pe[:, 1::2] = torch.cos(pos / (div if emb_dim % 2 == 0 else div[:-1]))        # torch.cos(pos / div): [max_len, floor(emb_dim / 2)]    def forward(self, x, len=None):        if len is None:            len = x.size(-2)        return x + self.pe[:len, :]

三. Self-Attention(自注意力机制)和Multi-Head Attention(多头自注意力)

Transformer的内部结构图,左侧为Encoder block(编码器),右侧为Decoder block(解码器)。可以看到:

(1)Encoder block包含一个Multi-Head Attention;

(2)Decoder block包含两个Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention上方还包括一个Add&Norm层,Add表示残差连接(Residual Connection),用于防止网络退化,Norm表Layer Normalization,用于对每一层的激活值进行归一化。

Multi-Head Attention是Transformer的重点,它由Self-Attention演变而来,我们先从 Self-Attention 讲起。

3.1  Self-Attention(自注意力机制)

Self-Attention(自注意力)是Transformer架构的核心创新,它彻底改变了序列建模的方式。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,self-attention能够直接捕捉序列中任意两个元素之间的关系,无论它们之间的距离有多远:

​​​​​​​

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐