大模型学习15 - npl自然语言处理16 - Transformer模型API(PyTorch)

1 概述

PyTorch 提供了对 Transformer 的官方实现,该模块封装了完整的编码器-解码器结构,可直接应用于机器翻译、文本生成等典型的序列建模任务。

2 核心类

PyTorch 中的 Transformer 模块由以下几个核心类构成:

  • nn.Transformer
    封装了完整的 Transformer架构,由编码器和解码器组成。作为顶层接口,适用于需要同时使用编码器和解码器的任务,如机器翻译。支持用户通过参数自定义层数、注意力头数、隐藏维度等模型结构。
  • nn.TransformerEncoder
    实现了Transformer编码器结构,由多个编码器层的堆叠而成,用于将输入序列编码为上下文相关的表示。
  • nn.TransformerDecoder
    实现了Transformer解码器结构,由多个解码器层堆叠而成,用于基于编码结果逐步生成目标序列。
  • nn.TransformerEncoderLayer
    实现了单个编码器层结构,包含一个多头自注意力子层和一个前馈神经网络子层,两者均带有残差连接和 LayerNorm。
  • nn.TransformerDecoderLayer
    实现了单个解码器层结构,包含自注意力、编码器-解码器注意力、前馈子层,同样配有残差连接和 LayerNorm。

3 Transformer 构造参数

构造Transformer模型所需参数如下:

python 复制代码
torch.nn.Transformer(d_model=512, 
                     nhead=8, 
                     num_encoder_layers=6, 
                     num_decoder_layers=6, 
                     dim_feedforward=2048, 
                     dropout=0.1, 
                     activation='relu', 
                     custom_encoder=None, 
                     custom_decoder=None, 
                     layer_norm_eps=1e-05, 
                     batch_first=False, 
                     norm_first=False, 
                     bias=True, 
                     device=None, 
                     dtype=None)

各参数含义如下:

3.1 基础核心参数

参数名 默认值 说明
d_model 512 编码器和解码器输入的特征维度,即每个 token 的表示向量长度。
nhead 8 多头注意力中的头数,要求 d_model 能被整除。
num_encoder_layers 6 编码器中堆叠的层数,决定模型深度。
num_decoder_layers 6 解码器中堆叠的层数,结构与编码器相似。
dim_feedforward 2048 前馈神经网络中的隐藏层维度,默认是 d_model 的 4 倍。
dropout 0.1 Dropout 概率,用于缓解过拟合,作用于注意力层和前馈层。
batch_first False 若设为 True,输入和输出张量的维度格式为 (batch_size, seq_len, d_model);否则为 (seq_len, batch_size, d_model)。推荐设为 True。
device None 模型参数所使用的设备,如 'cuda' 或 'cpu'。
dtype None 模型参数的数据类型,如 torch.float32 或 torch.float16。

3.2 高级参数

参数名 默认值 说明
activation 'relu' 编码器/解码器中间层的激活函数,支持字符串('relu' 或 'gelu')或自定义函数。
custom_encoder None 自定义编码器模块。
custom_decoder None 自定义解码器模块。
layer_norm_eps 1e-5 LayerNorm 层中的 epsilon 值,用于防止除零。
norm_first False 若为 True,编码器和解码器层将在注意力或前馈操作之前执行 LayerNorm。
bias True 若为 False,则所有 Linear 和 LayerNorm 层不使用偏置项。

示例代码如下:

python 复制代码
from torch import nn

# 初始化 Transformer
transformer = nn.Transformer(
    d_model=512, 
    nhead=8, 
    num_encoder_layers=6, 
    num_decoder_layers=6, 
    batch_first=True
)

4 Transformer.forward

nn.Transformer 封装了完整的前向传播逻辑,其 forward() 方法定义了编码器解码器的执行流程。

该函数接收 源语言序列 (src_sequence,编码器输入)和目标语言序列 (tgt_sequence,解码器输入)作为输入,以解码器预测结果作为输出。

如下图所示:

示例代码如下:

python 复制代码
output = transformer(
    src=src_emb,
    tgt=tgt_emb,
    src_key_padding_mask=src_pad_mask,
    tgt_key_padding_mask=tgt_pad_mask,
    tgt_mask=tgt_mask,
    memory_key_padding_mask=src_pad_mask
)

假设当前的源序列 和 目标序列为:

则具体的输入和输出内容如下

4.1 输入

  1. batch_size(批次维度,斜向)
    一批里面有多少条样本。

例:batch_size=3,一次性并行处理 3 个句子。

  1. src_len(源序列长度,向下)
    单个句子的 token 数量。
    图中黄色样本句子:我 爱 你,后面跟着 <pad> 填充符。

不同原始句子长短不一,batch 内统一 padding 补齐到相同 src_len,<pad>是空占位符,后面会用padding mask屏蔽掉,不让注意力看到 pad 位置。

  1. d_model(模型维度,向右)
    每一个 token 对应的向量维度,也就是词嵌入向量的长度。Transformer 论文默认d_model=512。

每一个字(我/爱/<pad>)都被表示成一个长度为d_model的向量。

  • src

    源序列的嵌入表示,通常由词向量与位置编码相加得到,作为编码器的输入。其形状为 (batch_size, src_len, d_model)

  • tgt

    目标序列的嵌入表示,通常由词向量与位置编码相加得到,作为解码器的输入。其形状为 (batch_size, tgt_len, d_model)。

  • src_key_padding_mask

    用于编码器中的自注意力机制,用以屏蔽源序列中填充()的位置,防止模型在计算注意力时关注无意义的内容。

    其张量形状为 (batch_size, src_len),其中值为 True 的位置表示应被忽略(即不参与注意力计算)。

  • tgt_key_padding_mask

    用于解码器中的自注意力机制,用以屏蔽目标序列中填充()的位置,防止模型在计算注意力时关注无意义的内容。其张量形状为 (batch_size, tgt_len),其中值为 True 的位置表示应被忽略(即不参与注意力计算)。

  • tgt_mask

    用于解码器的自注意力机制,常用于训练阶段的自回归任务,防止模型关注当前位置之后的 token,避免信息泄露。是一个形状为 (tgt_len, tgt_len) 的上三角矩阵,类型为 float,遮挡位置为 -inf,其余为 0。也支持 bool 类型(True 表示遮挡),内部会自动转换为加性掩码。

  • memory_key_padding_mask

    用于解码器的交叉注意力机制,屏蔽编码器输出中的 位置,防止解码器关注源序列中的无效 token。形状为 (batch_size, src_len),值为 True 的位置将被忽略。通常与 src_key_padding_mask 相同。

4.2 输出

output

解码器输出的隐藏状态序列,形状为 (batch_size, tgt_len, d_model)。表示目标序列中每个位置的上下文表示,通常会送入线性层和 softmax,用于生成词表上的预测概率。

5 Transformer.encoder

nn.Transformer 模块中包含一个编码器部分,可通过属性 transformer.encoder 访问,其本质是一个 nn.TransformerEncoder 实例。通过其 forward 方法,可以对源序列进行编码,提取上下文相关的语义表示。

如下图所示:

示例代码如下:

python 复制代码
from torch import nn

# 初始化 Transformer
transformer = nn.Transformer(
    d_model=512, nhead=8,
    num_encoder_layers=6, num_decoder_layers=6,
    batch_first=True
)

# 调用编码器
memory = transformer.encoder(
    src=src_emb, 
    src_key_padding_mask=src_pad_mask
)

假如源序列为:

5.1 输入

batch_size(批次维度,斜向)

一批里面有多少条样本。

src_len(源序列长度,向下)

单个句子的 token 数量。

图中黄色样本句子:我 爱 你,后面跟着 <pad> 填充符。

d_model(模型维度,向右)

每一个 token 对应的向量维度,也就是词嵌入向量的长度。Transformer 论文默认d_model=512。

  • src
    源序列的嵌入表示,通常由词向量与位置编码相加得到,作为编码器的输入。其形状为 (batch_size, src_len, d_model)
  • src_key_padding_mask
    用于编码器中的自注意力机制,用以屏蔽源序列中填充()的位置,防止模型在计算注意力时关注无意义的内容。其张量形状为 (batch_size, src_len),其中值为 True 的位置表示应被忽略(即不参与注意力计算)。

5.2 输出

memory

编码器的输出表示,包含每个 token 的上下文语义信息,作为解码器的输入。其形状为 (batch_size, src_len, d_model)。

6 Transformer.decoder

nn.Transformer 模块中包含一个解码器部分,可通过属性 transformer.decoder 访问,其本质是一个 nn.TransformerDecoder 实例。通过其 forward 方法,可以基于编码器的输出(memory)和目标序列的嵌入表示,逐步生成目标序列中的各个 token。

如下图所示:

示例代码如下:

python 复制代码
from torch import nn

# 初始化 Transformer
transformer = nn.Transformer(
    d_model=512, nhead=8,
    num_encoder_layers=6, num_decoder_layers=6,
    batch_first=True
)

# 调用编码器
memory = transformer.encoder(
    src=src_emb, 
    src_key_padding_mask=src_pad_mask
)

# 调用解码器(逐步生成)
output = transformer.decoder(
    tgt=tgt_emb,
    memory=memory,
    tgt_mask=tgt_mask,
    tgt_key_padding_mask=tgt_pad_mask,
    memory_key_padding_mask=src_pad_mask
)

若源序列和目标序列为:

则具体输出输出为:

6.1 输入

  • tgt
    目标序列的嵌入表示,通常由词向量与位置编码相加得到,作为解码器的输入。其形状为 (batch_size, tgt_len, d_model)。
  • memory
    编码器的输出表示,包含源序列每个 token 的上下文语义信息,作为解码器的输入。其形状为 (batch_size, src_len, d_model)。
  • tgt_mask
    用于解码器的自注意力机制,常用于训练阶段的自回归任务,防止模型关注当前位置之后的 token,避免信息泄露。是一个形状为 (tgt_len, tgt_len) 的上三角矩阵,类型为 float,遮挡位置为 -inf,其余为 0。也支持 bool 类型(True 表示遮挡),内部会自动转换为加性掩码。
  • tgt_key_padding_mask
    用于解码器中的自注意力机制,用以屏蔽源序列中填充()的位置,防止模型在计算注意力时关注无意义的内容。其张量形状为 (batch_size, tgt_len),其中值为 True 的位置表示应被忽略(即不参与注意力计算)。
  • memory_key_padding_mask
    用于解码器的交叉注意力机制,屏蔽编码器输出中的 位置,防止解码器关注源序列中的无效 token。形状为 (batch_size, src_len),值为 True 的位置将被忽略。通常与 src_key_padding_mask 相同。

6.2 输出

output

解码器输出的隐藏状态序列,形状为 (batch_size, tgt_len, d_model)。表示目标序列中每个位置的上下文表示,通常会送入线性层和 softmax,用于生成词表上的预测概率。

相关推荐
for_ever_love__1 小时前
LangChain 效果评测:没有评测,优化就是在瞎调
人工智能·学习·langchain·rag·评估·langsmith·评测指标
Martina_03211 小时前
一张地图怎么生成可编辑3D地形?用6步检查高度图、道路约束与Mesh导出
图像处理·人工智能·平面·3d·ai·自然语言处理·游戏策划
li星野1 小时前
Subject–Verb Agreement — One-Page Notes
学习
老唐7771 小时前
(附代码)使用OpenCV和关键点检测计算瓶子角度
人工智能·深度学习·opencv·目标检测·计算机视觉·ai·transformer
辣知2 小时前
辣知·化智81 儒释道中国人独有的智慧
学习
Mabnus2 小时前
补体级联放大启动酶C2
学习
67X2 小时前
【CISC7021】Build a Toy Llama-2 Language Model
人工智能·语言模型·自然语言处理
Xudde.2 小时前
Billu: box 靶机渗透测试(Vulnhub Writeup)
笔记·学习·安全·web安全
qq_284274052 小时前
信号分析·傅里叶级数与频谱(单边谱·双边谱·傅里叶变换)CSDN发布稿
笔记·学习·信号处理·傅里叶分析